ReferenceError:regeneratorRuntime未定义(但在作用域内工作)
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
文件被删除/重命名,那么无论作用域是否存在,代码都会成功。BTW是作用域还是封装生成器的IIFE都没有区别。
在这里展示这种行为的最小github repo。
观察行为:
git clone https://github.com/mperdikeas/regeneratorRuntimeNotDefined.git
cd regeneratorRuntimeNotDefined/
npm install
npm run build && npm run start
以上内容将在控制台上输出42
。现在移除作用域,看看会发生什么。然后重命名.babelrc
以使其再次工作(有或没有作用域)。
我的问题是:
- 为什么
es2016
巴别塔预设会触发此错误 - 为什么将生成器放在作用域中可以解决问题
更新
基于接受的答案,由于这是我正在编写的模块的代码,我最终做了:
require('babel-polyfill');
module.exports = require('./app.js');
Babel假设polyfill将在应用程序中的任何其他内容之前加载,但您使用的是一个函数声明,该声明是挂起的,这意味着它在调用require
之前就存在并可用。
在生成器的情况下,则需要由polyfill提供的regeneratorRuntime
,但在初始化再生器时polyfill尚未加载。
巴别塔团队的建议是制作两个文件:
index.js
require('babel-polyfill');
require('./app');
您还可以使用es2015预设和转换再生器插件执行以下操作:
.babelrc
{
"presets": ["es2015"],
'plugins': [
'transform-regenerator'
]
}
代码
let regeneratorRuntime = require("regenerator-runtime");
// You code with ES6 generators
p.S。当然,您应该安装babel-plugin-transform-reneratornpm包。
我知道这个问题已经得到了解决,但不幸的是,他们没有为我解决这个问题。解决问题的方法是在文件中导入babel babel-polyfills
import "core-js/stable";
import "regenerator-runtime/runtime";
您可以在官方babeljs文档或本文
- Javascript作用域和Ajax调用;工作不正常
- 为什么AngularJS$作用域不能正常工作
- JavaScript 变量的作用域在此脚本中如何工作
- ReferenceError:regeneratorRuntime未定义(但在作用域内工作)
- ngModel 的 angularjs 作用域未按预期工作
- JavaScript的作用域工作原理包括
- javascript中的作用域是如何工作的?为什么这个功能有效
- Angular Ui-Router |从控制器访问视图中的作用域变量,但不能正常工作
- Javascript中的作用域是如何工作的
- Q承诺-作用域是如何工作的
- AngularJs的ng-href动态链接,作用域没有更新/工作
- Javascript变量作用域不工作
- 隔离作用域不工作
- AngularJs - forEach作用域数组-不工作
- Angular JS-{{}}不工作,但数据绑定显示作用域
- Javascript变量的全局作用域没有按预期工作
- 由于作用域问题,Ng-model不能工作
- 这个简单的javascript脚本实际上是如何工作的(可能是作用域)
- Angular$scope未按预期工作.正在尝试在控制器$scope和$scope.function作用域中分配对象值
- Javascript变量作用域的确切工作方式