关于javascript:记一次debug过程

对集体debug的一次回顾,没啥干货

背景

前几天部门来了个新人,接手了一个我没参加过的老我的项目,我的项目么就是一个一般的vue脚手架起的我的项目,然而装完依赖后却跑不起来,便求助于我。

开始

先看下报错信息:

error in ./node_modules/vconsole/dist/vconsole.min.js

Module parse failed: Unexpected token (10:79312).You may need an appropriate loader to handle this file type.

看到报错信息我直观的认为是webpack配置问题,间接就开始google大法了,简略的搜寻和尝试之后无果,且本身对webpack也不甚相熟。

随后换了一个方向:因为是老我的项目,代码有一段时间没有改过了,为何忽然跑不起来? 报错的是vconsole,是不是它出了问题?

手动装置了老板本,无报错。根本锁定是新版本的问题,查看vconsolepackage.json历史commit,新版引入了新依赖copy-text-to-clipboard以及一些babel插件更新。 看了下copy-text-to-clipboard源码,就一个js文件,没发现有啥非凡。

折腾了一番后陷入了僵局。。。

随后抱着尝试的心态在报错文件中去定位具体代码(失常状况下这一步应该第一工夫去做,然而这是一个压缩后的js文件,直觉通知我看了也没用…),发现报错的代码相似:

try{}catch{}

嗯?catch前面未携带参数? 搜了下发现是es2019的提案,babel7曾经反对。而公司的我的项目用的是babel6+

哦~原来如此!接下来就简略了,有2种解决形式:

  1. 降级vconsole,毕竟新版没有什么我特地想要的性能
  2. 降级我的项目的babel依赖,看了下Babel降级文档,有一些望而生畏…

那就用办法1吧。呵!又一个“难题”被我解决了,又是干燥的一天(狗头

….

不对!vconsole.min.js曾经通过一次打包了,为什么还会呈现如此“高级”的代码?vconsole我的项目用的也正是babel7+

克隆一波源码,本地编译了一下。发现打出的包与npm上的统一(废话)

而依据.babelrc文件可知,我的项目用的是@babel/preset-env,文档上也说@babel/preset-env曾经蕴含了@babel/plugin-proposal-optional-catch-binding。通过Babel在线验证了一波,编译出的代码的确合乎预期:

// before
try {} catch{}

// after
try {} catch (_unused) {}

一番尝试摸索后发现,间接在webpack中配置babel-loader相干options是有成果的,而批改.babelrc则有效。也的确有搜到有人说babelrc文件配置有效,兴许是babel的bug?

随后便棘手给vconsole提了一个PR。实质就是加载.babelrc文件,解析成js对象,最初手动将该对象作为babel-loader的options。PR很快失去了回复以及合并。

事件到这里差不多就完结了。然而.babelrc无用这个问题让我感到很不解,Babel那么大的大哥,会呈现这种问题吗?

又翻了翻Babel文档,才发现不是babelrc无用,是用!错!了!(捂脸

细节能够看文档,简略来说就是babel.config.json对应我的项目级别的配置;.babelrc对应文件级别,且须要配置filename能力起作用。

所以正确又优雅的批改形式应该是间接将.babelrc文件重命名为babel.config.json

完。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理