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

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

Ответы

Ответ 1

Вавилон 5

Черный список "useStrict". Например, здесь пример в файле Grunt:

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

Бабель 6

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

Ответ 2

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

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

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

Ответ 3

Бабель 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"),

Ответ 4

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

Ответ 5

просто изменить .babelrc решение

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

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

Начиная с babel 6, вы можете установить сначала babel-cli (если вы хотите использовать Babel из CLI) или babel-core (использовать API Node). Этот пакет не включает модули.

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

Ответ 9

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

Ответ 10

Сценарий @shihongzhi ответ дает мне это в нашей сборке script:

sed -i.bak 's/^.*"babel-plugin-transform-strict-mode"/\/\/ &/' node_modules/babel-plugin-transform-es2015-modules-commonjs/lib/index.js 

Yuck: (

P.S. sed не нравится для файлов.

Ответ 11

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

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

Ответ 12

Вместо "es2015" используйте "es2015-without-strict". Не забывайте, что вам необходимо установить пакет "babel-preset-es2015-without-strict". Я знаю, что это не ожидаемое поведение по умолчанию Вавилона, пожалуйста, учтите, что проект еще не созрел.