因为 ESM 模块规范中,对 with 语法是不支持的,所以,对老的模块中用到 with 的代码进行转换。

使用 babel-plugin-transform-with 插件进行转换,原理是对 with 代码块中的方法、变量进行检测,如果是局部变量(Scope.contextVariables),则跳过,如果不是,则有可能是 with 中的方法或变量,则进行转换。

  • npm init -y 初始化项目
  • npm i babel-plugin-transform-with babel-cli -D 安装依赖
  • touch index.mjs 新建文件
var a = {b: '1'}
with(a) {
    var c = b;
}
  • npx babel index.mjs 转换
var a = { b: '1' };

(function (b) {
    var c = b;
})('b' in a ? a.b : typeof b !== "undefined" ? b : undefined);