Как удалить глобальное "строгое использование", добавленное 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". Я знаю, что это не ожидаемое поведение по умолчанию Вавилона, пожалуйста, учтите, что проект еще не созрел.