为什么 "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规范中,有两种处理文件的模式:
作为“脚本”,通常是我们在标准 JS 环境中习惯的一切
不允许使用 ES6 模块语法,并且出于向后兼容的原因,仅当内容具有前缀指令 "use strict";
.
时才会被视为严格内容
作为“模块”
允许使用 ES6 模块语法,所有代码在所有情况下都自动为严格模式。
因为 ES6 模块语法与某物是模块还是脚本有关,如果某物是“模块”,它会自动严格,Babel 使用 transform-es2015-modules-commonjs
的存在来启用这两种转换同时。
即使您只启用模块转换本身并排除严格模式,您编写的所有代码在技术上都是无效的,一旦您尝试在真实的 ES6 模块环境中使用您的 ES6 代码,它就会是喜欢不喜欢都严格
如果您不希望您的代码严格,我建议禁用 transform-es2015-modules-commonjs
转换并使用 CommonJS 模块,因为它们没有严格模式要求。
使用 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规范中,有两种处理文件的模式:
作为“脚本”,通常是我们在标准 JS 环境中习惯的一切
不允许使用 ES6 模块语法,并且出于向后兼容的原因,仅当内容具有前缀指令
时才会被视为严格内容"use strict";
.作为“模块”
允许使用 ES6 模块语法,所有代码在所有情况下都自动为严格模式。
因为 ES6 模块语法与某物是模块还是脚本有关,如果某物是“模块”,它会自动严格,Babel 使用 transform-es2015-modules-commonjs
的存在来启用这两种转换同时。
即使您只启用模块转换本身并排除严格模式,您编写的所有代码在技术上都是无效的,一旦您尝试在真实的 ES6 模块环境中使用您的 ES6 代码,它就会是喜欢不喜欢都严格
如果您不希望您的代码严格,我建议禁用 transform-es2015-modules-commonjs
转换并使用 CommonJS 模块,因为它们没有严格模式要求。