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

时间:2015-11-20 07:38:35

标签: javascript jshint babeljs use-strict

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

16 个答案:

答案 0 :(得分:40)

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

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

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

答案 1 :(得分:24)

Babel 5

你是黑名单"useStrict"。例如,这里是Gruntfile中的一个例子:

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

Babel 6

由于Babel 6为fully opt-in for plugins now,而不是将useStrict列入黑名单,因此您不应包含strict-mode plugin。如果你正在使用包含它的预设,我认为你必须创建自己的,包括所有其他的,但不包括那个。

答案 2 :(得分:12)

现在有一个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"]
}

答案 3 :(得分:8)

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

答案 4 :(得分:5)

Babel 6 + es2015

我们可以停用babel-plugin-transform-es2015-modules-commonjs来要求babel-plugin-transform-strict-mode

请在{1}}的151行

中注释以下代码
node_modules/babel-plugin-transform-es2015-modules-commonjs/lib/index.js

答案 5 :(得分: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"))
});

答案 6 :(得分:4)

只需更改.babelrc解决方案

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

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

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

无法使用'use strict'被忽略的文件是旧代码,并且不需要使用babel来进行转换!

答案 7 :(得分: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

答案 8 :(得分: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;

答案 9 :(得分:2)

请使用" es2015-without-strict"而不是" es2015"。别忘了你需要打包" babel-preset-es2015-without-strict"安装。我知道Babel的预期违约行为并不存在,请考虑项目尚未成熟。

答案 10 :(得分:1)

这不是 grammatically 正确,但基本上适用于Babel 5和6,而无需安装删除其他模块的模块。

code.replace(/^"use strict";$/, '')

答案 11 :(得分:1)

您可以告诉babel您的代码是具有以下内容的脚本:

sourceType: "script"

这不会添加use strict。参见sourceType option docs

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

答案 12 :(得分:0)

我刚刚制作了一个在Node上运行的脚本,并删除了“ 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

答案 13 :(得分:0)

plugins: [
    [
        require("@babel/plugin-transform-modules-commonjs"), 
        {
            strictMode: false
        }
    ],
]

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

但是,按照{and this GitHub answer}中@andrefarzart的建议,将es2015文件中的目标从es6 | es5更改为tsconfig.json

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