ReferenceError: regeneratorRuntime is not defined (but working inside a scope)
ReferenceError: regeneratorRuntime is not defined (but working inside a scope)
我遇到过这种奇怪的情况:
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
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
文件是 removed/renamed,则无论作用域是否存在,代码都会成功。顺便说一句,无论是作用域还是封装生成器的 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 假定 polyfill 将在您的应用程序中的任何其他内容之前加载,但您使用的是函数声明,该声明已被提升,这意味着它存在并且可用 before require
已被调用。
如果是生成器,则需要 regeneratorRuntime
由 polyfill 提供,但是在初始化再生器时还没有加载 polyfill。
Babel团队的建议是制作两个文件:
index.js
require('babel-polyfill');
require('./app');
您还可以使用 es2015 预设和 transform-regenerator 插件执行以下操作:
.babelrc
{
"presets": ["es2015"],
'plugins': [
'transform-regenerator'
]
}
代码
let regeneratorRuntime = require("regenerator-runtime");
// You code with ES6 generators
P.S。
当然你应该安装 babel-plugin-transform-regenerator npm 包。
我知道这个问题已经得到解答,但不幸的是,他们没有为我解决问题。
解决它的方法是在文件
中导入 babel babel-polyfills
import "core-js/stable";
import "regenerator-runtime/runtime";
上找到它
我遇到过这种奇怪的情况:
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
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
文件是 removed/renamed,则无论作用域是否存在,代码都会成功。顺便说一句,无论是作用域还是封装生成器的 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 假定 polyfill 将在您的应用程序中的任何其他内容之前加载,但您使用的是函数声明,该声明已被提升,这意味着它存在并且可用 before require
已被调用。
如果是生成器,则需要 regeneratorRuntime
由 polyfill 提供,但是在初始化再生器时还没有加载 polyfill。
Babel团队的建议是制作两个文件:
index.js
require('babel-polyfill');
require('./app');
您还可以使用 es2015 预设和 transform-regenerator 插件执行以下操作:
.babelrc
{
"presets": ["es2015"],
'plugins': [
'transform-regenerator'
]
}
代码
let regeneratorRuntime = require("regenerator-runtime");
// You code with ES6 generators
P.S。 当然你应该安装 babel-plugin-transform-regenerator npm 包。
我知道这个问题已经得到解答,但不幸的是,他们没有为我解决问题。 解决它的方法是在文件
中导入 babelbabel-polyfills
import "core-js/stable";
import "regenerator-runtime/runtime";
上找到它