【问题标题】:How to remove global "use strict" added by babel如何删除 babel 添加的全局“use strict”
【发布时间】:2016-02-22 14:58:19
【问题描述】:

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

【问题讨论】:

标签: javascript jshint babeljs use-strict


【解决方案1】:

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

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

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

【讨论】:

  • 与 webpack 2 配合使用非常好,它希望这个 babel 配置无论如何都可以利用树抖动。参考:medium.freecodecamp.com/…
  • 2019 年更新 - 这也适用于 @babel/preset-env
  • 我正在使用gulp-babel 版本^6.1.3,这对我有用,但略有不同,希望在我的情况下可以帮助其他人:{ "presets": [ ["babel-preset-env", { "modules": false }] ] }
【解决方案2】:

通天塔 5

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

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

通天塔 6

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

【讨论】:

  • 谢谢!您的回答澄清了我的疑问,但我仍然面临这个问题。所以这里有更多细节:我正在使用 gulp-babel 并且没有使用 strict-mode 插件,也没有使用任何内部使用 strict-mode 插件。
  • @anih:抱歉,我没有在 Gulp 中使用过 Babel,也没有(还)使用过 Babel 6。
  • 我正在使用 Babel6 和 preset-es2015。我在该预设中看不到strict-mode-plugin。有什么想法吗?
  • "transform-es2015-modules-commonjs" plugin(“es2015”预设中的插件)添加了“use strict”。
  • 我刚刚发布了babel-preset-es2015-nostrict 包。它基本上将 transform-es2015-modules-commonjs 插件注释掉了,其他所有内容都与我分叉的普通 babel-preset-es2015@6.6.0 一样。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 请注意,这个答案现在已经过时了,我们已经改用@babel/preset-env
    【解决方案5】:
    plugins: [
        [
            require("@babel/plugin-transform-modules-commonjs"), 
            {
                strictMode: false
            }
        ],
    ]
    

    【讨论】:

    【解决方案6】:

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

    sourceType: "script"
    

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

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

    【讨论】:

      【解决方案7】:

      Babel 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"),
      

      【讨论】:

      • 这对我有用,是否可以使用选项做同样的事情?
      • @KévinBerthommier 不,没有选项可以配置这个。
      • IMO 这是更好的答案。这意味着在构建脚本中放置一个(糟糕的)hack,但这样我就不必依赖分叉的预设(已经过时了)
      • 等等什么?所以,这个提议的解决方案是编辑下次 npm install 时将被覆盖的文件?什么时候部署呢?
      • 您不应该编辑 node_modules 中的任何文件,因为这些文件将被覆盖。
      【解决方案8】:

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

      【讨论】:

      • 这应该是使用 Gulp 遇到此问题的人的解决方案。不错的建议。
      • 有人知道如何将 iife 与 browserify/babelify 设置集成吗?
      • 这些自动化工具太多了,我无法跟踪 =)
      • 我用了石宏智的解决方案,效果很好。但我也在使用 Gulp,这样更好吗?我需要用 iife 设置什么配置还是直接安装?
      • 我想这取决于你更喜欢哪个。
      【解决方案9】:

      只需更改.babelrc 解决方案

      如果你不想改变任何 npm 模块,你可以像这样使用.babelrcignore

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

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

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

      【讨论】:

        【解决方案10】:

        从 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

        【讨论】:

          【解决方案11】:

          对于 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;
          

          【讨论】:

            【解决方案12】:

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

            【讨论】:

              【解决方案13】:

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

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

              【讨论】:

                【解决方案14】:

                我刚刚制作了一个在节点中运行并删除“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

                【讨论】:

                  【解决方案15】:

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

                  【讨论】:

                    【解决方案16】:

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

                    但是,按照@andrefarzart 在this GitHub answer 中的建议,将tsconfig.json 文件中的目标从es2015|es6 更改为es5 解决了这个问题。

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

                    【讨论】:

                      猜你喜欢
                      • 2017-07-11
                      • 2016-03-25
                      • 2019-03-14
                      • 2015-11-29
                      • 2011-10-23
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-06-13
                      相关资源
                      最近更新 更多