[英]How to remove global "use strict" added by babel
我正在使用“使用嚴格”的函數形式,並且不希望 Babel 在編譯后添加的全局形式。 問題是我正在使用一些不使用“使用嚴格”模式的庫,並且在連接腳本后可能會拋出錯誤
正如在 Babel 6 中已經提到的那樣,它是transform-es2015-modules-commonjs
預設,它添加了嚴格模式。 如果你想在沒有模塊轉換的情況下使用整個es2015
預設,請將其放在你的.babelrc
文件中:
{
"presets": [
["es2015", { "modules": false }]
]
}
這將禁用模塊和嚴格模式,同時保持所有其他 es2015 轉換處於啟用狀態。
您"useStrict"
列入黑名單。 例如,這是 Gruntfile 中的一個示例:
babel: {
options: {
blacklist: ["useStrict"],
// ...
},
// ...
}
由於 Babel 6 現在完全選擇加入插件,而不是將useStrict
列入黑名單,你只是不包括strict-mode
插件。 如果您使用包含它的預設,我認為您必須創建自己的包含所有其他的預設,但不是那個。
現在有一個 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"]
}
我也遇到了這個相當荒謬的限制,您不能禁用或覆蓋現有預設中的設置,而是使用此預設: https ://www.npmjs.com/package/babel-preset-es2015-without-strict
你可以告訴 babel 你的代碼是一個腳本:
sourceType: "script"
在你的 babel 配置文件中。 這不會添加use strict
。 請參閱sourceType 選項文檔
來源: https ://github.com/babel/babel/issues/7910#issuecomment-388517631
plugins: [
[
require("@babel/plugin-transform-modules-commonjs"),
{
strictMode: false
}
],
]
通天塔 6 + es2015
我們可以禁用babel-plugin-transform-es2015-modules-commonjs
以要求babel-plugin-transform-strict-mode
。
所以在node_modules/babel-plugin-transform-es2015-modules-commonjs/lib/index.js
的 151 行注釋下面的代碼
//inherits: require("babel-plugin-transform-strict-mode"),
只需更改.babelrc
解決方案
如果您不想更改任何 npm 模塊,可以像這樣使用.babelrc
ignore
{
"presets": ["es2015"],
"ignore": [
"./src/js/directive/datePicker.js"
]
}
忽略那個文件,它對我有用!
不能使用'use strict'
的被忽略文件是舊代碼,不需要使用babel改造!
就個人而言,我使用 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")) });
這在語法上是不正確的,但基本上適用於 Babel 5 和 6,而無需安裝刪除另一個模塊的模塊。
code.replace(/^"use strict";$/, '')
從 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 而不是猴子修補預設和/或分叉並發布它,您也可以包裝原始插件並將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 的默認行為,請考慮項目尚未成熟。
我剛剛制作了一個在節點中運行並刪除“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
如果您使用的是https://babeljs.io/repl (撰寫本文時為v7.8.6
),您可以刪除"use strict";
通過選擇Source Type -> Module 。
按照@rcode 的回答中的建議使用插件或禁用模塊和嚴格模式對我不起作用。
但是,從es2015
更改目標 | es6
在此 GitHub 答案中建議的tsconfig.json
文件中的 es6 到es5
解決了該問題。
// tsconfig.json file
{
// ...
"compilerOptions": {
// ...
"target": "es5", // instead of "es2015"
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.