如何删除 babel 添加的全局“use strict”

How to remove global "use strict" added by babel

提问人:ani h 提问时间:11/20/2015 更新时间:6/28/2022 访问量:59347

问:

我使用的是“使用严格”的函数形式,并且不想要 Babel 在转译后添加的全局形式。问题是我正在使用一些不使用“使用严格”模式的库,它可能会在连接脚本后引发错误

javascript jshint babeljs use-strict

评论

0赞 T.J. Crowder 11/20/2015
您使用的是哪个版本的 Babel?你如何使用 Babel?
1赞 ani h 11/20/2015
巴别塔 6.他们删除了 Babel 6 中的黑名单选项。
1赞 Félix Paradis 8/1/2019
巴别塔 7 stackoverflow.com/questions/52827968/...

答:

28赞 T.J. Crowder 11/20/2015 #1

巴别塔 5

你会被列入黑名单。例如,下面是 Gruntfile 中的一个示例:"useStrict"

babel: {
    options: {
        blacklist: ["useStrict"],
        // ...
    },
    // ...
}

巴别塔 6

由于 Babel 6 现在完全选择加入插件,而不是将 列入黑名单 ,您只是不包括严格模式插件。如果你使用的是包含它的预设,我认为你必须创建自己的预设,包括所有其他预设,但不是那个预设。useStrict

评论

2赞 ani h 11/20/2015
谢谢!你的回答澄清了我的疑问,但我仍然面临这个问题。所以这里有一些更多细节:我正在使用 gulp-babel 并且没有使用严格模式插件,也没有使用任何内部使用严格模式插件的预设。
0赞 T.J. Crowder 11/20/2015
@anih:抱歉,我还没有在 Gulp 中使用过 Babel,而且(还没有)使用 Babel 6。
1赞 artin 12/4/2015
我正在使用 Babel6 和 preset-es2015。我在该预设中没有看到 strict-mode-plugin。有什么想法吗?
16赞 laggingreflex 12/19/2015
它是“transform-es2015-modules-commonjs”插件(“es2015”预设中的插件),它添加了“use strict”。
8赞 alexykot 5/11/2016
我刚刚发布了包。它基本上已经注释掉了插件,其他一切都和我分叉的正常情况一样。babel-preset-es2015-nostricttransform-es2015-modules-commonjs[email protected]
3赞 Brian Schermerhorn 2/28/2016 #2

就我个人而言,我使用 gulp-iife 插件,并将 IIFE 包裹在我的所有文件周围。我注意到 babel 插件(使用预设 es2015)也添加了一个全局“use strict”。我再次通过 iife 流插件运行我的 post babel 代码,因此它使 babel 所做的无效。

gulp.task("build-js-source-dev", function () {
	return gulp.src(jsSourceGlob)
      .pipe(iife())
	  .pipe(plumber())
	  .pipe(babel({ presets: ["es2015"] }))// compile ES6 to ES5
	  .pipe(plumber.stop())
      .pipe(iife()) // because babel preset "es2015" adds a global "use strict"; which we dont want
      .pipe(concat(jsDistFile)) // concat to single file
	  .pipe(gulp.dest("public_dist"))
});

评论

2赞 5/7/2016
这应该是人们在使用 Gulp 时遇到此问题的解决方案。不错的建议。
0赞 Prasad Silva 5/27/2016
有人知道如何将 iife 与 browserify/babelify 设置集成吗?
1赞 Brian Schermerhorn 5/27/2016
这些自动化工具太多了,无法为我跟踪 =)
0赞 sandrina-p 8/23/2016
我使用了世宏智解决方案,它奏效了。但我也在使用 Gulp,所以这样更好吗?我是否需要使用 iife 设置任何配置或只是安装它?
0赞 Brian Schermerhorn 8/26/2016
我想这取决于你更喜欢哪个。
5赞 shihongzhi 5/11/2016 #3

巴别塔 6 + es2015

我们可以禁用要求.babel-plugin-transform-es2015-modules-commonjsbabel-plugin-transform-strict-mode

因此,在 151 行注释以下代码node_modules/babel-plugin-transform-es2015-modules-commonjs/lib/index.js

//inherits: require("babel-plugin-transform-strict-mode"),

评论

0赞 Kévin Berthommier 5/31/2016
这对我有用,是否可以使用选项做同样的事情?
0赞 shihongzhi 6/2/2016
@KévinBerthommier否,没有配置此选项的选项。
2赞 intentionally-left-nil 6/15/2016
IMO 这是更好的答案。这意味着在构建脚本中放置一个(可怕的)hack,但这样我就不必依赖分叉的预设(已经过时了)
8赞 Félix Adriyel Gagnon-Grenier 3/2/2018
等什么?那么,这个建议的解决方案是编辑下次安装 npm 时将被覆盖的文件?部署时间如何?
0赞 Michael 9/19/2019
您不应该在node_modules内编辑任何文件,因为这些文件将被覆盖。
4赞 hisland 7/13/2016 #4

只需更改 .babelrc 解决方案

如果你不想更改任何 npm 模块,你可以像这样使用 ignore.babelrc

{
  "presets": ["es2015"],
  "ignore": [
    "./src/js/directive/datePicker.js"
  ]
}

忽略该文件,它对我有用!

忽略的不能使用的文件是旧代码,不需要用 babel 来转换!'use strict'

2赞 Travis Webb 7/21/2016 #5

这在语法上是不正确的,但基本上适用于 Babel 5 和 6,而无需安装一个模块来删除另一个模块。

code.replace(/^"use strict";$/, '')
8赞 Adam Reis 7/22/2016 #6

我还遇到了一个相当荒谬的限制,即您无法禁用或覆盖现有预设中的设置,而是使用此预设:https://www.npmjs.com/package/babel-preset-es2015-without-strict

评论

0赞 Adam Reis 3/13/2019
请注意,这个答案现在已经过时了,我们已经改用@babel/preset-env
46赞 rcode 8/30/2016 #7

正如 Babel 6 已经提到的那样,它是添加严格模式的预设。 如果您想在不进行模块转换的情况下使用整个预设,请将其放入您的文件中:transform-es2015-modules-commonjses2015.babelrc

{
  "presets": [
    ["es2015", { "modules": false }]
  ]
}

这将禁用模块和严格模式,同时启用所有其他 es2015 转换。

评论

0赞 Jason Kuhrt 3/31/2017
与 webpack 2 配合得很好,它无论如何都希望这个 babel 配置能够利用摇树。参考资料: medium.freecodecamp.com/...
3赞 Daniel Schaffer 7/6/2019
2019 年的更新 - 这也适用于@babel/preset-env
0赞 vcoppolecchia 9/18/2019
我正在使用版本,这对我有用,但略有变化,希望这可以帮助其他人解决我的情况:gulp-babel^6.1.3{ "presets": [ ["babel-preset-env", { "modules": false }] ] }
2赞 Alina Poluykova 10/13/2016 #8

从 babel 6 开始,你可以先安装 babel-cli (如果你想从 CLI 使用 Babel ) 或 babel-core (使用 Node API)。此软件包不包括模块。

npm install --global babel-cli
# or
npm install --save-dev babel-core

然后安装您需要的模块。因此,在您的情况下,不要安装“严格模式”的模块。

npm install --save-dev babel-plugin-transform-es2015-arrow-functions

并在 .babelrc 文件中添加已安装的模块,如下所示:

{
  "plugins": ["transform-es2015-arrow-functions"]
}

详情请见:https://babeljs.io/blog/2015/10/31/setting-up-babel-6

2赞 Joscha 1/20/2017 #9

对于 babel 6,除了 monkey 修补预设和/或分叉并发布它之外,您还可以包装原始插件并将选项设置为 .strictfalse

沿着这些思路的东西应该可以解决问题:

const es2015preset = require('babel-preset-es2015');
const commonjsPlugin = require('babel-plugin-transform-es2015-modules-commonjs');

es2015preset.plugins.forEach(function(plugin) {
  if (plugin.length && plugin[0] === commonjsPlugin) {
    plugin[1].strict = false;
  }
});

module.exports = es2015preset;
2赞 Kos 3/2/2017 #10

请使用“es2015-without-strict”而不是“es2015”。别忘了你需要安装“babel-preset-es2015-without-strict”软件包。我知道这不是 Babel 的预期默认行为,请考虑该项目尚未成熟。

13赞 Alan Pierce 3/26/2017 #11

现在有一个 babel 插件,你可以将其添加到你的配置中,它将删除严格模式: .这有点丑陋,因为添加然后删除,但它使配置变得更好。babel-plugin-transform-remove-strict-mode"use strict"

文档位于 GitHub 存储库中:https://github.com/genify/babel-plugin-transform-remove-strict-mode

您的 .babelrc 最终看起来像这样:

{
  "presets": ["env"],
  "plugins": ["transform-remove-strict-mode"]
}
0赞 kolserdav 8/2/2018 #12

我刚刚制作了一个在 Node 中运行的脚本并删除了“use strict”;在所选文件中。

文件:脚本.js:

let fs = require('fs');
let file = 'custom/path/index.js';
let data = fs.readFileSync(file, 'utf8');
let regex = new RegExp('"use\\s+strict";');
if (data.match(regex)){
    let data2 = data.replace(regex, '');
    fs.writeFileSync(file, data2);
    console.log('use strict mode removed ...');
}
else {
    console.log('use strict mode is missing .');
}

node ./script.js

6赞 Kley Andromorfia 5/31/2019 #13
plugins: [
    [
        require("@babel/plugin-transform-modules-commonjs"), 
        {
            strictMode: false
        }
    ],
]

评论

0赞 Vsevolod Azovsky 6/14/2019
这对我有用!我使用 gulp-babel。但是,如何找到这种确切的方法呢?它在哪里描述?
0赞 Gerico 2/21/2020
也为我工作。我花了很长时间才找到一些有效的东西。谢谢!
1赞 Yair Kukielka 7/17/2020
这里 babeljs.io/docs/en/babel-plugin-transform-strict-mode 描述了它,但仍然不是 100% 可以理解的。文档的未解决问题:github.com/babel/babel/issues/7910
0赞 Abdull 3/5/2020 #14

如果您使用的是 https://babeljs.io/repl(在撰写本文时),则可以通过选择“源类型 -> 模块”来删除。v7.8.6"use strict";

6赞 Yair Kukielka 7/17/2020 #15

你可以告诉 babel 你的代码是一个脚本,其中包含:

sourceType: "script"

在您的 babel 配置文件中。这不会添加 .请参阅 sourceType 选项文档use strict

来源:https://github.com/babel/babel/issues/7910#issuecomment-388517631

0赞 Wesley Gonçalves 11/11/2020 #16

按照@rcode的回答使用插件或禁用模块和严格模式对我不起作用。

但是,将目标从 |按照@andrefarzart在此 GitHub 答案中的建议在文件中修复了该问题。es2015es6es5tsconfig.json

// tsconfig.json file
{
  // ...
  "compilerOptions": {
    // ...
    "target": "es5", // instead of "es2015"
}