在Node 6中使用Babel实现async/await功能

17

我正在尝试为Node v6.9.2配置Babel。我想使用 async/await 构造。

由于我对Babel和所有的Node基础设施都很陌生,我不确定如何正确地配置它:

  • 我应该使用什么预设?由于Node已经实现了大多数ES6功能,所以出于性能考虑,我不希望Babel转译Node 6.9.x已经支持的特性(箭头函数,新的导入机制等)。

  • 我应该包含哪些插件才能使用async/await?在一些调查后,我也感到困惑,因为我发现有几个插件:syntax-async-functionstransform-async-to-generator等。

一个 .babelrc 的例子会很有帮助。

谢谢


1
"已经被Node 6.9.x支持(箭头函数,新的导入机制等)" Node 6.x不支持import/export - T.J. Crowder
你应该熟练掌握 transform-async-to-generator - Hosar
1
除了启动性能(受到影响),运行时 性能可能会更好。V8团队一直在努力使新功能的性能与其先前的模拟相当,但是,其中很多工作是较新的,您无法在Node 6.x中找到它们。例如,只有最新版本(5.7)他们认为已达到性能平衡:https://v8project.blogspot.co.uk/2017/02/v8-release-57.html 只是顺便提一下。所以,我不希望Babel转译Node 6.9.x已经支持的功能...出于性能原因。 - T.J. Crowder
@T.J.Crowder 我们发现原生的 class 构造函数比转译后的构造函数更快,因为存在“类调用检查”,所以当转译器生成复杂代码以匹配 ES6 行为时,它实际上可能比 ES5 等效代码更慢。 - Bergi
@Bergi:有道理。 Babel输出的一些东西相当...复杂。 :-) - T.J. Crowder
2个回答

15

我应该使用哪个预设?

你不需要使用任何预设。预设只是一组插件的集合,如果你想要转译一组特性(例如所有 ES2015 特性),使用预设可以更方便。但是当你只想转译其中的某些特性时,只需要包含相应的插件即可。

我应该包含哪些插件才能使用 async/await ?

因为 Node 6 支持生成器,所以你可以使用 transform-async-to-generator 插件,并在 .babelrc 文件中配置如下:

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

当然,如果你需要转译更多不支持的特性,你需要添加插件。

另一种选择: babel-preset-env

babel-preset-env会自动确定你需要哪些插件来适应指定的环境,并不会包含任何不必要的插件。 为了指定当前的Node版本,你可以使用这个.babelrc文件:

{
  "presets": [
    ["env", {
      "targets": {
        "node": "current"
      }
    }]
  ]
}

10

简短回答

使用适用于 Node 6.x 的 Babel 预设:

详细回答

要查看在特定的 Node 版本中支持什么 ES 特性,请参考:

特别是对于 async/await 的支持,请参考:

如果您使用的是 Node v7.x(当前版本),则可以使用 --harmony 标志并原生地使用 async/await,无需进行转换。

Node v8.x(作为夜间构建版本可用)甚至不需要 --harmony 标志。

但请注意,Node 不支持 import/export - 要了解为什么,请参阅:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接