簡體   English   中英

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

[英]How to remove global "use strict" added by babel

我正在使用“使用嚴格”的函數形式,並且不希望 Babel 在編譯后添加的全局形式。 問題是我正在使用一些不使用“使用嚴格”模式的庫,並且在連接腳本后可能會拋出錯誤

正如在 Babel 6 中已經提到的那樣,它是transform-es2015-modules-commonjs預設,它添加了嚴格模式。 如果你想在沒有模塊轉換的情況下使用整個es2015預設,請將其放在你的.babelrc文件中:

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

這將禁用模塊和嚴格模式,同時保持所有其他 es2015 轉換處於啟用狀態。

通天塔 5

"useStrict"列入黑名單。 例如,這是 Gruntfile 中的一個示例:

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

通天塔 6

由於 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM