为啥“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,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?