Как убрать глобальное "используйте строгий" добавленный babel

Я использую форму функции "используй строго" и не хочу, чтобы глобальная форма добавлялась Бабелем после транспиляции. Проблема в том, что я использую некоторые библиотеки, которые не используют режим "использовать строгий", и это может привести к ошибке после объединения сценариев

12 ответов

Решение

Бабель 5

Вы бы черный список "useStrict", Например, вот пример в Gruntfile:

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

Бабель 6

Поскольку Babel 6 теперь полностью поддерживает плагины, а не занесение в черный список useStrictВы просто не включаете strict-mode плагин. Если вы используете пресет, который включает его, я думаю, вам придется создать свой собственный, который включает в себя все остальные, но не тот.

Как уже упоминалось в Вавилоне 6, это transform-es2015-modules-commonjs пресет, который добавляет строгий режим. В случае, если вы хотите использовать весь es2015 пресет без преобразования модуля, поместите это в свой .babelrc файл:

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

Это отключит модули и строгий режим, оставив все остальные преобразования es2015 включенными.

Теперь есть плагин 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"]
}

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

Я также натолкнулся на это довольно нелепое ограничение, заключающееся в том, что вы не можете отключить или перезаписать настройки из существующего пресета, и вместо этого прибегнул к использованию этого пресета: https://www.npmjs.com/package/babel-preset-es2015-without-strict

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

Вы можете сказать babel, что ваш код - это скрипт с:

sourceType: "script"

Это не добавит use strict. См. Документацию по параметрам sourceType

Источник: https://github.com/babel/babel/issues/7910

просто поменяй .babelrc решение

если вы не хотите менять какие-либо модули npm, вы можете использовать .babelrc игнорировать, как это

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

игнорируйте этот файл, он работает для меня!

игнорируемый файл, который нельзя использовать 'use strict' старый код, и не нужно использовать babel для его преобразования!

Лично я использую плагин gulp-iife и оборачиваю IIFE вокруг всех своих файлов. Я заметил, что плагин babel (использующий предустановку es2015) также добавляет глобальное "строгое использование". Я снова запускаю свой почтовый код через плагин iife stream, чтобы он сводил на нет то, что сделал 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";$/, '')

Пожалуйста, используйте "es2015-без-строгий" вместо "es2015". Не забудьте, что вам нужно установить пакет "babel-preset-es2015-без-строгого". Я знаю, что Babel не ожидает поведения по умолчанию, пожалуйста, примите во внимание, что проект еще не завершен.

Для 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;

Начиная с babel 6, вы можете сначала установить babel-cli (если вы хотите использовать Babel из CLI) или 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

Я только что сделал скрипт, который запускается в узле и удаляет "использовать строгое"; в выбранном файле.

файл: 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

Использование плагинов или отключение модулей и строгого режима, как было предложено в ответе @rcode, у меня не сработало.

Но, изменив цель с es2015|es6 к es5 в tsconfig.jsonфайл, предложенный @andrefarzart в этом ответе GitHub, исправил проблему.

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

Если вы используете https://babeljs.io/repl (v7.8.6 на момент написания этой статьи), вы можете удалить "use strict";выбрав Тип источника -> Модуль.

Другие вопросы по тегам