Babel / Rollup错误正在转换和捆绑ES2017

时间:2016-10-06 17:18:23

标签: javascript babeljs rollupjs ecmascript-2017

我使用Rollup和Babel将ES2017 JavaScript(特别是async/await函数)转换为ES5时出错:

  

使用'babel'插件转换\ src \ index.js时出错:选项   传递给{“modules”:false}   \ node_modules \ babel-preset-es2017 \ lib \ index.js不接受   选项。

我的.babelrc文件:

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

当然,如果我将presetses2017更改为es2015并注释掉async/await代码,则错误就会消失。

请注意,虽然应用程序使用ES2017功能(即async/await),但它会作为NPM包发布(作为ES6 (ES2015)模块),稍后会将其转换为通用{{1 }}

如何解决此错误并让ES5 (ES2009)愉快地转发到ES2017

2 个答案:

答案 0 :(得分:1)

您提供的实际配置似乎是:

{
  "presets": [
    "es2017", {modules: false}
  ],
  "plugins": [
    "transform-runtime"
  ],
  "comments": false
}

您应该删除{modules: false}的{​​{1}}选项,该选项不接受任何内容,因为它适用于babel-preset-es2017

答案 1 :(得分:0)

es2015文件中定位.babelrc

"presets": [
    "es2015"
 ],

并首先添加Rollup Async functions plugin预处理es2017功能,其中:

  

用可以运行的生成器函数替换异步函数   现代浏览器或捆绑期间大多数版本的node.js

添加到您的项目:

npm install --save-dev rollup-plugin-async

然后在async之前将rollup.config.js预处理插入到babel()插件数组中:

import async from 'rollup-plugin-async';

...

plugins: [
        async(),
        babel(babelrc())
],

this Rollup Github issues thread中找到了关键洞察力,其中@Victorystick证实了这一点(截至2016年10月10日):

  

Rollup目前仅针对ES6,尽管它可能会得到扩展   很快就到了ES7。目前,如果您使用> ES6功能,他们将需要   转化为Rollup处理它们

由于async / await很可能在下一版本的ECMAScript,ES2017(又名ES8)中进行标准化,因此在Babel运行之前,您需要一个额外的插件来处理它们。

注意: 是YMMV,但后来我在Windows 7上使用rollup-plugin-async收到了AsyncHelper not found run time Errors,所以我的解决方案是(npm uninstall --save-dev rollup-plugin-async和)回滚使用async/await以支持{在我的代码库中{3}}。