为什么@babel/plugin-transform-runtime没效果

463 阅读1分钟

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
}],