Ich verwende die Funktionsform "use strict" und möchte keine globale Form, die Babel nach der Transpilation hinzufügt. Das Problem ist, dass ich einige Bibliotheken verwende, die nicht den Modus "use strict" verwenden, und es kann einen Fehler auslösen, nachdem Skripts verkettet wurden
Sie würden "useStrict"
auf die schwarze Liste setzen. Zum Beispiel hier ein Beispiel in einer Gruntdatei:
babel: {
options: {
blacklist: ["useStrict"],
// ...
},
// ...
}
Da Babel 6 jetzt voll für Plugins aktiviert ist , anstatt useStrict
auf die schwarze Liste zu setzen, fügen Sie einfach das strict-mode
-Plugin hinzu. Wenn Sie eine Voreinstellung verwenden, die diese enthält, denke ich, müssen Sie Ihre eigene erstellen, die alle anderen enthält, aber nicht diese.
Wie bereits für Babel 6 erwähnt, ist es die Voreinstellung transform-es2015-modules-commonjs
, die den strikten Modus hinzufügt ..__ Wenn Sie die gesamte Voreinstellung es2015
ohne Modulumwandlungen verwenden möchten, geben Sie dies in Ihre .babelrc
-Datei ein
{
"presets": [
["es2015", { "modules": false }]
]
}
Dadurch werden die Module und der strikte Modus deaktiviert, während alle anderen es2015-Transformationen aktiviert bleiben.
Es gibt jetzt ein Babel-Plugin, das Sie Ihrer Konfiguration hinzufügen können, um den strikten Modus zu entfernen: babel-plugin-transform-remove-strict-mode
. Es ist ein wenig hässlich, dass der "use strict"
hinzugefügt und dann entfernt wird, die Konfig-Datei jedoch viel schöner ist.
Dokumente befinden sich im GitHub-Repo: https://github.com/genify/babel-plugin-transform-remove-strict-mode
Ihr .babelrc sieht am Ende so aus:
{
"presets": ["env"],
"plugins": ["transform-remove-strict-mode"]
}
Babel 6 + es2015
Wir können babel-plugin-transform-es2015-modules-commonjs
deaktivieren, um babel-plugin-transform-strict-mode
zu verlangen.
Kommentieren Sie den folgenden Code in node_modules/babel-plugin-transform-es2015-modules-commonjs/lib/index.js
in der Zeile 151
//inherits: require("babel-plugin-transform-strict-mode"),
Ich kam auch über diese ziemlich lächerliche Einschränkung, dass Sie die Einstellungen einer vorhandenen Voreinstellung nicht deaktivieren oder überschreiben können, und habe stattdessen diese Voreinstellung verwendet: https://www.npmjs.com/package/babel-preset-es2015-without -strikt
einfach .babelrc
Lösung ändern
wenn Sie keine npm-Module ändern möchten, können Sie .babelrc
ignore so verwenden
{
"presets": ["es2015"],
"ignore": [
"./src/js/directive/datePicker.js"
]
}
ignorieren Sie diese Datei, es funktioniert für mich!
die ignorierte Datei die 'use strict'
nicht verwenden kann, ist alter Code und muss nicht mit Babel umgewandelt werden!
Ich persönlich verwende das gulp-iife-Plugin und wickle IIFEs um alle meine Dateien. Mir ist aufgefallen, dass das Babel-Plugin (mit der Voreinstellung es2015) auch eine globale "use strict" hinzufügt. Ich führe meinen Post-Babel-Code erneut über das iife Stream-Plugin aus, sodass das Verhalten von Babel für nichtig erklärt wird.
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"))
});
plugins: [
[
require("@babel/plugin-transform-modules-commonjs"),
{
strictMode: false
}
],
]
Bitte verwenden Sie "es2015-without-strict" anstelle von "es2015". Vergessen Sie nicht, dass Sie das Paket "babel-preset-es2015-without-strict" installiert haben müssen. Ich weiß, es wird kein Standardverhalten von Babel erwartet. Bitte berücksichtigen Sie, dass das Projekt noch nicht ausgereift ist.
Bei Babel 6 können Sie das Preset nicht patchen und/oder fälschen und veröffentlichen, sondern nur das Original-Plugin umschließen und die Option strict
auf false
setzen.
Etwas in dieser Richtung sollte den Trick tun:
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;
Seit Babel 6 können Sie zunächst Babel-CLI (wenn Sie Babel über die CLI verwenden möchten) oder Babel-Core (zur Verwendung der Node-API) installieren. Dieses Paket enthält keine Module.
npm install --global babel-cli
# or
npm install --save-dev babel-core
Installieren Sie dann die benötigten Module. Installieren Sie also in Ihrem Fall kein Modul für den "strikten Modus".
npm install --save-dev babel-plugin-transform-es2015-arrow-functions
Fügen Sie installierte Module in der .babelrc-Datei wie folgt hinzu:
{
"plugins": ["transform-es2015-arrow-functions"]
}
Details finden Sie hier: https://babeljs.io/blog/2015/10/31/setting-up-babel-6
Dies ist nicht grammatisch korrekt, funktioniert aber grundsätzlich für Babel 5 und 6, ohne dass ein Modul installiert werden muss, das ein anderes Modul entfernt.
code.replace(/^"use strict";$/, '')
Ich habe gerade ein Skript erstellt, das im Knoten ausgeführt wird und "use strict" entfernt. in der ausgewählten Datei.
datei: 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