Babel 6 regeneratorRuntime没有定义

我试图使用asynchronous,从头开始在巴别塔6,但我越来越regeneratorRuntime没有定义。

.babelrc文件

{ "presets": [ "es2015", "stage-0" ] } 

package.json文件

 "devDependencies": { "babel-core": "^6.0.20", "babel-preset-es2015": "^6.0.15", "babel-preset-stage-0": "^6.0.15" } 

.js文件

 "use strict"; async function foo() { await bar(); } function bar() { } exports.default = foo; 

通常没有asynchronous/等待使用它就好了。 任何想法我做错了什么?

babel-polyfill是必需的。 您还必须安装它才能获得asynchronous/等待工作。

 npm i -D babel-core babel-polyfill babel-preset-es2015 babel-preset-stage-0 babel-loader 

的package.json

 "devDependencies": { "babel-core": "^6.0.20", "babel-polyfill": "^6.0.16", "babel-preset-es2015": "^6.0.15", "babel-preset-stage-0": "^6.0.15" } 

.babelrc

 { "presets": [ "es2015", "stage-0" ] } 

.js与asynchronous/等待(示例代码)

 "use strict"; export default async function foo() { var s = await bar(); console.log(s); } function bar() { return "bar"; } 

在启动文件中

 require("babel-core/register"); require("babel-polyfill"); 

如果你使用的是webpack,你需要把它作为@Cemen评论的第一个条目:

 module.exports = { entry: ['babel-polyfill', './test.js'], output: { filename: 'bundle.js' }, module: { loaders: [ { test: /\.jsx?$/, loader: 'babel', } ] } }; 

如果你想用babel运行testing,那么使用:

 mocha --compilers js:babel-core/register --require babel-polyfill 

除了polyfill,我使用了babel-plugin-transform-runtime 。 该插件被描述为:

将引用外部化到助手和内置函数,自动填充代码而不会污染全局variables。 这究竟意味着什么呢? 基本上,您可以使用Promise,Set,Symbol等内置function,并使用所有需要无缝填充的Babelfunction,而不会造成全球污染,因此非常适合图书馆。

它还包括对asynchronous/等待以及ES 6的其他内置function的支持。

 $ npm install --save-dev babel-plugin-transform-runtime $ npm install --save babel-runtime 

.babelrc ,添加运行时插件

 { "plugins": [ ["transform-runtime", { "polyfill": false, "regenerator": true }] ] } 

我相信我find了最新的最佳做法。

检查这个项目: https : //github.com/babel/babel-preset-env

 yarn add --dev babel-preset-env 

使用以下作为你的babelconfiguration:

 { "presets": [ ["env", { "targets": { "browsers": ["last 2 Chrome versions"] } }] ] } 

那么你的应用程序应该是最好的去在Chrome浏览器的最后2个版本。

您也可以将Node设置为目标或根据https://github.com/ai/browserslist微调浏览器列表;

告诉我什么,不要告诉我如何。

我非常喜欢babel-preset-env的理念:告诉我你想支持哪种环境,不要告诉我如何支持它们。 这是声明式编程的美妙之处。

我testing了async await ,他们工作。 我不知道他们是如何工作的,我真的不想知道。 我想把我的时间花在自己的代码和业务逻辑上。 感谢babel-preset-env ,它将我从Babelconfiguration中解放出来。

更新

如果您将目标设置为Chrome,则它可以正常工作。 但是可能不适用于其他目标,请参阅: https : //github.com/babel/babel-preset-env/issues/112

或者,如果不需要babel-polyfill提供的所有模块,则可以在webpackconfiguration中指定babel-regenerator-runtime

 module.exports = { entry: ['babel-regenerator-runtime', './test.js'], // ... }; 

与HMR一起使用webpack-dev-server时,这样做会减less在每个构build中编译的文件数量。 这个模块是作为babel-polyfill一部分安装的,所以如果你已经有了,那么你可以用npm i -D babel-regenerator-runtime单独安装。

如果使用babel-preset-stage-2那么只需使用--require babel-polyfill来启动脚本。

在我的情况下,这个错误是由Mochatesting引发的。

解决了问题后

mocha \"server/tests/**/*.test.js\" --compilers js:babel-register --require babel-polyfill

我简单的解决scheme

 npm install --save-dev babel-plugin-transform-runtime npm install babel-plugin-transform-async-to-generator --save-dev 

.babelrc

 { "presets": [ ["latest", { "es2015": { "loose": true } }], "react", "stage-0" ], "plugins": [ "transform-runtime" ] } 

你得到一个错误,因为asynchronous/等待使用生成器,这是一个ES2016function,而不是ES2015。 解决这个问题的方法之一是安装ES2016的预设( npm install --save babel-preset-es2016 )并编译到ES2016而不是ES2015:

 "presets": [ "es2016", // etc... ] 

正如其他答案中提到的,你也可以使用polyfill (尽pipe确保你在其他代码运行之前首先加载polyfill )。 或者,如果您不想包含所有的polyfill依赖关系,则可以使用babel-regenerator-runtime或者babel-plugin-transform-runtime 。

新答案为什么你按照我的答案?

答:因为我打算给你最新版本的npm项目的答案。

2017年4月14日

 "name": "es6", "version": "1.0.0", "babel-core": "^6.24.1", "babel-loader": "^6.4.1", "babel-polyfill": "^6.23.0", "babel-preset-es2015": "^6.24.1", "webpack": "^2.3.3", "webpack-dev-server": "^2.4.2" 

如果你使用这个版本或更多的UP版本Npm和所有其他…所以只需要改变:

webpack.config.js

 module.exports = { entry: ["babel-polyfill", "./app/js"] }; 

更改webpack.config.js文件之后只需将此行添加到代码顶部即可。

 import "babel-polyfill"; 

现在检查一切正常。 参考LINK

还谢谢@BrunoLM他的不错的答案。

1 – 安装babel-plugin-transform-async-to-module-method,babel-polyfil,bluebird,babel-preset-es2015,babel-core:

 npm install babel-plugin-transform-async-to-module-method babel-polyfill bluebird babel-preset-es2015 babel-core 

2 – 添加你的js babel polyfill:

import 'babel-polyfill';

3 – 在.babelrc中添加插件:

 { "presets": ["es2015"], "plugins": [ ["transform-async-to-module-method", { "module": "bluebird", "method": "coroutine" }] ] } 

资料来源: http : //babeljs.io/docs/plugins/transform-async-to-module-method/

我有一个设置
webpack使用presets: ['es2015', 'stage-0']
和正在运行由webpack编译的testing的摩卡。

为了使我的async/awaittesting工作,我所要做的就是添加mocha --require babel-polyfill选项。

当我尝试使用ES6生成器时,我得到这个错误使用吞吐汇总:

 gulp.task('scripts', () => { return rollup({ entry: './app/scripts/main.js', format: "iife", sourceMap: true, plugins: [babel({ exclude: 'node_modules/**', "presets": [ [ "es2015-rollup" ] ], "plugins": [ "external-helpers" ] }), includePaths({ include: {}, paths: ['./app/scripts'], external: [], extensions: ['.js'] })] }) .pipe(source('app.js')) .pipe(buffer()) .pipe(sourcemaps.init({ loadMaps: true })) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('.tmp/scripts')) .pipe(reload({ stream: true })); }); 

我可能会遇到的解决办法是包括babel-polyfill作为凉亭组件:

 bower install babel-polyfill --save 

并将其作为依赖项添加到index.html中:

 <script src="/bower_components/babel-polyfill/browser-polyfill.js"></script> 

我有async等待使用webpack / babel构build:

 "devDependencies": { "babel-preset-stage-3": "^6.11.0" } 

.babelrc:

 "presets": ["es2015", "stage-3"]