我遇到了这个奇怪的情况:
ReferenceError: regeneratorRuntime未定义
...我已经在一个非常简单的设置中复制了这个问题(与相似的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
simple-babel-serverside-node-only-archetype@1.0.0 /home/mperdikeas/regeneratorRuntimeNotDefined
├── babel-cli@6.7.5
├── babel-core@6.7.6
├── babel-polyfill@6.7.4
├── babel-preset-es2016@6.0.11
└── babel-runtime@6.6.1
.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');
babel-polyfill
,它是为顶级应用程序设计的。你的库应该假设它是由应用程序加载的,或者使用babel-plugin-transform-runtime
来注入ES6库功能的显式导入。库不应该通过加载polyfills来改变全局状态。 - loganfsmyth