J'utilise la forme de fonction "use strict" et je ne veux pas de forme globale, ce que Babel ajoute après la transpilation. Le problème est que j'utilise certaines bibliothèques qui n'utilisent pas le mode "use strict" et que cela peut générer une erreur après la concaténation des scripts.
Vous auriez une liste noire "useStrict"
. Par exemple, voici un exemple dans un fichier Gruntfile:
babel: {
options: {
blacklist: ["useStrict"],
// ...
},
// ...
}
Puisque Babel 6 est totalement opt-in pour les plug-ins maintenant , au lieu de mettre en liste noire useStrict
, vous n'incluez tout simplement pas le plugin strict-mode
. Si vous utilisez un préréglage qui l’inclut, je pense que vous devrez créer le vôtre, qui inclut tous les autres, mais pas celui-là.
Comme cela a déjà été mentionné pour Babel 6, c'est le préréglage transform-es2015-modules-commonjs
qui ajoute le mode strict . Si vous souhaitez utiliser le préréglage es2015
complet sans transformations de module, placez-le dans votre fichier .babelrc
:
{
"presets": [
["es2015", { "modules": false }]
]
}
Cela désactivera les modules et le mode strict tout en maintenant toutes les autres transformations es2015 activées.
Il existe maintenant un plugin babel que vous pouvez ajouter à votre configuration pour supprimer le mode strict: babel-plugin-transform-remove-strict-mode
. C'est un peu moche en ce que le "use strict"
est ajouté puis supprimé, mais cela rend la configuration beaucoup plus agréable.
Les documents sont dans le dépôt GitHub: https://github.com/genify/babel-plugin-transform-remove-strict-mode
Votre .babelrc finit par ressembler à ceci:
{
"presets": ["env"],
"plugins": ["transform-remove-strict-mode"]
}
Babel 6 + es2015
Nous pouvons désactiver babel-plugin-transform-es2015-modules-commonjs
pour exiger babel-plugin-transform-strict-mode
.
Alors commentez le code suivant dans node_modules/babel-plugin-transform-es2015-modules-commonjs/lib/index.js
à la ligne 151
//inherits: require("babel-plugin-transform-strict-mode"),
Je suis également tombé sur cette limitation plutôt ridicule, qui interdit de désactiver ou d'écraser les paramètres d'un préréglage existant, et d'utiliser plutôt ce préréglage: https://www.npmjs.com/package/babel-preset-es2015-without -strict
il suffit de changer la solution .babelrc
si vous ne voulez pas changer les modules npm, vous pouvez utiliser .babelrc
ignorer comme ceci
{
"presets": ["es2015"],
"ignore": [
"./src/js/directive/datePicker.js"
]
}
ignorer ce fichier, ça marche pour moi!
le fichier ignoré qui ne peut pas utiliser 'use strict'
est un ancien code, il n'est pas nécessaire d'utiliser babel pour le transformer!
Personnellement, j'utilise le plugin gulp-iife et j'emballe les fichiers IIFE autour de tous mes fichiers. J'ai remarqué que le plugin babel (utilisant le préréglage es2015) ajoute également une "utilisation stricte" globale. Je lance à nouveau mon code post babel à travers le plugin iife stream, ce qui annule ce que babel a fait.
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"))
});
Veuillez utiliser "es2015-without-strict" au lieu de "es2015". N'oubliez pas que vous devez installer le package "babel-preset-es2015-without-strict". Je sais que le comportement par défaut de Babel n’est pas attendu. Veuillez tenir compte du fait que le projet n’est pas encore arrivé à maturité.
Pour babel 6, au lieu que Monkey répare le préréglage et/ou le corrige et le publie, vous pouvez également envelopper le plug-in d'origine et définir l'option strict
sur false
.
Quelque chose dans ce sens devrait faire l'affaire:
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;
Depuis babel 6, vous pouvez d’abord installer babel-cli (si vous voulez utiliser Babel à partir de la CLI) ou babel-core (utiliser l’API du noeud). Ce paquet n'inclut pas de modules.
npm install --global babel-cli
# or
npm install --save-dev babel-core
Ensuite, installez les modules dont vous avez besoin. Donc, ne pas installer le module pour «mode strict» dans votre cas.
npm install --save-dev babel-plugin-transform-es2015-arrow-functions
Et ajoutez les modules installés dans le fichier .babelrc comme ceci:
{
"plugins": ["transform-es2015-arrow-functions"]
}
Voir les détails ici: https://babeljs.io/blog/2015/10/31/setting-up-babel-6
Ce n'est pas grammaticalement correct, mais fonctionnera essentiellement pour Babel 5 et 6 sans avoir à installer un module qui supprime un autre module.
code.replace(/^"use strict";$/, '')
Je viens de faire un script qui s'exécute dans le nœud et supprime "use strict"; dans le fichier sélectionné.
fichier: 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