提问人:ani h 提问时间:11/20/2015 更新时间:6/28/2022 访问量:59347
如何删除 babel 添加的全局“use strict”
How to remove global "use strict" added by babel
问:
我使用的是“使用严格”的函数形式,并且不想要 Babel 在转译后添加的全局形式。问题是我正在使用一些不使用“使用严格”模式的库,它可能会在连接脚本后引发错误
答:
巴别塔 5
你会被列入黑名单。例如,下面是 Gruntfile 中的一个示例:"useStrict"
babel: {
options: {
blacklist: ["useStrict"],
// ...
},
// ...
}
巴别塔 6
由于 Babel 6 现在完全选择加入插件,而不是将 列入黑名单 ,您只是不包括严格模式
插件。如果你使用的是包含它的预设,我认为你必须创建自己的预设,包括所有其他预设,但不是那个预设。useStrict
评论
babel-preset-es2015-nostrict
transform-es2015-modules-commonjs
[email protected]
就我个人而言,我使用 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 + es2015
我们可以禁用要求.babel-plugin-transform-es2015-modules-commonjs
babel-plugin-transform-strict-mode
因此,在 151 行注释以下代码node_modules/babel-plugin-transform-es2015-modules-commonjs/lib/index.js
//inherits: require("babel-plugin-transform-strict-mode"),
评论
只需更改 .babelrc
解决方案
如果你不想更改任何 npm 模块,你可以像这样使用 ignore.babelrc
{
"presets": ["es2015"],
"ignore": [
"./src/js/directive/datePicker.js"
]
}
忽略该文件,它对我有用!
忽略的不能使用的文件是旧代码,不需要用 babel 来转换!'use strict'
这在语法上是不正确的,但基本上适用于 Babel 5 和 6,而无需安装一个模块来删除另一个模块。
code.replace(/^"use strict";$/, '')
我还遇到了一个相当荒谬的限制,即您无法禁用或覆盖现有预设中的设置,而是使用此预设:https://www.npmjs.com/package/babel-preset-es2015-without-strict
评论
@babel/preset-env
正如 Babel 6 已经提到的那样,它是添加严格模式的预设。
如果您想在不进行模块转换的情况下使用整个预设,请将其放入您的文件中:transform-es2015-modules-commonjs
es2015
.babelrc
{
"presets": [
["es2015", { "modules": false }]
]
}
这将禁用模块和严格模式,同时启用所有其他 es2015 转换。
评论
@babel/preset-env
gulp-babel
^6.1.3
{ "presets": [ ["babel-preset-env", { "modules": false }] ] }
从 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
对于 babel 6,除了 monkey 修补预设和/或分叉并发布它之外,您还可以包装原始插件并将选项设置为 .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;
请使用“es2015-without-strict”而不是“es2015”。别忘了你需要安装“babel-preset-es2015-without-strict”软件包。我知道这不是 Babel 的预期默认行为,请考虑该项目尚未成熟。
现在有一个 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"]
}
我刚刚制作了一个在 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
plugins: [
[
require("@babel/plugin-transform-modules-commonjs"),
{
strictMode: false
}
],
]
评论
如果您使用的是 https://babeljs.io/repl(在撰写本文时),则可以通过选择“源类型 -> 模块”来删除。v7.8.6
"use strict";
你可以告诉 babel 你的代码是一个脚本,其中包含:
sourceType: "script"
在您的 babel 配置文件中。这不会添加 .请参阅 sourceType 选项文档use strict
来源:https://github.com/babel/babel/issues/7910#issuecomment-388517631
按照@rcode的回答使用插件或禁用模块和严格模式对我不起作用。
但是,将目标从 |按照@andrefarzart在此 GitHub 答案中的建议在文件中修复了该问题。es2015
es6
es5
tsconfig.json
// tsconfig.json file
{
// ...
"compilerOptions": {
// ...
"target": "es5", // instead of "es2015"
}
评论