javascript - cant - jshint import is only available in es6 use esversion 6 '') w119 w119
Cómo eliminar el "uso estricto" global agregado por babel (13)
Estoy usando la forma de función de "uso estricto" y no quiero la forma global que Babel agrega después de la transpilación. El problema es que estoy usando algunas bibliotecas que no usan el modo "uso estricto" y podría arrojar un error después de que los scripts se concatenan
Babel 5
"useStrict"
lista negra
"useStrict"
.
Por ejemplo, aquí hay un ejemplo en un Gruntfile:
babel: {
options: {
blacklist: ["useStrict"],
// ...
},
// ...
}
Babel 6
Dado que Babel 6 está
totalmente
useStrict
para complementos ahora
, en lugar de
useStrict
lista negra
useStrict
, simplemente no incluye el
complemento de
strict-mode
.
Si está usando un preset que lo incluye, creo que tendrá que crear uno propio que incluya todos los demás, pero no ese.
Acabo de hacer un script que se ejecuta en el Nodo y elimina "use estricto"; en el archivo seleccionado
archivo: 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
Ahora hay un complemento de babel que puede agregar a su configuración que eliminará el modo estricto:
babel-plugin-transform-remove-strict-mode
.
Es un poco feo porque el
"use strict"
se agrega y luego se elimina, pero hace que la configuración sea mucho más agradable.
Los documentos están en el repositorio de GitHub: https://github.com/genify/babel-plugin-transform-remove-strict-mode
Su .babelrc termina luciendo así:
{
"presets": ["env"],
"plugins": ["transform-remove-strict-mode"]
}
Babel 6 + es2015
Podemos deshabilitar
babel-plugin-transform-es2015-modules-commonjs
para requerir
babel-plugin-transform-strict-mode
.
Así que comente el siguiente código en
node_modules/babel-plugin-transform-es2015-modules-commonjs/lib/index.js
en la línea 151
{
"presets": ["es2015"],
"ignore": [
"./src/js/directive/datePicker.js"
]
}
Como ya se mencionó para Babel 6, es el
transform-es2015-modules-commonjs
que agrega el modo estricto.
En caso de que desee utilizar todo el preestablecido
es2015
sin transformaciones de módulo, coloque esto en su archivo
.babelrc
:
{
"presets": [
["es2015", { "modules": false }]
]
}
Esto deshabilitará los módulos y el modo estricto, mientras mantiene todas las demás transformaciones es2015 habilitadas.
Desde babel 6 puede instalar en primer lugar babel-cli (si desea usar Babel desde la CLI) o babel-core (para usar la API de nodo). Este paquete no incluye módulos.
npm install --save-dev babel-plugin-transform-es2015-arrow-functions
Luego instale los módulos que necesita. Por lo tanto, no instale el módulo para ''modo estricto'' en su caso.
{
"plugins": ["transform-es2015-arrow-functions"]
}
Y agregue módulos instalados en el archivo .babelrc como este:
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;
Ver detalles aquí: https://babeljs.io/blog/2015/10/31/setting-up-babel-6
Esto no es grammatically correcto, pero básicamente funcionará tanto para Babel 5 como para 6 sin tener que instalar un módulo que elimine otro módulo.
code.replace(/^"use strict";$/, '''')
Para babel 6 en lugar de mono parchear el preajuste y / o bifurcarlo y publicarlo, también puede envolver el complemento original y establecer la opción
strict
en
false
.
Algo en ese sentido debería hacer el truco:
plugins: [
[
require("@babel/plugin-transform-modules-commonjs"),
{
strictMode: false
}
],
]
Personalmente, uso el complemento gulp-iife y envuelvo IIFE alrededor de todos mis archivos. Me di cuenta de que el complemento de babel (usando el preestablecido es2015) también agrega un "uso estricto" global. Ejecuto mi código post babel a través del complemento de transmisión iife nuevamente para que anule lo que hizo babel.
//inherits: require("babel-plugin-transform-strict-mode"),
También me encontré con esta limitación bastante ridícula de que no puede deshabilitar o sobrescribir la configuración de un preajuste existente, y he recurrido a usar este preajuste en su lugar: https://www.npmjs.com/package/babel-preset-es2015-without-strict
Utilice "es2015-sin estricto" en lugar de "es2015". No olvide que necesita tener instalado el paquete "babel-preset-es2015-without-estricto". Sé que no se espera un comportamiento predeterminado de Babel, tenga en cuenta que el proyecto aún no está maduro.
solo cambie la solución
.babelrc
si no desea cambiar ningún módulo npm, puede usar
.babelrc
ignore de esta manera
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"))
});
ignora ese archivo, ¡funciona para mí!
¡el
archivo ignorado
que no puede usar
''use strict''
es un código antiguo, y no necesita usar babel para transformarlo!
npm install --global babel-cli
# or
npm install --save-dev babel-core