53

我正在使用“使用严格”的函数形式,并且不希望 Babel 在编译后添加的全局形式。问题是我正在使用一些不使用“使用严格”模式的库,并且在连接脚本后可能会抛出错误

4

16 回答 16

46

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

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

这将禁用模块和严格模式,同时保持所有其他 es2015 转换处于启用状态。

于 2016-08-30T10:44:53.847 回答
27

通天塔 5

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

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

通天塔 6

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

于 2015-11-20T08:09:31.753 回答
13

现在有一个 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"]
}
于 2017-03-26T03:29:03.347 回答
8

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

于 2016-07-21T17:50:04.047 回答
6

你可以告诉 babel 你的代码是一个脚本:

sourceType: "script"

这不会添加use strict. 请参阅sourceType 选项文档

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

于 2020-07-17T12:53:44.720 回答
6
plugins: [
    [
        require("@babel/plugin-transform-modules-commonjs"), 
        {
            strictMode: false
        }
    ],
]
于 2019-05-31T07:08:46.543 回答
5

通天塔 6 + es2015

我们可以禁用babel-plugin-transform-es2015-modules-commonjsrequire babel-plugin-transform-strict-mode

node_modules/babel-plugin-transform-es2015-modules-commonjs/lib/index.js所以在第 151 行注释下面的代码

//inherits: require("babel-plugin-transform-strict-mode"),
于 2016-05-11T14:52:40.343 回答
4

只是改变.babelrc解决方案

如果您不想更改任何 npm 模块,可以使用.babelrc这样的忽略

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

忽略那个文件,它对我有用!

不能使用的被忽略的文件'use strict'是旧代码,不用babel改造!

于 2016-07-13T01:15:31.250 回答
4

就个人而言,我使用 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"))
});

于 2016-02-28T02:00:31.400 回答
2

对于 babel 6 而不是猴子修补预设和/或分叉并发布它,您也可以只包装原始插件并将strict选项设置为false.

这些方面的东西应该可以解决问题:

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;
于 2017-01-19T22:49:45.610 回答
2

从 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

于 2016-10-13T10:59:14.440 回答
2

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

于 2017-03-02T10:29:08.250 回答
1

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

code.replace(/^"use strict";$/, '')
于 2016-07-20T18:43:13.500 回答
0

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

文件:script.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

于 2018-08-01T18:39:53.187 回答
0

如果您使用的是https://babeljs.io/replv7.8.6在撰写本文时),您可以"use strict";通过选择Source Type -> Module来删除。

于 2020-03-05T11:02:12.353 回答
0

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

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

// tsconfig.json file
{
  // ...
  "compilerOptions": {
    // ...
    "target": "es5", // instead of "es2015"
}
于 2020-11-11T02:24:13.333 回答