web-dev-qa-db-ja.com

ReferenceError:regeneratorRuntimeは定義されていません(ただし、スコープ内で動作しています)

私はこの奇妙な出来事に遭遇しました:

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

Babelは、アプリケーション内でポリフィルがロードされることを前提としていますが、関数宣言を使用しています。これはホイストされており、存在し、使用可能であることを意味しますbeforerequireが呼び出されています.

ジェネレーターの場合、ポリフィルによって提供されるregeneratorRuntimeが必要ですが、再生器の初期化時にポリフィルがロードされていません。

Babelチームの推奨事項は、2つのファイルを作成することです。

index.js

require('babel-polyfill');
require('./app');
47
loganfsmyth

また、es2015プリセットおよびtransform-regeneratorプラグインを使用して、以下を実行できます。

.babelrc

{
  "presets": ["es2015"],
  'plugins': [
    'transform-regenerator'
  ]
}

コード

let regeneratorRuntime =  require("regenerator-runtime");
// You code with ES6 generators

追伸もちろんインストールする必要があります babel-plugin-transform-regenerator npmパッケージ。

10
Mark Lavrynenko