babel 这东西真的很难用,需要配置的地方很多。比如 @babel/plugin-transform-runtime 要专门进行配置,babel 默认是用内联的辅助函数(inline Babel helpers)。而且经常配不成功,这不,又出问题了。
我们看代码:
function includes(target, wanted) {
for(const element of target) if(wanted === element) return true;
return false;
}
期望编译后:
import _createForOfIteratorHelperLoose from "@babel/runtime/helpers/esm/createForOfIteratorHelperLoose";
function includes(target, wanted) {
for (
var _iterator = _createForOfIteratorHelperLoose(target), _step;
!(_step = _iterator()).done;
) {
var element = _step.value;
if (wanted === element) return true;
}
return false;
}
实际编译后:
function _createForOfIteratorHelperLoose(){
//......
}
function includes(target, wanted) {
for (
var _iterator = _createForOfIteratorHelperLoose(target), _step;
!(_step = _iterator()).done;
) {
var element = _step.value;
if (wanted === element) return true;
}
return false;
}
发现没有效果。
你们帮我看看我的配置有没有问题
{
plugins: [
["@babel/plugin-transform-runtime", {
absoluteRuntime: false,
corejs: false,
helpers: true,
regenerator: true,
useESModules: true
}],
]
}
检查了许久,查看了很多资料,都没有发现问题。
最后发现:
是_createForOfIteratorHelperLoose 这个 helper 函数默认配置不走 @babel/plugin-transform-runtime。别的 helper 函数正常。
调试 @babel/plugin-transform-runtime 的源代码。
发现 176 这个 if 在_createForOfIteratorHelperLoose 和别的 helper 函数不同。
进入一看,这是一个版本号校验函数
原来,是没有配置 version 造成的。
version 需要根据你安装的 @babel/runtime 版本进行配置,@babel/plugin-transform-runtime 不会自动获取,@babel/plugin-transform-runtime 默认你安装的是 7.0.0。
修改后
var babelRuntimePath = require.resolve("@babel/runtime/package.json", {
paths: [process.cwd()]
});
var babelRuntimePackage = require(babelRuntimePath);
var babelRuntimeVersion = babelRuntimePackage.version;
["@babel/plugin-transform-runtime", {
absoluteRuntime: false,
corejs: false,
helpers: true,
regenerator: true,
useESModules: true,
version: babelRuntimeVersion
}],