为什么 "transform-es2015-modules-commonjs" 在 Babel 6 中添加 "use strict"?

Why does "transform-es2015-modules-commonjs" add "use strict" in Babel 6?

使用 Babel 6,我正在尝试 而不是 在我的编译代码中包含 "use strict"

我发现是 "transform-es2015-modules-commonjs" plugin (in "es2015" preset) 添加了它。

the source-code 中它似乎是 inherit "babel-plugin-transform-strict-mode",如果我删除它,它仍然可以正常工作,即它将 import "…" 编译成 require(…) 而不添加 "use strict".

那么为什么 "transform-es2015-modules-commonjs" 强制 严格模式?

在ES6规范中,有两种处理文件的模式:

  1. 作为“脚本”,通常是我们在标准 JS 环境中习惯的一切

    不允许使用 ES6 模块语法,并且出于向后兼容的原因,仅当内容具有前缀指令 "use strict";.

    时才会被视为严格内容
  2. 作为“模块”

    允许使用 ES6 模块语法,所有代码在所有情况下都自动为严格模式。

因为 ES6 模块语法与某物是模块还是脚本有关,如果某物是“模块”,它会自动严格,Babel 使用 transform-es2015-modules-commonjs 的存在来启用这两种转换同时。

即使您只启用模块转换本身并排除严格模式,您编写的所有代码在技术上都是无效的,一旦您尝试在真实的 ES6 模块环境中使用您的 ES6 代码,它就会是喜欢不喜欢都严格

如果您不希望您的代码严格,我建议禁用 transform-es2015-modules-commonjs 转换并使用 CommonJS 模块,因为它们没有严格模式要求。