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.