为啥“transform-es2015-modules-commonjs”在 Babel 6 中添加了“use strict”?
Posted
技术标签:
【中文标题】为啥“transform-es2015-modules-commonjs”在 Babel 6 中添加了“use strict”?【英文标题】:Why does "transform-es2015-modules-commonjs" add "use strict" in Babel 6?为什么“transform-es2015-modules-commonjs”在 Babel 6 中添加了“use strict”? 【发布时间】:2016-03-25 19:51:10 【问题描述】:使用 Babel 6,我正在尝试不在我的编译代码中包含 "use strict"
。
我发现添加它的是 "transform-es2015-modules-commonjs" plugin(在 "es2015" preset 中)。
在the source-code 中似乎是inherit "babel-plugin-transform-strict-mode"
,如果我删除它,它仍然可以正常工作,即它将import "…"
编译成require(…)
而不添加“use strict”。
那么为什么“transform-es2015-modules-commonjs”强制严格模式呢?
【问题讨论】:
【参考方案1】:在 ES6 规范中,有两种模式可以处理文件:
作为一个“脚本”,它通常是我们在标准 JS 环境中习惯的一切
不允许使用 ES6 模块语法,并且出于向后兼容的原因,内容仅在具有 "use strict";
前缀指令时才被视为严格。
作为“模块”
允许使用 ES6 模块语法,所有代码在所有情况下都自动为严格模式。
因为 ES6 模块语法与模块或脚本相关,如果是“模块”,则自动严格,Babel 使用 transform-es2015-modules-commonjs
的存在同时启用两种转换。
即使您只启用模块转换本身并排除严格模式,您编写的所有代码在技术上都是无效的,并且一旦您尝试在真正的 ES6 模块环境中使用您的 ES6 代码,是否严格不管你喜不喜欢。
如果您不希望您的代码严格,我建议禁用 transform-es2015-modules-commonjs
转换并使用 CommonJS 模块,因为它们没有严格模式要求。
【讨论】:
以上是关于为啥“transform-es2015-modules-commonjs”在 Babel 6 中添加了“use strict”?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?