私はこの奇妙な出来事に遭遇しました:
ReferenceError: regeneratorRuntime is not defined
...これは非常に最小限の設定で再現することができました(同じ問題に関する同様のSOの質問)と比較して)。
次のコードが機能します。
'use strict';
require('babel-polyfill');
{ // scope A (if you remove it you observe different behavior when .babelrc is present)
function *simplestIterator() {
yield 42;
}
for (let v of simplestIterator()) {
console.log(v);
}
}
パッケージは次のとおりです。
$ npm ls --depth 0
[email protected] /home/mperdikeas/regeneratorRuntimeNotDefined
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
└── [email protected]
.babelrc
の内容は次のとおりです。
$ cat .babelrc
{
"presets": ["es2016"]
}
ただし、スコープが削除され、simplestIterator
がグローバルスコープに配置されると、次のように失敗します。
ReferenceError: regeneratorRuntime is not defined
さらに奇妙なことに、.babelrc
ファイルが削除または名前変更された場合、スコープが存在するかどうかにかかわらず、コードは成功します。ところで、ジェネレーターをカプセル化するスコープまたはIIFEのどちらでも違いはありません。
この動作を示す最小限のgithubリポジトリ here 。
動作を観察するには:
git clone https://github.com/mperdikeas/regeneratorRuntimeNotDefined.git
cd regeneratorRuntimeNotDefined/
npm install
npm run build && npm run start
上記は、コンソールに42
を出力します。次に、スコープを削除して、何が起こるかを確認します。次に、.babelrc
の名前を変更して、(スコープの有無にかかわらず)再び機能することを確認します。
私の質問は:
es2016
Babelプリセットがこのエラーをトリガーする理由受け入れられた答えに基づいて、これは私が書いていたモジュールのコードだったので、やることになりました:
require('babel-polyfill');
module.exports = require('./app.js');
Babelは、アプリケーション内でポリフィルがロードされることを前提としていますが、関数宣言を使用しています。これはホイストされており、存在し、使用可能であることを意味しますbeforerequire
が呼び出されています.
ジェネレーターの場合、ポリフィルによって提供されるregeneratorRuntime
が必要ですが、再生器の初期化時にポリフィルがロードされていません。
Babelチームの推奨事項は、2つのファイルを作成することです。
require('babel-polyfill');
require('./app');
また、es2015プリセットおよびtransform-regeneratorプラグインを使用して、以下を実行できます。
{
"presets": ["es2015"],
'plugins': [
'transform-regenerator'
]
}
let regeneratorRuntime = require("regenerator-runtime");
// You code with ES6 generators
追伸もちろんインストールする必要があります babel-plugin-transform-regenerator npmパッケージ。