Babel impor token yang tidak terduga saat menjalankan uji mocha


95

Solusi yang ditawarkan dalam pertanyaan terkait lainnya, seperti termasuk preset yang sesuai (es2015) di .babelrc, sudah diimplementasikan dalam proyek saya.

Saya memiliki dua proyek (sebut saja A dan B) yang keduanya menggunakan sintaks modul ES6. Di Proyek A, saya mengimpor Proyek B yang diinstal melalui npm dan tinggal di folder node_modules. Ketika saya menjalankan rangkaian pengujian saya untuk Proyek A, saya mendapatkan kesalahan:

SyntaxError: Impor token tak terduga

Yang didahului oleh baris kode keliru yang diduga dari Proyek B:

(fungsi (ekspor, memerlukan, modul, __filename, __dirname) {import createBrowserHistory dari 'history / lib / createBrowserHistory';

Iife tampaknya merupakan sesuatu yang berhubungan dengan npm atau babel karena file sumber saya hanya berisi "import createBrowserHistory dari 'history / lib / createBrowserHistory'; Pengujian unit dalam rangkaian pengujian Project B berjalan dengan baik, dan jika saya menghapus Project B sebagai dependensi dari Proyek A, rangkaian pengujian saya saat itu (masih menggunakan impor es6 untuk modul proyek internal) berfungsi dengan baik.

Pelacakan Tumpukan Penuh:

 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

Ini perintah pengujian saya dari package.json:

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

Posting StackOverflow ini serupa tetapi tidak menawarkan solusi untuk penggunaan baris perintah saya: impor modul dari node_modules dengan babel tetapi gagal


1
Jika Anda mendistribusikan modul di npm, Anda seharusnya hanya mendistribusikan versi transparan dari modul itu.
loganfsmyth

Proyek ini sangat ringan. Ini sebagian besar dimaksudkan untuk saya gunakan sendiri, atau orang lain jika mereka memiliki proses transpirasi di tempat yang dapat mendukungnya. Saya mencoba mencapai "vanilla es6" dalam dependensi ini.
ThinkingInBits

2
Saya pikir Anda lupa mengkonfigurasi babel di package.json. tambahkan itu ke package.json Anda "babel": {"presets": ["es2015"]}
Jacob

3
Catatan: menurut dokumentasi --compilers tidak diperlukan, --require babel-registersebaiknya digunakan sebagai gantinya: "Jika modul ES6 Anda memiliki ekstensi .js, Anda dapat npm install --save-dev babel-register dan menggunakan mocha --require babel-register; --compilers hanya diperlukan jika Anda perlu menentukan ekstensi file. "
coba-tangkap-akhirnya

1
Akhirnya saya bisa mendapatkan ini untuk bekerja dengan "babel":{"presets": ["es2015"]}itu adalah hal terakhir yang saya lewatkan!
Brandon

Jawaban:


81

Untuk Babel <6

Cara termudah untuk mengatasi masalah ini adalah:

  1. npm install babel-preset-es2015 --save-dev
  2. Tambahkan .babelrcke root proyek dengan konten:

    {
     "presets": [ "es2015" ]
    }
    

Pastikan Anda menjalankan mocha dengan parameter "--compilers js: babel-core / register".

Untuk Babel6 / 7 +

  1. npm install @babel/preset-env --save-dev
  2. Tambahkan .babelrcke root proyek dengan konten:

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

Pastikan Anda menjalankan mocha dengan parameter --compilers js:babel-register(Babel 6) atau --compilers js:@babel/register(Babel 7)

Untuk mocha versi 7 atau lebih baru, gunakan --require babel-registeratau --require @babel/registermasing - masing.


27
coba jalankan mocha dengan --require babel-register param
kolec

2
@kolec Ini berhasil. Bahkan lebih baik lagi, buat mocha.optsfile di root direktori / test dan tambahkan di sana
Martin Dawson

3
Semua ini bersama-sama masih tidak membantu (baris perintah, bukan mocha.opts).
Kev

3
Jika Anda ingin menggunakan es2016, perlu diingat bahwa es2016 di Babel "Hanya mengkompilasi apa yang ada di ES2016 untuk ES2015" sehingga Anda perlu baik es2016 dan es2015 dalam array preset Anda
prauchfuss

4
--compilerssekarang tidak digunakan lagi. Gunakan --requiresebagai gantinya.
robsch

46

Tampaknya satu-satunya solusi adalah secara eksplisit menyertakan:

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

dalam file pembantu tes, dan teruskan itu ke mocha dalam perintah pengujian saya:

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

Solusi terakhir:

Tambahkan registerBabel.js : file terpisah yang tugasnya membutuhkan babel-core / register ...

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

Tambahkan entry.js jika aplikasi Anda juga bergantung pada babel-node. Ini bertindak sebagai pembungkus untuk aplikasi yang berisi es6 Anda.

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

Anda kemudian akan menjalankan aplikasi Anda dengan node entry

Untuk pengujian mocha, testHelper.js harus membutuhkan registerBabel.js juga untuk menginisialisasi dukungan babel pada waktu proses.

require('./registerBabel');

Dan jalankan tes mocha Anda dengan mocha --require ./testHelper.js '+(test)/**/*Spec.js'

Ini akan menguji secara rekursif file apa pun yang diakhiri dengan "Spec.js" dalam "./test". Gantikan pola dengan yang cocok dengan spesifikasi dalam proyek Anda.


3
Tampaknya ignoreregex sedikit salah. Saya harus menambahkan garis miring terbalik tepat setelah node_modules: ignore: /node_modules\/(?!ProjectB)/agar file babelRegister berfungsi. Kalau tidak, sepertinya bagus!
hellatan

Ini tidak memungkinkan kami untuk menggunakan Rollupify karena pernyataan yang dibutuhkan. Apakah Anda tahu cara melakukan ini tanpa menggunakan pernyataan Requirement?
MikesBarto2002

Ini bagus, tapi bagaimana dengan alat yang tidak memungkinkan untuk menambahkan kode seperti ini dan ingin menjalankan file Anda secara langsung. Kemudian Anda berakhir dengan babel-nodeyang tidak mengizinkan hal seperti itu digunakan .babelrc.
Evgeny

1
Kamu luar biasa! Babel sedang memproses kode ES6 saya ketika hanya menjalankan server, tetapi pengujian mocha akan gagal. Jawaban Anda memecahkannya. Saya mencoba --compilers di mocha.opts tetapi itu menyebabkan pernyataan import gagal.
Piksel Energetik

1
Saya tidak bisa membuat ini berfungsi, tetapi ternyata saya juga perlu memperpanjang babelrc saya: `` require ('@ babel / register') ({extends: './.babelrc', ignore: [/ node_modules \ / (?! ProjectB) /]}); ``
TiggerToo

26

Anda pasti akan mengalami masalah itu, Anda menggunakan ES6 yang tidak diketahui oleh moka

Jadi Anda menggunakan babel tetapi Anda tidak menggunakannya dalam pengujian ...

Beberapa Solusi:

A. jika Anda menjalankan dengan menggunakan NPM

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

B. Saya menggunakan

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

C.Dari cli:

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

Anda dapat membaca lebih lanjut di http://www.pauleveritt.org/articles/pylyglot/es6_imports/


1
Terima kasih banyak! Saya kehilangan opsi --compilers js: babel-core / register
mycargus

1
Saya sudah melakukan ini ... apakah Anda bahkan membaca pertanyaan awal?
ThinkingInBits

1
@ThinkingInBits Apa yang akhirnya Anda gunakan, bagaimana Anda (jika Anda melakukannya) menyelesaikan masalah? Saya mengalami masalah parah di sini, mencoba sebagian besar opsi ini
Milan Velebit

--compilerssudah usang sekarang, sepertinya --requiresatu-satunya pilihan yang aman untuk dikunjungi
Ali Ghanavatian

23

Saya mengalami masalah yang sama. Setelah mencoba setiap solusi lain pada stackoverflow dan seterusnya, menambahkan konfigurasi sederhana ini pada package.json melakukannya untuk saya:

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

Semua impor ES6 saya berfungsi setelah itu. Ngomong-ngomong, saya memiliki konfigurasi yang sama di dalam webpack.config.js, tetapi ternyata ini adalah satu-satunya cara untuk membuatnya berfungsi untuk pengujian mocha juga.

Semoga ini bisa membantu seseorang.


Saya memiliki file .babelrc yang dieja dengan tidak benar, jadi awalnya tidak berfungsi. Solusi ini berfungsi dan merupakan solusi yang disarankan. Buat file .babelrc dalam proyek Anda dan tambahkan {"presets": ["es2015"]}
AfDev

14

Saya punya {"modules": false}di file .babelrc saya, seperti:

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

yang melempar

Impor token tidak terduga

Setelah saya menghapusnya, mocha berjalan dengan sukses.


Ini dihasilkan oleh Webpacker untuk Rails: `` `" presets ": [[" env ", {" modules ": false," target ": {" browser ":"> 1% "," uglify ": ​​true}, "useBuiltIns": true}], "react" `` Setelah saya menghapus baris modul, itu berhasil untuk saya.
dinding

Ini memecahkan masalah saya ketika CircleCI gagal menjalankan tes unit lelucon saya dan memberi saya kesalahan impor token yang tidak terduga. +1!
Candlejack

Ini berhasil untuk saya. Rails, Webpacker, dll ... Terima kasih!
emptywalls

8

Saya memiliki masalah yang sama dan memperbaikinya dengan membaca dari dokumentasi babel untuk mengintegrasikan Babel dengan Mocha:

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

Untuk versi Mocha dan Babel yang mana?
Ognyan Dimitrov

Versi Babel saya 6.26.0kecuali "babel-preset-env": "1.6.0"dan "mocha": "3.5.3"
bhantol

Aneh. Ini memecahkan masalah saya dan merupakan masalah baca-dokumen murni dalam kasus saya.
Ognyan Dimitrov

6

Untuk siapa pun yang menggunakan Babel 7 dan Mocha 4, beberapa nama paket telah berubah sedikit dan jawaban yang diterima agak ketinggalan zaman. Yang harus saya lakukan adalah:

npm install @babel/register --saveDev

dan menambahkan --require @babel/registerke baris tes dalampackage.json

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

The @babel/polyfillperbaikan beberapa hal seperti async / fungsi Tunggulah, jika Anda kebetulan menggunakan mereka.

Semoga itu bisa membantu seseorang :)


4

Saya menambahkan jawaban konfigurasi ES6 + mocha + babel lainnya di sini, berlaku mulai Juni '19 (lihat tanggal di jawaban / komentar). mocha tidak lagi menggunakan --compilerflag, dan versi yang saya gunakan tidak tersedia bahkan dengan --no-deprecationflag, lihat ini

Perhatikan bahwa saya tidak akan menyertakan semua bit yang relevan dari halaman yang ditautkan, karena tidak satupun dari mereka yang membuat saya melakukan pengujian bersih berdasarkan versi terbaru dari mocha dan babel; jawaban ini harus mencakup langkah-langkah yang membuat saya berhasil membangun pengujian.

Mengikuti instruksi di sini, dan dalam jawaban ini , dan di sini , saya mencoba menginstal apa yang tampaknya babel terbaru minimum menggunakan npm install:

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

Dan saya menyesuaikan permintaan moka di package.json, seperti:

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

Ini menyebabkan kesalahan:

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

Seperti di atas, --no-deprecationtidak membantu, harap lihat halaman yang ditautkan di atas. Jadi mengikuti instruksi dari sini saya menyesuaikan package.json:

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

Dan mulai melihat kesalahan tentang mencari modul babel, seperti:

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

Pada titik ini saya mulai menginstal paket babel sampai saya bisa melanjutkan. Saya percaya bahwa penginstalan lengkap adalah seperti:

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

Perubahan terakhir yang diperlukan adalah memperbarui permintaan mocha di package.json, menghapus js:awalannya, seperti:

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

Saya tidak dapat menjawab mengapa ini perlu: jika seseorang dapat menjawab ini, silakan tinggalkan komentar dan saya akan memperbarui jawaban saya dengan informasi yang lebih baik.

Hal terakhir yang saya lakukan adalah membuat .babelrc di direktori proyek, dengan isinya:

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

Saya tidak dapat mengingat apa yang mendorong ini, tetapi saya percaya itu karena mocha terus mengeluh tentang tidak mengenali importkata kunci di test.js. Seperti di atas, jika seseorang dapat menjawab ini, silakan tinggalkan komentar dan saya akan memperbarui jawaban saya dengan informasi yang lebih baik.


Pada titik ini saya dapat menjalankan tes mocha saya dengan sukses. Saya menyadari bahwa ada kesenjangan dalam pengetahuan saya di sini: Saya telah menulis banyak kode javascript produksi tetapi saya adalah noob node relatif. Siapa pun yang melihat ini dengan lebih banyak untuk ditambahkan ke jawaban, silakan tinggalkan komentar dan saya akan meningkatkan jawabannya, ATAU tinggalkan jawaban Anda sendiri yang lebih baik.
pb2q

3

--compilers sudah ditinggalkan.

Solusi sederhana saya:

npm install --save-dev babel-core

Dan di package.json tambahkan skrip pengujian Anda seperti ini:

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

2

Saya menemukan cara termudah untuk dilakukan dengan babel 6.XX adalah dengan menggunakan nyc dan kemudian menambahkan helperfile ke filepckage.json

Jadi inilah yang saya gunakan

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

Sekarang Anda akan dapat menggunakan es6 dalam pengujian Anda atau di mana pun Anda membutuhkannya. Punyaku semua gagal;)

Kemudian npm run testyang akan menyalanyc mocha --reporter tap 'test/**/*.spec.js'


2

Inilah yang berhasil untuk saya. Saya mendapat peringatan saat menggunakan --compilersbendera.

DeprecationWarning: "--compilers" akan dihapus di versi Mocha yang akan datang; lihat https://git.io/vdcSr untuk info lebih lanjut

Karena itu saya menggantinya dengan --requirebendera

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

Ini saya .babelrc:

{
  "presets": ["env"]
}

package.jsonDependensi dev saya

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

2

Saya menyelesaikan masalah ini pagi ini dengan instruksi berikut

Instal Modul 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

Saya menyelesaikan masalah ini pagi ini dengan instruksi berikut dari instruksi resmi Menggunakan Babel untuk Mocha 4:

Instal Modul NPM

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

atau satu perintah:

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

Saya telah menginstal mochadan menemukan kesalahan yang sama persis ketika saya menggunakan importkode saya. Dengan melakukan tindakan berikut, masalah telah diperbaiki.

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

Dan kemudian tambahkan .babelrcfile:

{
    "presets": [
        "es2015"
    ]
}

Dan kemudian jalankan mochadengan cara ini:

mocha --compilers js:babel-core/register

-1

Saya memiliki masalah yang sama. Saat menjalankan tes, saya menyadari bahwa saya sebenarnya ingin menghentikan modul yang bergantung. Ini bagus untuk pengujian unit dan mencegah babel mengubah submodul. Jadi saya pakai proxyquire, yaitu:

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

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

Ini lebih cocok sebagai komentar.
Gajus

-3

untuk pengaturan bukti yang lebih di masa mendatang

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

dan dalam .babelrc

{
  "presets": [ "latest" ]
}

sebagai lawan...

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

dan

{
 "presets": [ "es2015" ]
}

2
Saya kira jawaban ini secara praktis tidak terkait dengan pertanyaan ini .. atau lebih tepatnya, ini dapat ditambahkan sebagai komentar pada jawaban lain
62mkv

@ 62mkv Terima kasih! Cara menjadi elang dan menjaga kebersihan tempat ini.
Phil Henry Mcboob
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.