.babelrcに適切なプリセット(es2015)を含めるなど、他の関連する質問で提供されるソリューションは、すでに私のプロジェクトに実装されています。
ES6モジュール構文を使用する2つのプロジェクト(AおよびBと呼びます)があります。プロジェクトAでは、npm経由でインストールされ、node_modulesフォルダーにあるプロジェクトBをインポートしています。プロジェクトAのテストスイートを実行すると、次のエラーが表示されます。
SyntaxError:予期しないトークンのインポート
これは、プロジェクトBからのこの誤ったコード行が先行しています:
(関数(exports、require、module、__ filename、__ dirname){import createBrowserHistory from 'history/lib/createBrowserHistory';
私のソースファイルには「history/lib/createBrowserHistoryからimport createBrowserHistory」のみが含まれているため、iifeはnpmまたはおそらくbabel関連のように見えます。プロジェクトBのテストスイートのユニットテストは正常に実行され、プロジェクトBを依存関係として削除するとプロジェクトA、私のテストスイート(引き続き内部プロジェクトモジュールにes6インポートを使用)は正常に動作します。
完全なスタックトレース:
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
Package.jsonからのテストコマンドは次のとおりです。
"test": "mocha --compilers js:babel-core/register '+(test|src)/**/*Spec.js'"
このStackOverflowの投稿は似ていますが、コマンドラインを使用するためのソリューションを提供していません: babelでnode_modulesからモジュールをインポートしますが、失敗しました
唯一の解決策は明示的に含めることであるようです:
require('babel-core/register')({
ignore: /node_modules/(?!ProjectB)/
});
テストヘルパーファイルで、テストコマンドでmochaに渡します:
mocha --require ./test/testHelper.js...
最終的な解決策:
追加registerBabel.js:ジョブがbabel-core/register ...を必要とする別のファイル.
require('babel-core/register')({
ignore: /node_modules/(?!ProjectB)/
});
アプリケーションがbabel-nodeにも依存している場合は、entry.jsを追加します。これは、es6を含むアプリケーションのラッパーとして機能します。
require('./registerBabel');
require('./server'); // this file has some es6 imports
その後、node entry
を使用してアプリケーションを実行します
Mochaテストの場合、testHelper.jsは、実行時にbabelサポートを初期化するためにregisterBabel.jsも必要です。
require('./registerBabel');
そして、mocha --require ./testHelper.js '+(test)/**/*Spec.js'
を使用してmochaテストを実行します
これは、「./ test」内の「Spec.js」で終わるファイルを再帰的にテストします。プロジェクトの仕様に一致するパターンでパターンを置き換えます。
この問題を解決する最も簡単な方法は次のとおりです。
npm install babel-preset-es2015 --save-dev
コンテンツを含むプロジェクトのルートに.babelrc
を追加します。
{
"presets": [ "es2015" ]
}
「--compilers js:babel-core/register」パラメーターを使用してmochaを実行していることを確認してください。
npm install @babel/preset-env --save-dev
コンテンツを含むプロジェクトのルートに.babelrc
を追加します。
{
"presets": [ "@babel/preset-env" ]
}
--compilers js:babel-register
(Babel 6)または--compilers js:@babel/register
(Babel 7)パラメーターを使用してmochaを実行していることを確認してください
あなたがその問題を抱えていることは確かです、あなたはモカが知らないES6を使用しています
だから、あなたはバベルを使用していますが、テストでは使用しません...
いくつかのソリューション:
A. NPMを使用して実行している場合
"test": "mocha --compilers js:babel-core/register test*.js"
B.使用しています
"test": "./node_modules/.bin/mocha --compilers js:babel-core/register **/*spec.jsx"
C. cliから:
mocha --compilers js:babel-core/register test * .js
詳細は http://www.pauleveritt.org/articles/pylyglot/es6_imports/ で読むことができます。
同じ問題にぶつかりました。 stackoverflow以降で他のすべてのソリューションを試した後、package.jsonにこの簡単な構成を追加すると、私のためにそれができました:
"babel": {
"presets": [
"es2015"
]
}
その後、すべてのES6インポートが機能しました。ちなみに、webpack.config.js内で同じ設定をしていましたが、明らかにこれがmochaテストでも機能する唯一の方法でした。
これが誰かを助けることを願っています。
.babelrcファイルに{"modules": false}
が含まれていました。
"presets": [
["es2015", {"modules": false}],
"stage-2",
"react"
]
投げていた
予期しないトークンのインポート
削除すると、mochaは正常に実行されました。
私は同じ問題を抱えていて、バベルとモカを統合するための babel documentation を読んで修正しました:
{
"scripts": {
"test": "mocha --compilers js:babel-register"
}
}
Babel 7とMocha 4を使用している人にとっては、パッケージ名の一部が少し変更されており、受け入れられている答えは少し古くなっています。私がしなければならなかったことは:
npm install @babel/register --saveDev
--require @babel/register
のテスト行にpackage.json
を追加します
"test": "./node_modules/mocha/bin/mocha --require @babel/polyfill --require @babel/register './test/**/*.spec.js'"
@babel/polyfill
を使用すると、async/await機能などが修正されます。
それが誰かを助けることを願っています:)
Babel 6.X.Xを使用する最も簡単な方法は、nycを使用してからhelper
ファイルをpckage.json
に追加することです
ここに私が使用したものがあります
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')();
これで、テストまたは必要な場所でes6を使用できるようになります。私のすべてが失敗しています;)
その後、npm run test
は、nyc mocha --reporter tap 'test/**/*.spec.js'
を起動します
これが私のために働いたものです。 --compilers
フラグを使用すると警告が表示されました。
DeprecationWarning:「--compilers」は、Mochaの将来のバージョンで削除されます。詳細については https://git.io/vdcSr を参照してください
したがって、それを--require
フラグに置き換えました
"test": "mocha --require babel-core/register --recursive"
これが私の.babelrc
です:
{
"presets": ["env"]
}
package.json
devの依存関係
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-preset-env": "^1.7.0",
"mocha": "^5.2.0",
}
--compilers
は非推奨です。
私の簡単な解決策:
npm install --save-dev babel-core
そして、package.jsonに次のようなテストスクリプトを追加します。
"scripts": {
"test": "mocha --require babel-core/register ./test/**/*.js -r ./test-setup.js"
},
今朝、この問題を次の手順で解決しました
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"]
}
TypeScriptを使用している場合、 extensions
オプションを指定 が必要になる場合があります。
require("@babel/register")({
extensions: ['.jsx', '.js', '.ts', '.tsx']
})
ここに、19年6月現在の別のES6 + mocha + babel configの回答を追加します(answer/commenteの日付を参照)。 mochaは--compiler
フラグを廃止しました。使用しているバージョンでは、--no-deprecation
フラグを使用することもできません。c.f。 this
リンクされたページのすべての関連ビットを含めるわけではないことに注意してください。これは、最新バージョンのmochaとbabelに基づいたクリーンなテストビルドに到達しなかったためです。この回答には、テストビルドを成功させるための手順が含まれている必要があります。
ここの指示に従い、 この回答 、および ここ で、npm install
を使用して、最小の最新バベルと思われるものをインストールしようとしました。
$ npm install --save-dev mocha
$ npm install --save-dev @babel/preset-env
そして、package.jsonのmocha呼び出しを次のように調整しました。
"scripts": {
"test": "mocha --compilers js:@babel/register"
}
これによりエラーが発生しました。
× ERROR: --compilers is DEPRECATED and no longer supported.
上記のように、--no-deprecation
は役に立ちませんでした。上記のリンク先のページを参照してください。 here の指示に従って、package.jsonを調整しました。
"scripts": {
"test": "mocha --require js:@babel/register"
}
そして、次のようなbabelモジュールの配置に関するエラーが表示されるようになりました。
× ERROR: Cannot find module '@babel/register'
この時点で、進行するまでbabelパッケージのインストールを開始しました。フルインストールは次のようなものだと思います:
$ npm install --save-dev @babel/preset-env @babel/register @babel/core
最後に必要な変更は、package.jsonのmocha呼び出しを更新し、js:
プレフィックスを削除することでした。
"scripts": {
"test": "mocha --require @babel/register"
}
なぜこれが必要なのか答えられません。誰かがこれに答えられるなら、コメントを残してください。より良い情報で答えを更新します。
最後にしたことは、プロジェクトディレクトリに.babelrcを作成し、その内容を次のようにしたことです。
{
"presets" : ["@babel/preset-env"]
}
何がこれを促したのか思い出せませんが、test(js)でimport
キーワードを認識しないとmochaが文句を言い続けていたためだと思いますbelieve。上記のように、誰かがこれに答えることができるならば、コメントを残してください、そして、より良い情報で私の答えを更新します。
mocha
をインストールしましたが、コードでimport
を使用するとまったく同じエラーが発生しました。以下のアクションを実行することにより、問題は修正されました。
npm install babel-core --save-dev
npm install babel-preset-es2015 --save-dev
npm install babel-preset-stage-0 --save-dev
そして、.babelrc
ファイルを追加します。
{
"presets": [
"es2015"
]
}
そして、このようにmocha
を実行します:
mocha --compilers js:babel-core/register
今朝、この問題をMocha 4の 公式のBabelの使用手順 からの指示で解決しました。
NPMモジュールのインストール
npm install --save-dev babel-polyfill
npm install --save-dev babel-preset-env
npm install --save-dev babel-register
または単一のコマンド:
npm i -d babel-polyfill babel-preset-env babel-register
package.json:
"scripts": {
"test": "mocha --require babel-polyfill --require babel-register"
}
。babelrc
{
"presets": ["env"]
}