与Babel.js的Transpileasynchronous等待提议?
有一个build议,介绍C#风格async-await
。 我知道Babel.js将ES6转换为ES5,但有什么办法可以使ES5
变得asynchronous等待吗?
Babel v6
从Babel v6开始,Babel本身不再包含任何变压器。 您必须明确指定要转换的任何function 。
预设 – 非ES2015环境
最快捷的方法是使用已经包含转换ES2015和更新build议所需的一组插件的预设 。 对于async
,您将需要es2015
和es2017
预设和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