与Babel.js的Transpileasynchronous等待提议?

有一个build议,介绍C#风格async-await 。 我知道Babel.js将ES6转换为ES5,但有什么办法可以使ES5变得asynchronous等待吗?

Babel v6

从Babel v6开始,Babel本身不再包含任何变压器。 您必须明确指定要转换的任何function 。

预设 – 非ES2015环境

最快捷的方法是使用已经包含转换ES2015和更新build议所需的一组插件的预设 。 对于async ,您将需要es2015es2017预设和runtime插件(不要忘记按照文档中的描述安装babel-runtime ):

 { "presets": [ "es2015", "es2017" ], "plugins": [ "transform-runtime" ] } 

预设 – ES2015环境

如果您在支持ES2015的环境(更具体地说,是生成器和Promise)中运行代码,那么您只需要es2017预设:

 { "presets": [ "es2017" ] } 

习惯

要仅转换async函数,您将需要以下插件。

在任何情况下都需要语法asynchronous函数来parsingasynchronous函数

为了运行asynchronousfunction,您需要使用

  • transform-async-to-generator :将async函数转换为生成器。 这将使用巴贝尔自己的“共同例行”的实施。
  • transform-async-to-module-method :将async函数转换为生成器,但将其传递给configuration中指定的模块和方法,而不是Babel自己的方法。 这使您可以使用bluebird等外部库。

如果您的代码在支持生成器的环境中运行,那么就没有什么可做的了。 但是,如果目标环境不支持生成器,则还必须转换生成器。 这是通过transform-regenerator变换完成的。 这个转换依赖于运行时function,所以你还需要Babel的transform-runtime转换(+ babel-runtime包)。

例子:

asynchronous到发电机

 { "plugins": [ "syntax-async-functions", "transform-async-to-generator" ] } 

asynchronous到模块方法

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

asynchronous到发电机+再生器

 { "plugins": [ "syntax-async-functions", "transform-async-to-generator", "transform-regenerator", "transform-runtime" ] } 

Babel v4和更老

是的,你必须启用实验变压器 。 巴别尔使用再生器 。

用法

 $ babel --experimental 

 babel.transform("code", { experimental: true }); 

自从(2月25日Felix Kling)之后,这个解决scheme可能已经改变了,或者也许还有不止一种方法来使用asynchronous等待。

对我们来说工作就是像这样运行Babel

 $ npm install babel-runtime 

 $ babel inputES7.js -o outputES5.js --optional runtime 

我现在通过做一个额外的npm install babel-preset-stage-0并且像使用它一样工作

 var babel = require("babel-core"); var transpiled = babel.transform(code, { "presets": ["stage-0"] }); 

看到

也许现在更新了; 只要把babel的东西放在一个单独的文件中:

 'use strict'; require('babel/register'); // Imports babel - auto transpiles the other stuff require('./app'); // this is es6 - gets transpiled 

请参阅我的代码, 了解更多细节,以了解如何使用es2016-es7-async-await-in-my-acceptance-tests-for-a-koa-js-app 。

批准的答案似乎已经过时了。 实验标志已被弃用,有利于阶段。

http://babeljs.io/blog/2015/03/31/5.0.0/#experimental-option

用法

 $ babel --stage 0 

 babel.transform("code", { stage: 0 }); 

阶段0

  • es7.classProperties
  • es7.comprehensions

阶段1

  • es7.asyncFunctions
  • es7.decorators
  • es7.exportExtensions
  • es7.objectRestSpread

第2阶段(第2阶段及以上阶段默认启用)

  • es7.exponentiationOperator