node.js - significa - torre de babel actual
ImportaciĆ³n de tokens inesperados de Babel al ejecutar pruebas de mocha (17)
Para Babel <6
La forma más fácil de resolver este problema es:
-
npm install babel-preset-es2015 --save-dev
-
Agregue
.babelrc
a la raíz del proyecto con contenido:{ "presets": [ "es2015" ] }
Asegúrese de estar ejecutando mocha con el parámetro "--compilers js: babel-core / register".
Para Babel6 / 7 +
-
npm install @babel/preset-env --save-dev
-
Agregue
.babelrc
a la raíz del proyecto con contenido:{ "presets": [ "@babel/preset-env" ] }
Asegúrese de ejecutar mocha con el
--compilers js:babel-register
(Babel 6) o
--compilers js:@babel/register
(Babel 7)
Las soluciones ofrecidas en otras preguntas relacionadas, como incluir los ajustes preestablecidos adecuados (es2015) en .babelrc, ya están implementadas en mi proyecto.
Tengo dos proyectos (llamémoslos A y B) que usan la sintaxis del módulo ES6. En el Proyecto A, estoy importando el Proyecto B, que se instala a través de npm y vive en la carpeta node_modules. Cuando ejecuto mi conjunto de pruebas para el Proyecto A, obtengo el error:
SyntaxError: importación de token inesperada
Precedido por esta supuesta línea de código errónea del Proyecto B:
(función (exporta, requiere, módulo, __nombre de archivo, __dirname) {importar createBrowserHistory desde ''history / lib / createBrowserHistory'';
La vida parece ser algo relacionado con npm o posiblemente con Babel, ya que mi archivo fuente solo contiene "import createBrowserHistory de ''history / lib / createBrowserHistory''; La unidad de pruebas en el conjunto de pruebas del Proyecto B funciona bien, y si elimino el Proyecto B como una dependencia de Proyecto A, mi suite de prueba entonces (todavía usando importaciones es6 para módulos internos del proyecto) funciona bien.
Seguimiento completo de la pila:
SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:374:25)
at Module._extensions..js (module.js:405:10)
at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:138:7)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Module.require (module.js:354:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (actionCreators.js:4:17)
at Module._compile (module.js:398:26)
at loader (/ProjectA/node_modules/babel-register/lib/node.js:130:5)
at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:140:7)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Module.require (module.js:354:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/ProjectA/src/components/core/wrapper/wrapper.js:28:23)
at Module._compile (module.js:398:26)
at loader (/ProjectA/node_modules/babel-register/lib/node.js:130:5)
at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:140:7)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Module.require (module.js:354:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/ProjectA/src/components/core/wrapper/wrapperSpec.js:15:16)
at Module._compile (module.js:398:26)
at loader (/ProjectA/node_modules/babel-register/lib/node.js:130:5)
at Object.require.extensions.(anonymous function) [as .js] (/ProjectA/node_modules/babel-register/lib/node.js:140:7)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Module.require (module.js:354:17)
at require (internal/module.js:12:17)
at /ProjectA/node_modules/mocha/lib/mocha.js:219:27
at Array.forEach (native)
at Mocha.loadFiles (/ProjectA/node_modules/mocha/lib/mocha.js:216:14)
at Mocha.run (/ProjectA/node_modules/mocha/lib/mocha.js:468:10)
at Object.<anonymous> (/ProjectA/node_modules/mocha/bin/_mocha:403:18)
at Module._compile (module.js:398:26)
at Object.Module._extensions..js (module.js:405:10)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Function.Module.runMain (module.js:430:10)
at startup (node.js:141:18)
at node.js:980:3
Aquí está mi comando de prueba de package.json:
"test": "mocha --compilers js:babel-core/register ''+(test|src)/**/*Spec.js''"
Esta publicación de StackOverflow es similar, pero no ofrece una solución para mi uso de la línea de comando: importar un módulo desde node_modules con babel pero falló
Bueno, seguro que tendrá ese problema, está utilizando ES6 que mocha no sabe
Entonces estás usando babel pero no lo usas en tu prueba ...
Pocas soluciones
A. si está ejecutando con NPM use
"test": "mocha --compilers js:babel-core/register test*.js"
B. estoy usando
"test": "./node_modules/.bin/mocha --compilers js:babel-core/register **/*spec.jsx"
C. De cli:
mocha --compiladores js: babel-core / register test * .js
Puede leer más en http://www.pauleveritt.org/articles/pylyglot/es6_imports/
Encontré que la forma más fácil de hacerlo con babel 6.XX era usar nyc y luego agregar un archivo
helper
en
pckage.json
Así que aquí está lo que usé
package.json
{
....
"scripts": {
"test": "nyc mocha --reporter tap ''test/**/*.spec.js''"
},
"devDependencies": {
"babel-cli": "^6.24.0",
"babel-core": "^6.24.0",
"babel-loader": "^6.4.0",
"babel-preset-env": "^1.2.2",
"babel-preset-es2015": "^6.24.0",
"babel-preset-react": "^6.23.0",
"babel-preset-react-hmre": "^1.1.1",
"babel-preset-stage-2": "^6.22.0",
"babel-register": "^6.24.0",
"babel-runtime": "^6.23.0",
"chai": "^3.5.0",
"mocha": "^3.2.0",
"nyc": "^10.1.2",
"webpack": "^2.3.3",
"webpack-config": "^7.0.0",
"webpack-dashboard": "^0.3.0",
"webpack-dev-server": "^2.4.2"
},
"nyc": {
"all": true,
"include": [
"src/**/*.js"
],
"cache": true,
"require": [
"./test/helper/registerBabel.js"
]
}
}
babelrc
{
"presets": [
"es2015", //remove the {modules: false} it doesn''t work with this
"stage-2"
]
}
registerBabel.js
/* eslint-disable import/no-commonjs, import/unambiguous */
require(''babel-register'')();
Ahora podrá usar es6 en sus pruebas o donde lo necesite. Los míos están fallando;)
Luego,
npm run test
que activará
nyc mocha --reporter tap ''test/**/*.spec.js''
Es posible que deba
especificar la opción de
extensions
si está utilizando TypeScript:
require("@babel/register")({
extensions: [''.jsx'', ''.js'', ''.ts'', ''.tsx'']
})
Esto es lo que funcionó para mí.
Recibí una advertencia al usar la bandera
--compilers
.
DeprecationWarning: "--compilers" se eliminará en una versión futura de Mocha; ver https://git.io/vdcSr para más información
Por lo tanto, lo reemplacé con la bandera
--require
"test": "mocha --require babel-core/register --recursive"
Aquí está mi
.babelrc
:
{
"presets": ["env"]
}
Mis dependencias de desarrollo
package.json
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-preset-env": "^1.7.0",
"mocha": "^5.2.0",
}
Estoy agregando otra respuesta de configuración ES6 + mocha + babel aquí, actual a partir de junio ''19 (consulte las fechas en respuesta / comentario).
mocha ha desaprobado el indicador
--compiler
, y la versión que estoy usando no está disponible incluso con el indicador
--no-deprecation
, cf
this
Tenga en cuenta que no incluiré todos los bits relevantes de las páginas enlazadas, porque ninguno de ellos me llevó a una compilación de prueba limpia basada en las últimas versiones de mocha y babel; Esta respuesta debe incluir los pasos que me llevaron a una prueba de compilación exitosa.
Siguiendo las instrucciones aquí, y en
esta respuesta
, y
here
, intenté instalar lo que parecía ser la última
npm install
mínima de babel usando
npm install
:
$ npm install --save-dev mocha
$ npm install --save-dev @babel/preset-env
Y ajusté la invocación de mocha en package.json, así:
"scripts": {
"test": "mocha --compilers js:@babel/register"
}
Esto condujo a errores:
× ERROR: --compilers is DEPRECATED and no longer supported.
Como se
--no-deprecation
anteriormente,
--no-deprecation
no ayudó, consulte la página vinculada anteriormente.
Entonces, siguiendo las instrucciones de
this
, ajusté package.json:
"scripts": {
"test": "mocha --require js:@babel/register"
}
Y comenzó a ver errores sobre la ubicación de los módulos de babel, como:
× ERROR: Cannot find module ''@babel/register''
En este punto comencé a instalar paquetes de babel hasta que pudiera progresar. Creo que la instalación completa es algo así como:
$ npm install --save-dev @babel/preset-env @babel/register @babel/core
El último cambio requerido fue actualizar la invocación de mocha en package.json, eliminando el prefijo
js:
así:
"scripts": {
"test": "mocha --require @babel/register"
}
No puedo responder por qué esto era necesario: si alguien puede responder esto, deje un comentario y actualizaré mi respuesta con mejor información.
Lo último que hice fue crear un .babelrc en el directorio del proyecto, con el contenido:
{
"presets" : ["@babel/preset-env"]
}
No recuerdo qué provocó esto, pero
creo
que fue porque mocha continuó quejándose de no reconocer la palabra clave de
import
en mi test.js.
Como se indicó anteriormente, si alguien puede responder esto, deje un comentario y actualizaré mi respuesta con mejor información.
Instalé
mocha
y encontré exactamente el mismo error cuando uso
import
en mi código.
Al hacer las siguientes acciones, se solucionó el problema.
npm install babel-core --save-dev
npm install babel-preset-es2015 --save-dev
npm install babel-preset-stage-0 --save-dev
Y luego agregue un archivo
.babelrc
:
{
"presets": [
"es2015"
]
}
Y luego ejecuta
mocha
de esta manera:
mocha --compilers js:babel-core/register
Me encontré con el mismo problema. Después de haber probado cualquier otra solución en y más allá, agregar esta configuración simple en package.json lo hizo por mí:
"babel": {
"presets": [
"es2015"
]
}
Todas mis importaciones de ES6 funcionaron después de eso. Por cierto, tenía esta misma configuración dentro de webpack.config.js, pero aparentemente esta era la única forma de hacerlo funcionar también para las pruebas de mocha.
Espero que esto ayude a alguien.
Para cualquiera que use Babel 7 y Mocha 4, algunos de los nombres de los paquetes han cambiado un poco y la respuesta aceptada está un poco desactualizada. Lo que tuve que hacer fue:
npm install @babel/register --saveDev
y agregando
--require @babel/register
a la línea de prueba en
package.json
"test": "./node_modules/mocha/bin/mocha --require @babel/polyfill --require @babel/register ''./test/**/*.spec.js''"
El
@babel/polyfill
corrige algunas cosas como la funcionalidad async / wait si está usándolas.
Espero que ayude a alguien :)
Parece que la única solución es incluir explícitamente:
require(''babel-core/register'')({
ignore: /node_modules/(?!ProjectB)/
});
en un archivo auxiliar de prueba, y pasarlo a mocha en mi comando de prueba:
mocha --require ./test/testHelper.js...
La solución definitiva:
Agregue registerBabel.js : un archivo separado cuyo trabajo es requerir babel-core / register ...
require(''babel-core/register'')({
ignore: /node_modules/(?!ProjectB)/
});
Agregue entry.js si su aplicación también se basa en babel-node. Esto actúa como un contenedor para su aplicación que contiene es6.
require(''./registerBabel'');
require(''./server''); // this file has some es6 imports
Luego ejecutaría su aplicación con
node entry
Para las pruebas de mocha, testHelper.js también debe requerir registerBabel.js para inicializar el soporte de babel en tiempo de ejecución.
require(''./registerBabel'');
Y ejecute sus pruebas de
mocha --require ./testHelper.js ''+(test)/**/*Spec.js''
con
mocha --require ./testHelper.js ''+(test)/**/*Spec.js''
Esto probará recursivamente cualquier archivo que termine en "Spec.js" dentro de "./test". Sustituya el patrón por uno que coincida con las especificaciones de su proyecto.
Resolví este problema esta mañana con las siguientes instrucciones
Instalar módulos NPM
npm install --save-dev @babel/polyfill
npm install --save-dev @babel/register
package.json :
"scripts": {
"test": "mocha --require @babel/register --require @babel/polyfill src/DesktopApplication/Tests",
}
.babelrc
{
"presets": ["@babel/env"]
}
Resolví este problema esta mañana con las siguientes instrucciones de las instrucciones oficiales de Uso de Babel para Mocha 4:
Instalar módulos NPM
npm install --save-dev babel-polyfill
npm install --save-dev babel-preset-env
npm install --save-dev babel-register
o un solo comando:
npm i -d babel-polyfill babel-preset-env babel-register
package.json :
"scripts": {
"test": "mocha --require babel-polyfill --require babel-register"
}
.babelrc
{
"presets": ["env"]
}
Tenía
{"modules": false}
en mi archivo .babelrc, así:
"presets": [
["es2015", {"modules": false}],
"stage-2",
"react"
]
que estaba tirando
Importación de token inesperada
Una vez que lo eliminé, el mocha se ejecutó con éxito.
Tuve el mismo problema y lo solucioné leyendo la documentación de Babel para integrar Babel con Mocha:
{
"scripts": {
"test": "mocha --compilers js:babel-register"
}
}
Yo tuve el mismo problema.
Cuando ejecuté pruebas, me di cuenta de que realmente quería tropezar con módulos dependientes.
Es bueno para pruebas unitarias y evita que Babel transforme submódulos.
Entonces utilicé
proxyquire
, a saber:
const proxyquire = require(''proxyquire'').noCallThru()
const myTestedModule = proxyquire(''../myTestedModule'', {
''dependentModule1'': { //stubbed module1 },
''dependentModule2'': { //stubbed module2 }
})
para una configuración más a prueba de futuro
npm install babel-preset-latest --save-dev
y en .babelrc
{
"presets": [ "latest" ]
}
Opuesto a...
npm install babel-preset-es2015 --save-dev
y
{
"presets": [ "es2015" ]
}
--compilers
está en desuso.
Mi solución simple:
npm install --save-dev babel-core
Y en el package.json agregue su script de prueba de esta manera:
"scripts": {
"test": "mocha --require babel-core/register ./test/**/*.js -r ./test-setup.js"
},