Как убрать глобальное "используйте строгий" добавленный 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
просто поменяй .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";
выбрав Тип источника -> Модуль.