web-dev-qa-db-fra.com

Comment supprimer global "use strict" ajouté par babel

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.

43
ani h

Babel 5

Vous auriez une liste noire "useStrict". Par exemple, voici un exemple dans un fichier Gruntfile:

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

Babel 6

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à.

25
T.J. Crowder

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.

36
rcode

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"]
}
9
Alan Pierce

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"),
7
shihongzhi

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

7
Adam Reis

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!

5
hisland

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"))
});

3
Brian Schermerhorn

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é.

1
wandalen

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;
1
Joscha

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

1
Alina Poluykova

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";$/, '')
0
Travis Webb

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

0
kolserdav