Karma-babel-preprocessor と単純なES6ジェネレーターを実行しようとしています:
//require('babel/polyfill');
describe("how Generators work", function() {
it("will allow generator functions", function() {
/*function * numbers() {
yield 1;
yield 2;
yield 3;
};*/
let numbers = {
[Symbol.iterator]:function*(){
yield 1;
yield 2;
yield 3;
}
}
let sum = 0;
for(n of numbers){
sum += n;
}
expect(sum).toBe(6);
});
});
これから、babelでテストファイル(ES6 => ES5)を生成しました。
babel src --watch --out-dir tests
次に、karma start
エラーが表示されます。
ReferenceError:regeneratorRuntimeは定義されていません」。
Karma.conf.jsの関連ビット:
// list of files / patterns to load in the browser
files: [
'test-main.js',
{pattern: 'tests/*.js', included: true}
],
// list of files to exclude
exclude: [
],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
'src/*.js': ['babel']
},
'babelPreprocessor': {
options: {
sourceMap: 'inline'
},
filename: function(file) {
return file.originalPath.replace(/\.js$/, '.es5.js');
},
sourceFileName: function(file) {
return file.originalPath;
}
},
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress'],
矢印を含む多くのES6機能を使用できます。ジェネレーターは使用しないでください。
私のプロジェクトでKarmaをBabelで使用するための別のアプローチを取っていますが、私は同じ問題を抱えていると思います: Babel polyfill がロードされていないので、それがサポートする機能を取得していない(Babelがジェネレータを動作させるために使用するカスタムリジェネレータランタイムを含む)。
1つのアプローチは、ポリフィルを含める方法を見つけることです。おそらく、files配列を介してKarmaにフィードすることによってです。
_files: [
'path/to/browser-polyfill.js', // edited: polyfill => browser-polyfill per P.Brian.Mackey's answer
...
_
別のアプローチとしては、Babelの ランタイムトランスフォーマー [edit:を再読み込みすると、browserify/webpack/etcを使用しない限り機能しません。トランスフォーマーによって作成されたrequire()
呼び出しを処理します];そのドキュメントごとに、
runtime
オプションのトランスフォーマーは3つのことを行います。
- ジェネレーター/非同期関数を使用する場合、_
babel-runtime/regenerator
_が自動的に必要です。- _
babel-runtime/core-js
_を自動的に必要とし、ES6の静的メソッドと組み込みをマップします。- インラインbabelヘルパーを削除し、代わりに_
module babel-runtime/helpers
_を使用します。
私はこれに関する経験はありませんが、babelPreprocessor
configにBabelドキュメントの_optional: ['runtime']
_オプションを含めることでそうすることができると思います。つまり:
_'babelPreprocessor': {
options: {
optional: ['runtime'], // per http://babeljs.io/docs/usage/options/
sourceMap: 'inline'
},
...
_
(**現在、私はjspm + jspm-karma +いくつかの設定を使用してSystemJSにロードするBabelポリフィルを取得しています。関連があるかどうかを尋ね、説明します)
Node js Env-2015年12月更新
この質問はすでに回答済みです。NodeJS環境内で実行されていない限り、承認済みの回答をご覧ください。
私と同じように、同じエラーメッセージが表示された場合:'ReferenceError:regeneratorRuntime is not defined'
npm install babel-polyfill --save
次に、影響を受けるモジュールの上部に次のrequireステートメントを挿入して、必要な(ジェネレーター)動作を取得します。
require("babel-polyfill");
これで十分です。モジュールをインポートするだけで、実行時に必要なポリフィル動作が追加されます。
Arcseldonの投稿と同様に、NodeJS環境内でBabelを実行しているときに、同じエラーメッセージ「ReferenceError:regeneratorRuntime is not defined」が表示されました。 babel-polyfillのインストールは機能しますが、代わりに@ babel/plugin-transform-runtimeを使用しました。
@ babel/plugin-transform-runtime
2つの方法でインストールする必要があります...最初にdev依存関係として:
npm install --save-dev @babel/plugin-transform-runtime
生産依存としての2番目:
npm install --save @babel/runtime
そして、.babelrcファイルに1つの簡単な追加が必要です。
{
"plugins": ["@babel/plugin-transform-runtime"]
}
これらの追加により、ReferenceErrorのないES6オーサリング機能が提供されます。
karma.conf.js
を変更して、 Docs Link に前述のとしてbrowser-polyfill
を追加しました。
files: [
'node_modules/babel/browser-polyfill.js',
'test-main.js',
{pattern: 'tests/*.js', included: true}
],
この変更後、次の単体テストがKarmaで機能します。
describe("how Generators work", function() {
it("will allow generator functions", function() {
/*function* numbers(){
yield 1;
yield 2;
yield 3;
};*///Simplified syntax does not work
let numbers = {
[Symbol.iterator]:function*(){
yield 1;
yield 2;
yield 3;
}
}
let sum = 0;
for(let num of numbers){
sum += num;
}
expect(sum).toBe(6);
});
});
Reactを使用する場合、create-react-app
からポリフィルを追加するとうまくいきました。
yarn add --dev react-app-polyfill
次に、webpack.config.js
に次の行を追加します
entry: {
app: [
'react-app-polyfill/ie9', // Only if you want to support IE 9
'react-app-polyfill/stable',
'./src/index.jsx',
],
},
react-app-polyfill GitHubページ で他の例を参照してください。