Nieoczekiwany import tokena Babel podczas uruchamiania testów mokka


95

Rozwiązania oferowane w innych powiązanych pytaniach, takich jak włączenie odpowiednich ustawień wstępnych (es2015) w .babelrc, są już zaimplementowane w moim projekcie.

Mam dwa projekty (nazwijmy je A i B), które używają składni modułu ES6. W projekcie A importuję projekt B, który jest instalowany przez npm i znajduje się w folderze node_modules. Kiedy uruchamiam zestaw testów dla projektu A, pojawia się błąd:

SyntaxError: Nieoczekiwany import tokenu

Który jest poprzedzony tym rzekomo błędnym wierszem kodu z Projektu B:

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

Wydaje się, że iife jest czymś związanym z npm lub prawdopodobnie babel, ponieważ mój plik źródłowy zawiera tylko „import createBrowserHistory z 'history / lib / createBrowserHistory'; Testy jednostkowe w zestawie testów projektu B działają dobrze, a jeśli usunę projekt B jako zależność z Projekt A, mój zestaw testów (nadal używający importu es6 dla wewnętrznych modułów projektu) działa dobrze.

Pełny ślad stosu:

 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

Oto moje polecenie testowe z package.json:

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

Ten post StackOverflow jest podobny, ale nie oferuje rozwiązania dla mojego użycia wiersza poleceń: zaimportuj moduł z node_modules za pomocą babel, ale nie powiodło się


1
Jeśli dystrybuujesz moduł na npm, powinieneś rozprowadzać tylko transpiled wersję tego modułu.
loganfsmyth

Ten projekt jest bardzo lekki. Jest przeznaczony głównie do użytku własnego lub innych, jeśli mają wdrożony proces transpiracji, który może go wspierać. W tych zależnościach próbuję uzyskać „waniliowe es6”.
ThinkingInBits

2
Myślę, że zapomniałeś skonfigurować babel w package.json. dodaj je do swojego package.json "babel": {"presets": ["es2015"]}
Jacob

3
Uwaga: zgodnie z dokumentacją --compilers nie jest to konieczne, --require babel-registerzamiast tego należy użyć: "Jeśli twoje moduły ES6 mają rozszerzenie .js, możesz npm zainstalować --save-dev babel-register i użyć mocha --require babel-register; --compilers jest konieczne tylko wtedy, gdy musisz określić rozszerzenie pliku ”.
spróbuj złapać wreszcie

1
W końcu udało mi się to uruchomić, używając "babel":{"presets": ["es2015"]}tego było ostatnią rzeczą, której mi brakowało!
Brandon,

Odpowiedzi:


81

Dla Babel <6

Najłatwiejszym sposobem rozwiązania tego problemu jest:

  1. npm install babel-preset-es2015 --save-dev
  2. Dodaj .babelrcdo katalogu głównego projektu z zawartością:

    {
     "presets": [ "es2015" ]
    }
    

Upewnij się, że używasz mokki z parametrem „--compilers js: babel-core / register”.

Dla Babel6 / 7 +

  1. npm install @babel/preset-env --save-dev
  2. Dodaj .babelrcdo katalogu głównego projektu z zawartością:

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

Upewnij się, że używasz mokki z parametrem --compilers js:babel-register(Babel 6) lub --compilers js:@babel/register(Babel 7)

W przypadku mokki w wersji 7 lub nowszej użyj odpowiednio --require babel-registerlub --require @babel/register.


27
spróbuj uruchomić mokkę z parametrem --require babel-register
kolec

2
@kolec To działa. Nawet lepiej, stwórz mocha.optsplik w katalogu głównym / test i dodaj go tam
Martin Dawson

3
To wszystko razem nadal nie pomaga (wiersz poleceń, nie mocha.opts).
Kev,

3
Jeśli chcesz używać es2016, pamiętaj, że es2016 w Babel „kompiluje tylko to, co jest w ES2016 do ES2015”, więc potrzebujesz zarówno es2016, jak i es2015 w swojej tablicy presetów
prauchfuss

4
--compilersjest teraz przestarzała. Użyj --requirezamiast tego.
robsch

46

Wydaje się, że jedynym rozwiązaniem jest wyraźne uwzględnienie:

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

w testowym pliku pomocnika i przekaż go do mokka w moim poleceniu testowym:

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

Ostateczne rozwiązanie:

Dodaj registerBabel.js : oddzielny plik, którego zadaniem jest wymaganie babel-core / register ...

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

Dodaj plik entry.js, jeśli Twoja aplikacja również korzysta z węzła babel. Działa jak opakowanie dla aplikacji zawierającej es6.

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

Następnie uruchomisz aplikację z rozszerzeniem node entry

W przypadku testów mokka testHelper.js powinien również wymagać registerBabel.js, aby zainicjować obsługę babel w czasie wykonywania.

require('./registerBabel');

I uruchom testy mokki z mocha --require ./testHelper.js '+(test)/**/*Spec.js'

Spowoduje to rekurencyjne przetestowanie dowolnego pliku kończącego się na „Spec.js” w obrębie „./test”. Zastąp wzorzec takim, który pasuje do specyfikacji Twojego projektu.


3
Wygląda na to, że ignoreregex jest trochę wyłączony. Musiałem dodać uciekający lewy ukośnik tuż po node_modules: ignore: /node_modules\/(?!ProjectB)/aby plik babelRegister działał. W przeciwnym razie wydaje się świetne!
hellatan

To nie pozwala nam używać Rollupify z powodu instrukcji wymagania. Czy znałbyś sposób na zrobienie tego bez używania instrukcji wymagania?
MikesBarto2002

To świetnie, ale co z narzędziami, które nie pozwalają na dodawanie takiego kodu i chcą bezpośrednio uruchamiać pliki. Wtedy kończy się to, babel-nodeco nie pozwala na używanie czegoś takiego .babelrc.
Evgeny

1
Jesteś niesamowity! Babel przetwarzał mój kod ES6 podczas uruchamiania serwera, ale testy mokka kończyły się niepowodzeniem. Twoja odpowiedź rozwiązała problem. Próbowałem - kompilatory w mocha.opts, ale spowodowało to niepowodzenie instrukcji importu.
Energetic Pixels

1
Nie mogłem tego uruchomić, ale okazało się, że potrzebowałem również rozszerzyć mój babelrc: `` require ('@ babel / register') ({extends: './.babelrc', ignore: [/ node_modules \ / (?! ProjektB) /]}); ``
TiggerToo

26

Na pewno będziesz mieć ten problem, używasz ES6, którego mokka nie zna

Więc używasz babel, ale nie używasz go w swoim teście ...

Kilka rozwiązań:

A. jeśli korzystasz z NPM użyj

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

B. używam

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

C. Z CLI:

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

Możesz przeczytać więcej na http://www.pauleveritt.org/articles/pylyglot/es6_imports/


1
Dziękuję bardzo! Brakowało mi opcji --compilers js: babel-core / register
mycargus

1
Już to robiłem ... czy w ogóle przeczytałeś pierwsze pytanie?
ThinkingInBits

1
@ThinkingInBits Czego ostatecznie użyłeś, jak (jeśli to rozwiązałeś) rozwiązałeś problem? Mam tutaj poważne problemy, wypróbowałem większość z tych opcji
Mediolan Velebit

--compilersjest teraz przestarzała, wygląda na --requireto , że jest to jedyna bezpieczna opcja
Ali Ghanavatian

23

Napotkałem ten sam problem. Wypróbowałem każde inne rozwiązanie na stackoverflow i nie tylko, dodając tę ​​prostą konfigurację na package.json zrobiło to za mnie:

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

Wszystkie moje importy z ES6 działały później. Nawiasem mówiąc, miałem tę samą konfigurację w webpack.config.js, ale najwyraźniej był to jedyny sposób, aby działał również w testach mokki.

Mam nadzieję, że to komuś pomoże.


miałem plik .babelrc napisany nieprawidłowo, więc początkowo nie działał. To rozwiązanie działa i jest rozwiązaniem zalecanym. Utwórz plik .babelrc w swoim projekcie i dodaj {"presets": ["es2015"]}
AfDev

14

Miałem {"modules": false}w swoim pliku .babelrc, tak:

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

który rzucał

Nieoczekiwany import tokena

Po usunięciu mokka działała pomyślnie.


Zostało to wygenerowane przez Webpacker for Rails: `` "presets": [["env", {"modules": false, "target": {"browser": "> 1%", "uglify": true}, "useBuiltIns": true}], "reaguj" `` Po usunięciu linii modułów zadziałało.
emptywalls,

To rozwiązało mój problem, gdy CircleCI nie mógł uruchomić moich testów jednostkowych jest i dał mi nieoczekiwany błąd importu tokenu. +1!
Candlejack

Zrobiło to dla mnie. Rails, Webpacker itp ... Dzięki!
emptywalls

8

Miałem ten sam problem i naprawiłem go, czytając dokumentację Babel dotyczącą integracji Babel z Mocha:

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

Do której wersji Mocha i Babel?
Ognyan Dimitrov

Moje wersje Babel to 6.26.0z wyjątkiem "babel-preset-env": "1.6.0"i "mocha": "3.5.3"
bhantol

Dziwne. To rozwiązało mój problem i było w moim przypadku czystym problemem z odczytem dokumentu.
Ognyan Dimitrov

6

Dla każdego, kto używa Babel 7 i Mocha 4, niektóre nazwy pakietów nieco się zmieniły, a zaakceptowana odpowiedź jest nieco przestarzała. Musiałem zrobić:

npm install @babel/register --saveDev

i dodając --require @babel/registerdo linii testowejpackage.json

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

Te @babel/polyfillpoprawki niektóre rzeczy jak asynchroniczny / czekają funkcjonalności, jeśli zdarzy ci się być za pomocą tych.

Mam nadzieję, że to komuś pomoże :)


4

Dodaję tutaj kolejną odpowiedź na konfigurację ES6 + mokka + babel, aktualną na czerwiec 1919 roku (patrz daty odpowiedzi / komentarza). Mokka wycofała --compilerflagę, a wersja, której używam, jest niedostępna nawet z --no-deprecationflagą, por to

Zwróć uwagę, że nie dołączę wszystkich odpowiednich fragmentów z powiązanych stron, ponieważ żaden z nich nie doprowadził mnie do czystej wersji testowej opartej na najnowszych wersjach mokki i babel; ta odpowiedź powinna zawierać kroki, które doprowadziły mnie do pomyślnej kompilacji testowej.

Postępując zgodnie z instrukcjami tutaj, w tej odpowiedzi i tutaj , próbowałem zainstalować coś, co wydawało się być najmniejszym najnowszym babel, używając npm install:

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

I dostosowałem wywołanie mokka w package.json, na przykład:

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

Doprowadziło to do błędów:

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

Jak wyżej, --no-deprecationnie pomogło, proszę odnieść się do strony, do której link znajduje się powyżej. Postępując zgodnie z instrukcjami tutaj , dostosowałem plik package.json:

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

Zacząłem widzieć błędy dotyczące lokalizowania modułów Babel, takie jak:

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

W tym momencie zacząłem instalować pakiety babel, dopóki nie mogłem przejść dalej. Uważam, że pełna instalacja to coś takiego:

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

Ostatnią wymaganą zmianą było zaktualizowanie wywołania mokki w package.json, usuwając js:prefiks, na przykład:

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

Nie mogę odpowiedzieć, dlaczego było to konieczne: jeśli ktoś może odpowiedzieć na to pytanie, zostaw komentarz, a zaktualizuję moją odpowiedź o lepsze informacje.

Ostatnią rzeczą jaką zrobiłem było utworzenie .babelrc w katalogu projektu, z zawartością:

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

Nie pamiętam, co to spowodowało, ale wydaje mi się , że stało się tak, ponieważ mocha nadal narzekała, że ​​nie rozpoznaje importsłowa kluczowego w moim test.js. Jak wyżej, jeśli ktoś może odpowiedzieć na to pytanie, zostaw komentarz, a ja zaktualizuję moją odpowiedź o lepsze informacje.


W tym momencie mogę pomyślnie przeprowadzić testy mokki. Zdaję sobie sprawę, że w mojej wiedzy są luki: napisałem dużo produkcyjnego kodu javascript, ale jestem względnym noobem węzła. Każdy, kto widzi to i więcej do dodania do odpowiedzi, zostaw komentarz, a ja poprawię odpowiedź LUB zostawię własną, lepszą odpowiedź.
pb2q

3

--compilers jest przestarzałe.

Moje proste rozwiązanie:

npm install --save-dev babel-core

A w pliku package.json dodaj swój skrypt testowy w następujący sposób:

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

2

Odkryłem, że najłatwiejszym sposobem na użycie babel 6.XX jest użycie nyc, a następnie dodanie helperpliku dopckage.json

Więc oto, czego użyłem

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

Teraz będziesz mógł używać es6 w swoich testach lub gdziekolwiek potrzebujesz. Moje wszystkie zawodzą;)

Wtedy npm run testktóry wybuchnienyc mocha --reporter tap 'test/**/*.spec.js'


2

Oto, co zadziałało dla mnie. Otrzymałem ostrzeżenie podczas używania --compilersflagi.

Ostrzeżenie o wycofaniu: „--compilers” zostanie usunięte w przyszłej wersji Mocha; zobacz https://git.io/vdcSr, aby uzyskać więcej informacji

Dlatego zastąpiłem go --requireflagą

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

Oto moje .babelrc:

{
  "presets": ["env"]
}

Moje package.jsonzależności od deweloperów

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

2

Dzisiaj rano rozwiązałem ten problem, postępując zgodnie z poniższymi instrukcjami

Zainstaluj moduły 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

Rozwiązałem ten problem dziś rano, postępując zgodnie z instrukcjami z oficjalnych instrukcji używania Babel dla Mocha 4:

Zainstaluj moduły NPM

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

lub pojedyncze polecenie:

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

Zainstalowałem mochai napotkałem dokładnie ten sam błąd, gdy używam importw moim kodzie. Wykonując następujące czynności, problem został rozwiązany.

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

A następnie dodaj .babelrcplik:

{
    "presets": [
        "es2015"
    ]
}

A potem biegnij mochaw ten sposób:

mocha --compilers js:babel-core/register

-1

Miałem ten sam problem. Podczas przeprowadzania testów zdałem sobie sprawę, że tak naprawdę chcę usunąć moduły zależne. Jest dobry do testowania jednostkowego i zapobiega przekształcaniu podmodułów przez Babel. Więc użyłem proxyquire, a mianowicie:

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

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

To lepiej pasuje jako komentarz.
Gajus

-3

aby uzyskać bardziej przyszłościowe ustawienie

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

i w .babelrc

{
  "presets": [ "latest" ]
}

w przeciwieństwie do ...

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

i

{
 "presets": [ "es2015" ]
}

2
Myślę, że ta odpowiedź praktycznie nie jest związana z tym pytaniem .. a raczej można ją dodać jako komentarz do innej odpowiedzi
62mkv

@ 62mkv Dzięki! Sposób na bycie jastrzębiem i utrzymywanie tego miejsca w czystości.
Phil Henry Mcboob,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.