Importazione imprevista di token Babel durante l'esecuzione di test mocha


92

Le soluzioni offerte in altre domande correlate, come l'inclusione dei preset appropriati (es2015) in .babelrc, sono già implementate nel mio progetto.

Ho due progetti (chiamiamoli A e B) che utilizzano entrambi la sintassi del modulo ES6. Nel progetto A, sto importando il progetto B che viene installato tramite npm e risiede nella cartella node_modules. Quando eseguo la mia suite di test per il progetto A, ricevo l'errore:

SyntaxError: importazione di token imprevista

Che è preceduto da questa presunta riga di codice errata dal progetto B:

(function (export, require, module, __filename, __dirname) {import createBrowserHistory from 'history / lib / createBrowserHistory';

L'iife sembra essere qualcosa di npm o possibilmente correlato a babel poiché il mio file sorgente contiene solo "import createBrowserHistory da 'history / lib / createBrowserHistory' '; I test unitari nella suite di test del Progetto B funzionano bene, e se rimuovo il Progetto B come dipendenza da Il progetto A, la mia suite di test quindi (ancora utilizzando le importazioni es6 per i moduli di progetto interni) funziona perfettamente.

Traccia stack completo:

 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

Ecco il mio comando di prova da package.json:

"test": "mocha --compilers js:babel-core/register '+(test|src)/**/*Spec.js'"

Questo post StackOverflow è simile ma non offre una soluzione per il mio utilizzo della riga di comando: importa un modulo da node_modules con babel ma non è riuscito


1
Se stai distribuendo un modulo su npm, dovresti distribuire solo la versione transpilata di quel modulo.
loganfsmyth

Questo progetto è molto leggero. È inteso principalmente per il mio uso o per altri se hanno un processo di traspirazione in atto che può supportarlo. Sto cercando di ottenere "vanilla es6" in queste dipendenze.
ThinkingInBits

2
Penso che ti dimentichi di configurare babel in package.json. aggiungili al tuo package.json "babel": {"presets": ["es2015"]}
Jacob

3
Nota: secondo la documentazione --compilers non è necessario, --require babel-registerdovrebbe essere usato invece: "Se i tuoi moduli ES6 hanno estensione .js, puoi installare con npm --save-dev babel-register e usare mocha --require babel-register; --compilers è necessario solo se è necessario specificare un'estensione di file. "
prova a catturare finalmente il

1
Finalmente sono riuscito a farlo funzionare usandolo "babel":{"presets": ["es2015"]}era l'ultima cosa che mi mancava!
Brandon

Risposte:


79

Per Babel <6

Il modo più semplice per risolvere questo problema è:

  1. npm install babel-preset-es2015 --save-dev
  2. Aggiungi .babelrcalla radice del progetto con i contenuti:

    {
     "presets": [ "es2015" ]
    }

Assicurati di eseguire mocha con il parametro "--compilers js: babel-core / register".

Per Babel6 / 7 +

  1. npm install @babel/preset-env --save-dev
  2. Aggiungi .babelrcalla radice del progetto con i contenuti:

    {
     "presets": [ "@babel/preset-env" ]
    }

Assicurati di eseguire mocha con il parametro --compilers js:babel-register(Babel 6) o --compilers js:@babel/register(Babel 7)

Per mocha versione 7 o successiva, usa --require babel-registero --require @babel/registerrispettivamente.


27
prova a eseguire mocha con --require babel-register param
kolec

2
@kolec Funziona. Ancora meglio, crea un mocha.optsfile nella directory principale / test e aggiungilo lì
Martin Dawson

3
Tutto questo insieme ancora non aiuta (riga di comando, non mocha.opts).
Kev

3
Se vuoi usare es2016, tieni presente che es2016 in Babel "Compila solo quello che c'è da ES2016 a ES2015" quindi hai bisogno sia di es2016 che di es2015 nel tuo array di preset
prauchfuss

4
--compilersè ora deprecato. Usa --requireinvece.
robsch

46

Sembra che l'unica soluzione sia includere esplicitamente:

require('babel-core/register')({
  ignore: /node_modules/(?!ProjectB)/
}); 

in un file helper di test e passalo a mocha nel mio comando di test:

mocha --require ./test/testHelper.js...

La soluzione finale:

Aggiungi registerBabel.js : un file separato il cui compito è richiedere babel-core / register ...

require('babel-core/register')({
  ignore: /node_modules/(?!ProjectB)/
});

Aggiungi un entry.js se la tua applicazione si basa anche su babel-node. Questo funge da wrapper per la tua applicazione contenente es6.

require('./registerBabel');
require('./server'); // this file has some es6 imports

Dovresti quindi eseguire la tua applicazione con node entry

Per il test della moka, testHelper.js dovrebbe richiedere anche registerBabel.js per inizializzare il supporto babel in fase di esecuzione.

require('./registerBabel');

Ed esegui i tuoi test di moka con mocha --require ./testHelper.js '+(test)/**/*Spec.js'

Ciò verificherà ricorsivamente qualsiasi file che termina con "Spec.js" all'interno di "./test". Sostituisci il modello con uno che corrisponda alle specifiche del tuo progetto.


3
Sembra che la ignoreregex sia un po 'fuori posto. Ho dovuto aggiungere una barra rovesciata di escape subito dopo node_modules: ignore: /node_modules\/(?!ProjectB)/affinché il file babelRegister funzionasse. Altrimenti sembra fantastico!
hellatan

Questo non ci consente di utilizzare Rollupify a causa delle istruzioni require. Sapresti un modo per farlo senza usare le istruzioni require?
MikesBarto2002

Questo è fantastico, ma per quanto riguarda gli strumenti che non consentono di aggiungere codice come questo e vogliono eseguire direttamente i tuoi file. Quindi finisci con il babel-nodequale non consente l'utilizzo di una cosa del genere .babelrc.
Evgeny

1
sei fantastico! Babel stava elaborando il mio codice ES6 quando eseguivo il server, ma il test di mocha falliva. La tua risposta lo ha risolto. Ho provato --compilers in mocha.opts ma questo ha causato il fallimento delle istruzioni di importazione.
Pixel energetici

1
Non riuscivo a farlo funzionare, ma si è scoperto che avevo anche bisogno di estendere il mio babelrc: `` require ('@ babel / register') ({extends: './.babelrc', ignore: [/ node_modules \ / (?! ProgettoB) /]}); ``
TiggerToo

26

Beh, certo che avrai quel problema, stai usando ES6 che mocha non conosce

Quindi stai usando Babel ma non lo usi nel tuo test ...

Poche soluzioni:

A. se stai usando NPM usa

"test": "mocha --compilers js:babel-core/register test*.js"

B. Sto usando

"test": "./node_modules/.bin/mocha --compilers js:babel-core/register **/*spec.jsx"

C. Da cli:

mocha --compilers js: babel-core / register test * .js

Puoi leggere di più su http://www.pauleveritt.org/articles/pylyglot/es6_imports/


1
grazie mille! Mi mancava l'opzione --compilers js: babel-core / register
mycargus

1
Lo stavo già facendo ... hai letto la domanda iniziale?
ThinkingInBits

1
@ThinkingInBits Cosa hai finito per usare, come hai (se l'hai fatto) a risolvere il problema? Sto avendo grossi problemi qui, ho provato la maggior parte di queste opzioni
Milan Velebit

--compilersè deprecato ora, sembra che --requiresia l'unica opzione sicura per andare
Ali Ghanavatian

23

Mi sono imbattuto nello stesso problema. Avendo provato ogni altra soluzione su stackoverflow e oltre, l'aggiunta di questa semplice configurazione su package.json l'ha fatto per me:

  "babel": {
    "presets": [
      "es2015"
    ]
  }

Tutte le mie importazioni ES6 hanno funzionato dopo. A proposito, avevo questa stessa configurazione all'interno di webpack.config.js, ma a quanto pare questo era l'unico modo per farlo funzionare anche per i test di moka.

Spero che questo aiuti qualcuno.


avevo un file .babelrc scritto in modo errato, quindi inizialmente non funzionava. Questa soluzione funziona ed è la soluzione consigliata. Crea un file .babelrc nel tuo progetto e aggiungi {"preset": ["es2015"]}
AfDev

14

Avevo {"modules": false}nel mio file .babelrc, in questo modo:

"presets": [
    ["es2015", {"modules": false}],
    "stage-2",
    "react"
]

che stava gettando

Importazione di token imprevista

Una volta rimosso, mocha è stato eseguito correttamente.


Questo è stato generato da Webpacker per Rails: `` `" presets ": [[" env ", {" modules ": false," target ": {" browsers ":"> 1% "," uglify ": ​​true}, "useBuiltIns": true}], "react" `` Una volta rimossa la riga dei moduli, ha funzionato per me.
pareti vuote

Questo ha risolto il mio problema quando CircleCI non riusciva a eseguire i miei test unitari scherzosi e mi dava l'errore imprevisto di importazione del token. +1!
Candlejack

Questo ha fatto per me. Rails, Webpacker, ecc ... Grazie!
emptywalls

8

Ho avuto lo stesso problema e l'ho risolto leggendo dalla documentazione di babel per l'integrazione di Babel con Mocha:

{
  "scripts": {
    "test": "mocha --compilers js:babel-register"
  }
}

Per quale versione di Mocha and Babel?
Ognyan Dimitrov

Le mie versioni di Babel sono 6.26.0eccetto "babel-preset-env": "1.6.0"e "mocha": "3.5.3"
bhantol

Strano. Questo ha risolto il mio problema e nel mio caso è stato un puro problema di lettura del documento.
Ognyan Dimitrov

6

Per chiunque utilizzi Babel 7 e Mocha 4, alcuni dei nomi dei pacchetti sono leggermente cambiati e la risposta accettata è un po 'obsoleta. Quello che dovevo fare era:

npm install @babel/register --saveDev

e aggiungendo --require @babel/registeralla linea di test inpackage.json

"test": "./node_modules/mocha/bin/mocha --require @babel/polyfill --require @babel/register './test/**/*.spec.js'"

Le @babel/polyfillcorrezioni di alcune cose come asincrona / funzionalità attende se vi capita di essere con quelli.

Spero che aiuti qualcuno :)


3

--compilers è deprecato.

La mia semplice soluzione:

npm install --save-dev babel-core

E nel package.json aggiungi il tuo script di test in questo modo:

  "scripts": {
    "test": "mocha --require babel-core/register ./test/**/*.js -r ./test-setup.js"
  },

3

Sto aggiungendo un'altra risposta di configurazione ES6 + mocha + babel qui, attuale a giugno '19 (fare riferimento alle date su answer / commente). mocha ha deprecato il --compilerflag, e la versione che sto usando lo ha non disponibile anche con --no-deprecationflag, cfr this

Nota che non includerò tutti i bit rilevanti dalle pagine collegate, perché nessuno di loro mi ha portato a una build di prova pulita basata sulle ultime versioni di mocha e babel; questa risposta dovrebbe includere i passaggi che mi hanno portato a una build di prova di successo.

Seguendo le istruzioni qui, e in questa risposta , e qui , ho provato a installare quella che sembrava essere l'ultima babele minima usando npm install:

$ npm install --save-dev mocha
$ npm install --save-dev @babel/preset-env

E ho modificato l'invocazione di mocha in package.json, in questo modo:

"scripts": {
    "test": "mocha --compilers js:@babel/register"
}

Ciò ha portato a errori:

× ERROR: --compilers is DEPRECATED and no longer supported.

Come sopra, --no-deprecationnon ha aiutato, fare riferimento alla pagina collegata sopra. Quindi, seguendo le istruzioni da qui, ho modificato package.json:

"scripts": {
    "test": "mocha --require js:@babel/register"
}

E ha iniziato a vedere errori sull'individuazione dei moduli babel, come:

× ERROR: Cannot find module '@babel/register'

A questo punto ho iniziato a installare i pacchetti babel finché non ho potuto progredire. Credo che l'installazione completa sia qualcosa del tipo:

$ npm install --save-dev @babel/preset-env @babel/register @babel/core

L'ultima modifica richiesta è stata l'aggiornamento della chiamata mocha in package.json, rimuovendo il js:prefisso, in questo modo:

"scripts": {
    "test": "mocha --require @babel/register"
}

Non so rispondere perché fosse necessario: se qualcuno può rispondere, lascia un commento e aggiornerò la mia risposta con informazioni migliori.

L'ultima cosa che ho fatto è stata creare un .babelrc nella directory del progetto, con il contenuto:

{
    "presets" : ["@babel/preset-env"]
}

Non riesco a ricordare cosa lo abbia provocato, ma credo che fosse perché mocha ha continuato a lamentarsi di non aver riconosciuto la importparola chiave nel mio test.js. Come sopra, se qualcuno può rispondere, lascia un commento e aggiornerò la mia risposta con informazioni migliori.


A questo punto posso eseguire con successo i miei test di moka. Mi rendo conto che qui ci sono delle lacune nella mia conoscenza: ho scritto molto codice javascript di produzione ma sono un noob relativo al nodo. Chiunque veda questo con più da aggiungere alla risposta, per favore lascia un commento e migliorerò la risposta, O lascia la tua risposta migliore.
pb2q

2

Ho scoperto che il modo più semplice per farlo con babel 6.XX era usare nyc e quindi aggiungere un helperfile nel filepckage.json

Quindi ecco cosa ho usato

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')();

Ora sarai in grado di utilizzare es6 nei tuoi test o ovunque tu ne abbia bisogno. I miei stanno tutti fallendo;)

Quindi npm run testche si spegnerànyc mocha --reporter tap 'test/**/*.spec.js'


2

Ecco cosa ha funzionato per me. Ho ricevuto un avviso quando utilizzo la --compilersbandiera.

DeprecationWarning: "--compilers" verrà rimosso in una versione futura di Mocha; vedere https://git.io/vdcSr per maggiori informazioni

L'ho quindi sostituito con la --requirebandiera

"test":  "mocha --require babel-core/register --recursive"

Ecco il mio .babelrc:

{
  "presets": ["env"]
}

Le mie package.jsondipendenze dev

"devDependencies": {
  "babel-cli": "^6.26.0",
  "babel-preset-env": "^1.7.0",
  "mocha": "^5.2.0",
}

2

Ho risolto questo problema questa mattina con le seguenti istruzioni

Installa i moduli 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"]
}

1

Ho risolto questo problema questa mattina con le seguenti istruzioni dalle istruzioni ufficiali di Using Babel per Mocha 4:

Installa i moduli NPM

npm install --save-dev babel-polyfill
npm install --save-dev babel-preset-env
npm install --save-dev babel-register

o un singolo 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"]
}


0

Ho installato mochae ho riscontrato lo stesso identico errore quando uso importnel mio codice. Eseguendo le seguenti azioni, il problema è stato risolto.

npm install babel-core --save-dev
npm install babel-preset-es2015 --save-dev
npm install babel-preset-stage-0 --save-dev

E poi aggiungi un .babelrcfile:

{
    "presets": [
        "es2015"
    ]
}

E poi corri mochain questo modo:

mocha --compilers js:babel-core/register

-1

Ho avuto lo stesso problema. Durante l'esecuzione dei test mi sono reso conto che in realtà volevo stub i moduli dipendenti. È utile per i test unitari e impedisce a babel di trasformare i sottomoduli. Quindi ho usato proxyquire, vale a dire:

const proxyquire = require('proxyquire').noCallThru()

const myTestedModule = proxyquire('../myTestedModule', {
    'dependentModule1': { //stubbed module1 },
    'dependentModule2': { //stubbed module2 }
})

Questo è più adatto come commento.
Gajus

-3

per un ambiente più a prova di futuro

npm install babel-preset-latest --save-dev

e in .babelrc

{
  "presets": [ "latest" ]
}

al contrario di ...

npm install babel-preset-es2015 --save-dev

e

{
 "presets": [ "es2015" ]
}

2
Immagino che questa risposta non sia praticamente correlata a questa domanda .. o meglio, potrebbe essere aggiunta come commento a un'altra risposta
62mkv

@ 62mkv Grazie! Modo per essere un falco e mantenere pulito questo posto.
Phil Henry Mcboob
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.