2

我在将ES2017JavaScript(特别是async/await函数)转换为ES5使用 Rollup 和 Babel 时遇到错误:

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

我的.babelrc文件:

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

自然,如果我将presetsfrom更改es2017es2015并注释掉async/await代码,错误就会消失。

请注意,虽然应用程序使用ES2017功能(即async/await),但它作为 NPM 包(作为ES6 (ES2015)模块)发布,随后被转译为 generic ES5 (ES2009)

我如何克服这个错误并让我ES2017愉快地转译到ES5?

4

2 回答 2

1

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

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

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

于 2016-10-08T20:19:50.080 回答
0

es2015在您的.babelrc文件中定位:

"presets": [
    "es2015"
 ],

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())
],

在此 Rollup Github 问题线程中找到了关键见解,其中@Victorystick 确认(截至 2016 年 10 月 10 日):

Rollup 目前只针对 ES6,尽管它可能很快会扩展到 ES7。目前,如果您使用 >ES6 功能,则需要将它们转译以供 Rollup 处理

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

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

于 2016-10-11T04:55:14.747 回答