RegeneratorRuntime 未定义
RegeneratorRuntime is not defined
我正在尝试 运行 Karma-babel-preprocessor 和一个直接的 ES6 生成器:
//require('babel/polyfill');
describe("how Generators work", function() {
it("will allow generator functions", function() {
/*function * numbers() {
yield 1;
yield 2;
yield 3;
};*/
let numbers = {
[Symbol.iterator]:function*(){
yield 1;
yield 2;
yield 3;
}
}
let sum = 0;
for(n of numbers){
sum += n;
}
expect(sum).toBe(6);
});
});
由此我用 babel 生成了我的测试文件 (ES6 => ES5):
babel src --watch --out-dir tests
然后我 运行 karma start
我得到错误:
ReferenceError: regeneratorRuntime is not defined".
karma.conf.js中的相关位:
// list of files / patterns to load in the browser
files: [
'test-main.js',
{pattern: 'tests/*.js', included: true}
],
// list of files to exclude
exclude: [
],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
'src/*.js': ['babel']
},
'babelPreprocessor': {
options: {
sourceMap: 'inline'
},
filename: function(file) {
return file.originalPath.replace(/\.js$/, '.es5.js');
},
sourceFileName: function(file) {
return file.originalPath;
}
},
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress'],
我能够使用许多 ES6 功能,包括箭头。只是不要继续发电机。
虽然我采用不同的方法**在我的项目中将 Karma 与 Babel 结合使用,但我怀疑您遇到了与我相同的问题:未加载 Babel polyfill,因此您没有获得它支持的功能(包括 Babel 用来使生成器工作的自定义再生器运行时)。
一种方法是找到一种包含 polyfill 的方法,也许是通过文件数组将其提供给 Karma:
files: [
'path/to/browser-polyfill.js', // edited: polyfill => browser-polyfill per P.Brian.Mackey's answer
...
另一种方法可能是使用 Babel 的 runtime transformer [编辑:在重新阅读文档时,除非您随后 browserify/webpack/etc,否则这将不起作用。处理由转换器 ] 创建的 require()
调用;根据其文档,
The runtime
optional transformer does three things:
- Automatically requires
babel-runtime/regenerator
when you use generators/async functions.
- Automatically requires
babel-runtime/core-js
and maps ES6 static methods and built-ins.
- Removes the inline babel helpers and uses the
module babel-runtime/helpers
instead.
我没有这方面的经验,但我怀疑您会通过在 babelPreprocessor
配置中包含 Babel 文档中的 optional: ['runtime']
选项来做到这一点,即:
'babelPreprocessor': {
options: {
optional: ['runtime'], // per http://babeljs.io/docs/usage/options/
sourceMap: 'inline'
},
...
(** 我目前正在使用 jspm + jspm-karma + 一些配置来让 Babel polyfill 加载到 SystemJS 中;询问是否相关,我会详细说明。 )
我修改了 karma.conf.js
以在 Docs Link 中添加 browser-polyfill
作为 提到的 :
files: [
'node_modules/babel/browser-polyfill.js',
'test-main.js',
{pattern: 'tests/*.js', included: true}
],
此修改后,以下单元测试可在 Karma 中运行:
describe("how Generators work", function() {
it("will allow generator functions", function() {
/*function* numbers(){
yield 1;
yield 2;
yield 3;
};*///Simplified syntax does not work
let numbers = {
[Symbol.iterator]:function*(){
yield 1;
yield 2;
yield 3;
}
}
let sum = 0;
for(let num of numbers){
sum += num;
}
expect(sum).toBe(6);
});
});
Node js 环境 - 2015 年 12 月更新
此问题已得到解答,除非 运行 在 NodeJS 环境中,请参阅已接受的答案。
如果像我一样,你有同样的错误信息:'ReferenceError: regeneratorRuntime is not defined' 但是 运行 Babel 在 NodeJS 环境中,那么只需执行以下操作即可可能解决您的问题:
npm install babel-polyfill --save
然后将以下 require 语句插入受影响模块的顶部以获得所需的(生成器)行为:
require("babel-polyfill");
这应该就是您所需要的,只需导入模块即可在运行时添加所需的 polyfill 行为。
与 arcseldon 的 post 类似,我在 NodeJS 环境中 运行 Babel 并收到相同的错误消息 'ReferenceError: regeneratorRuntime is not defined'。虽然安装 babel-polyfill 确实有效,但我使用 @babel/plugin-transform-runtime 代替。
@babel/plugin-transform-runtime
它需要以两种方式安装...首先作为开发依赖:
npm install --save-dev @babel/plugin-transform-runtime
第二个作为生产依赖:
npm install --save @babel/runtime
然后需要在您的 .babelrc 文件中添加一个简单的内容:
{
"plugins": ["@babel/plugin-transform-runtime"]
}
这些新增功能为 ES6 编写功能提供了没有 ReferenceError 的功能。
如果你使用 React,从 create-react-app
添加 polyfills 对我有用。
yarn add --dev react-app-polyfill
然后将以下行添加到 webpack.config.js
entry: {
app: [
'react-app-polyfill/ie9', // Only if you want to support IE 9
'react-app-polyfill/stable',
'./src/index.jsx',
],
},
在 react-app-polyfill GitHub page 上查看更多示例。
我正在尝试 运行 Karma-babel-preprocessor 和一个直接的 ES6 生成器:
//require('babel/polyfill');
describe("how Generators work", function() {
it("will allow generator functions", function() {
/*function * numbers() {
yield 1;
yield 2;
yield 3;
};*/
let numbers = {
[Symbol.iterator]:function*(){
yield 1;
yield 2;
yield 3;
}
}
let sum = 0;
for(n of numbers){
sum += n;
}
expect(sum).toBe(6);
});
});
由此我用 babel 生成了我的测试文件 (ES6 => ES5):
babel src --watch --out-dir tests
然后我 运行 karma start
我得到错误:
ReferenceError: regeneratorRuntime is not defined".
karma.conf.js中的相关位:
// list of files / patterns to load in the browser
files: [
'test-main.js',
{pattern: 'tests/*.js', included: true}
],
// list of files to exclude
exclude: [
],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
'src/*.js': ['babel']
},
'babelPreprocessor': {
options: {
sourceMap: 'inline'
},
filename: function(file) {
return file.originalPath.replace(/\.js$/, '.es5.js');
},
sourceFileName: function(file) {
return file.originalPath;
}
},
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress'],
我能够使用许多 ES6 功能,包括箭头。只是不要继续发电机。
虽然我采用不同的方法**在我的项目中将 Karma 与 Babel 结合使用,但我怀疑您遇到了与我相同的问题:未加载 Babel polyfill,因此您没有获得它支持的功能(包括 Babel 用来使生成器工作的自定义再生器运行时)。
一种方法是找到一种包含 polyfill 的方法,也许是通过文件数组将其提供给 Karma:
files: [
'path/to/browser-polyfill.js', // edited: polyfill => browser-polyfill per P.Brian.Mackey's answer
...
另一种方法可能是使用 Babel 的 runtime transformer [编辑:在重新阅读文档时,除非您随后 browserify/webpack/etc,否则这将不起作用。处理由转换器 ] 创建的 require()
调用;根据其文档,
The
runtime
optional transformer does three things:
- Automatically requires
babel-runtime/regenerator
when you use generators/async functions.- Automatically requires
babel-runtime/core-js
and maps ES6 static methods and built-ins.- Removes the inline babel helpers and uses the
module babel-runtime/helpers
instead.
我没有这方面的经验,但我怀疑您会通过在 babelPreprocessor
配置中包含 Babel 文档中的 optional: ['runtime']
选项来做到这一点,即:
'babelPreprocessor': {
options: {
optional: ['runtime'], // per http://babeljs.io/docs/usage/options/
sourceMap: 'inline'
},
...
(** 我目前正在使用 jspm + jspm-karma + 一些配置来让 Babel polyfill 加载到 SystemJS 中;询问是否相关,我会详细说明。 )
我修改了 karma.conf.js
以在 Docs Link 中添加 browser-polyfill
作为 提到的 :
files: [
'node_modules/babel/browser-polyfill.js',
'test-main.js',
{pattern: 'tests/*.js', included: true}
],
此修改后,以下单元测试可在 Karma 中运行:
describe("how Generators work", function() {
it("will allow generator functions", function() {
/*function* numbers(){
yield 1;
yield 2;
yield 3;
};*///Simplified syntax does not work
let numbers = {
[Symbol.iterator]:function*(){
yield 1;
yield 2;
yield 3;
}
}
let sum = 0;
for(let num of numbers){
sum += num;
}
expect(sum).toBe(6);
});
});
Node js 环境 - 2015 年 12 月更新
此问题已得到解答,除非 运行 在 NodeJS 环境中,请参阅已接受的答案。
如果像我一样,你有同样的错误信息:'ReferenceError: regeneratorRuntime is not defined' 但是 运行 Babel 在 NodeJS 环境中,那么只需执行以下操作即可可能解决您的问题:
npm install babel-polyfill --save
然后将以下 require 语句插入受影响模块的顶部以获得所需的(生成器)行为:
require("babel-polyfill");
这应该就是您所需要的,只需导入模块即可在运行时添加所需的 polyfill 行为。
与 arcseldon 的 post 类似,我在 NodeJS 环境中 运行 Babel 并收到相同的错误消息 'ReferenceError: regeneratorRuntime is not defined'。虽然安装 babel-polyfill 确实有效,但我使用 @babel/plugin-transform-runtime 代替。
@babel/plugin-transform-runtime
它需要以两种方式安装...首先作为开发依赖:
npm install --save-dev @babel/plugin-transform-runtime
第二个作为生产依赖:
npm install --save @babel/runtime
然后需要在您的 .babelrc 文件中添加一个简单的内容:
{
"plugins": ["@babel/plugin-transform-runtime"]
}
这些新增功能为 ES6 编写功能提供了没有 ReferenceError 的功能。
如果你使用 React,从 create-react-app
添加 polyfills 对我有用。
yarn add --dev react-app-polyfill
然后将以下行添加到 webpack.config.js
entry: {
app: [
'react-app-polyfill/ie9', // Only if you want to support IE 9
'react-app-polyfill/stable',
'./src/index.jsx',
],
},
在 react-app-polyfill GitHub page 上查看更多示例。