Я столкнулся с этим странным явлением:
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, демонстрирующий это поведение здесь.
Чтобы наблюдать за поведением:
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');