偶然发现 babel@6 + babel-preset-es2015 的 bug
这两天尝试做一套解决方案,能够只编译一套 ES2015+ 代码,在现代浏览器就正常使用,在 IE11 自动切换到 babel-standalone 实时编译。
然后偶然发现 babel@6 的一个 bug,如下:
class T {
foo() {
const {hasOn: o} = (() => {
for (let e = 0; e < 1; e++) {
if (o = 1, 2 >= o) return null;
}
var o;
})() || {};
}
}
t = new T();
t.foo();
上面这段代码其实是符合语法的。看起来,L3 使用 const 声明了变量 o,然后在 L5 又再次试图给它赋值,似乎有修改常量之嫌。但其实,因为 L5 在另外一个块域里,而且 L7 var o; 会产生变量提升,所以这个赋值操作的是 var o 声明的局部变量。
如果你把它放在 V8 里,比如 node.js 或者 Chrome 浏览器,它就能正常执行;如果你用 babel@6 + babel-preset-es2015 转译,就会报错,说 o is read only。
产生这个错误的原因是 babel-plugin-transform-es2015-classes 解析上面这段代码时存在错误,导致 babel-plugin-check-es2015-constants 认为常量被修改。不过我也只查到这一步,暂时不知道怎么修复这个 bug,也不知道怎么在 babel@7 里检查这个问题。有兴趣的同学可以试一下。
相关文章
复盘近期升级工具链的过程
公司希望我提升产品在移动端的体验,于是我就打开了 Lighthouse,然后看了眼代码,发现有几个问题: 移动 […]
2021-12-196 分钟
初试 SWC(Speedy Web Compiler)
SWC 是一个用 Rust 写的编译工具,功能跟 babel 很类似。它的优势在于速度,按照官网所说,在单核上 […]
2021-12-115 分钟
babel@6 升级到 babel@7,兼容性代码膨胀的原因
最近尝试把厂里项目的依赖从 babel@6 升级到 babel@7,发现打包之后体积大了很多。于是打开 web […]
2021-11-163 分钟


