Babel / Rollup 错误转译和捆绑 ES2017

Posted

技术标签:

【中文标题】Babel / Rollup 错误转译和捆绑 ES2017【英文标题】:Babel / Rollup errors transpiling and bundling ES2017 【发布时间】:2017-02-15 13:23:15 【问题描述】:

使用 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) 模块)发布,然后转换为通用ES5 (ES2009)

如何克服这个错误并让我的 ES2017 愉快地转换为 ES5

【问题讨论】:

ES2017 不是 ES7。 【参考方案1】:

在您的.babelrc 文件中定位es2015

"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 以支持在我的代码库中使用 ES6 Promises。

【讨论】:

【参考方案2】:

看来你提供的实际配置是:


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

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

【讨论】:

但是怎么做呢? modules:false 选项正在由转译器自动插入。

以上是关于Babel / Rollup 错误转译和捆绑 ES2017的主要内容,如果未能解决你的问题,请参考以下文章

ES6 和 ES7 功能在 react-native 中没有 babel 转译?

从 Babel 转译过程浅谈 ES6 实现继承的原理

从 npm 本地导入 ES 模块依赖项,无需捆绑/转译第一方源

使用 Babel.js 转译 Async Await 提案?

babel实践:真实gulp项目支持ES6转译ES5的跳坑指北

Babel 2018 为 Node JS 设置自动转译