Babel 6 regeneratorRuntime 未定义

IT技术 javascript node.js babeljs
2021-01-18 19:22:24

我正在尝试在 Babel 6 上从头开始使用 async/await,但我得到regeneratorRuntime的结果没有定义。

.babelrc 文件

{
    "presets": [ "es2015", "stage-0" ]
}

package.json 文件

"devDependencies": {
    "babel-core": "^6.0.20",
    "babel-preset-es2015": "^6.0.15",
    "babel-preset-stage-0": "^6.0.15"
}

.js 文件

"use strict";
async function foo() {
  await bar();
}
function bar() { }
exports.default = foo;

在没有 async/await 的情况下正常使用它可以正常工作。任何想法我做错了什么?

6个回答

babel-polyfill从 Babel 7.4 开始弃用)是必需的。您还必须安装它才能使 async/await 工作。

npm i -D babel-core babel-polyfill babel-preset-es2015 babel-preset-stage-0 babel-loader

包.json

"devDependencies": {
  "babel-core": "^6.0.20",
  "babel-polyfill": "^6.0.16",
  "babel-preset-es2015": "^6.0.15",
  "babel-preset-stage-0": "^6.0.15"
}

.babelrc

{
  "presets": [ "es2015", "stage-0" ]
}

.js 与 async/await(示例代码)

"use strict";

export default async function foo() {
  var s = await bar();
  console.log(s);
}

function bar() {
  return "bar";
}

在启动文件中

require("babel-core/register");
require("babel-polyfill");

如果你使用webpack,你需要将它作为entry你的 webpack 配置文件中数组的第一个值(通常是webpack.config.js),根据@Cemen 评论:

module.exports = {
  entry: ['babel-polyfill', './test.js'],

  output: {
    filename: 'bundle.js'       
  },

  module: {
    loaders: [
      { test: /\.jsx?$/, loader: 'babel', }
    ]
  }
};

如果要使用 babel 运行测试,请使用:

mocha --compilers js:babel-core/register --require babel-polyfill
我试图让我的 mocha 测试与 babel6 和 async 一起运行,我不得不将 --require babel-polyfill 添加到 npm 测试运行器配置中
2021-03-12 19:22:24
@LloyddevDependency如果您使用的是 webpack,因为它会在运行前“编译”文件。dependency如果您不使用 webpack 并且需要 babel。
2021-03-14 19:22:24
当您使用与通天重要的WebPack:而不是使用require("babel-polyfill")其无法正常工作,您可以添加"babel-polyfill"到您entry的配置,这样的:entry: ["babel-polyfill", "src/main.js"]这对我有用,包括在带有 HMR 的 webpack-dev-server 中使用。
2021-03-22 19:22:24
babel-register 有什么用?
2021-03-28 19:22:24
这使得输出文件大小很大......最好只使用你需要的而不是直接要求 babel-polyfill。
2021-04-03 19:22:24

注意 如果您使用的是 babel 7,则该包已重命名为@babel/plugin-transform-runtime

除了 polyfill,我还使用babel-plugin-transform-runtime该插件描述为:

外部化对帮助程序和内置函数的引用,自动填充您的代码而不会污染全局变量。但这实际上意味着什么?基本上,你可以使用 Promise、Set、Symbol 等内置函数,也可以无缝使用所有需要 polyfill 的 Babel 特性,没有全局污染,使其非常适合库。

它还包括对 async/await 以及 ES 6 的其他内置插件的支持。

$ npm install --save-dev babel-plugin-transform-runtime

在 中.babelrc,添加运行时插件

{
  "plugins": [
    ["transform-runtime", {
      "regenerator": true
    }]
  ]
}
这个解决方案是不行的,因为它需要一个额外的 Browserify 或 Webpack 作业来扩展插件require添加调用transform-runtime
2021-03-12 19:22:24
请注意,对于 Babel 7,您需要运行 npm install --save-dev @babel/plugin-transform-runtime
2021-03-12 19:22:24
如果您能够在没有 babel-runtime 的情况下使用它,那是因为它已经在您的依赖树中。所以请注意,如果您正在编写一个库,并且 babel-runtime 作为开发依赖项出现,则它可能不适合您的用户。您必须将其包含为分发的正常依赖项。
2021-03-15 19:22:24
我不需要babel-runtime让异步等待工作。那是对的吗?编辑:我正在运行代码服务器端。:)
2021-03-24 19:22:24
babel-plugin-transform-runtime需要。奇迹般有效。
2021-04-09 19:22:24

Babel 7 用户

我在解决这个问题时遇到了一些麻烦,因为大多数信息都是针对以前的 babel 版本的。对于 Babel 7,安装这两个依赖项:

npm install --save @babel/runtime 
npm install --save-dev @babel/plugin-transform-runtime

并且,在 .babelrc 中,添加:

{
    "presets": ["@babel/preset-env"],
    "plugins": [
        ["@babel/transform-runtime"]
    ]
}
@kyw 最好始终遵循文档 - 除了约定之外没有区别。
2021-03-19 19:22:24
我们如何在没有 .babelrc 的情况下做到这一点(仅使用 webpack 配置文件)
2021-03-21 19:22:24
添加@babel/transform-runtime到插件对我来说导致“未定义导出”错误。我把它改成这样,让异步在 Babel7 中工作:["@babel/plugin-transform-runtime", { "regenerator": true } ]
2021-03-22 19:22:24
该文档将用法显示为"plugins": ["@babel/plugin-transform-runtime"],而不是"plugins": [ ["@babel/transform-runtime"] ]此处。不同的插件名称。两者都有效。但哪一种是合适的呢?...
2021-04-01 19:22:24
遵循此方法时,我得到了未定义的要求
2021-04-01 19:22:24

更新

如果您将目标设置为 Chrome,它会起作用。但它可能不适用于其他目标,请参考:https : //github.com/babel/babel-preset-env/issues/112

所以这个答案是不是对原来的问题很妥当。我会把它留在这里作为参考babel-preset-env

一个简单的解决方案是import 'babel-polyfill'在代码的开头添加

如果你使用 webpack,一个快速的解决方案是添加babel-polyfill如下所示:

entry: {
    index: ['babel-polyfill', './index.js']
}

我相信我已经找到了最新的最佳实践。

检查这个项目:https : //github.com/babel/babel-preset-env

yarn add --dev babel-preset-env

使用以下作为你的 babel 配置:

{
  "presets": [
    ["env", {
      "targets": {
        "browsers": ["last 2 Chrome versions"]
      }
    }]
  ]
}

那么您的应用程序应该可以在 Chrome 浏览器的最后 2 个版本中运行。

您还可以将Node设置为目标或根据https://github.com/ai/browserslist微调浏览器列表

告诉我什么,不要告诉我怎么做。

我真的很喜欢babel-preset-env的理念:告诉我你想支持哪个环境,不要告诉我如何支持它们。这就是声明式编程的美妙之处。

我已经测试过了async await,它们确实有效。我不知道它们是如何工作的,我真的不想知道。我想把时间花在我自己的代码和我的业务逻辑上。感谢babel-preset-env,它将我从 Babel 配置地狱中解放出来。

这确实有效。唯一的缺点是一堆依赖关系,babel-preset-env但我认为这是值得的。也喜欢声明式风格。也是yarn install现在yarn add
2021-03-10 19:22:24
如果您针对较旧的浏览器或节点版本,这不是真正的解决方案
2021-03-24 19:22:24
以防万一它不明显.... 如果您需要代码在 IE11 中工作,这个推荐的解决方案将不起作用
2021-03-31 19:22:24
为什么会有这么多赞成票?这只有效是因为它不再转换 async/await 并且因此不再需要 regeneratorRuntime 并且因为它没有被转换它不会在不支持它的浏览器上工作。
2021-04-05 19:22:24
@gargantuan 是的。
2021-04-08 19:22:24

更新Babel 7 帖子也有更深入的答案。


Babel 7.4.0 或更高版本 (core-js 2 / 3)

Babel 7.4.0 开始@babel/polyfill 弃用

一般来说,有两种安装 polyfills/regenerator 的方法:通过全局命名空间(选项 1)或作为 ponyfill(选项 2,没有全局污染)。


选项1: @babel/preset-env

presets: [
  ["@babel/preset-env", {
    "useBuiltIns": "usage",
    "corejs": 3, // or 2,
    "targets": {
        "firefox": "64", // or whatever target to choose .    
    },
  }]
]

将自动使用regenerator-runtimecore-js根据您的目标无需手动导入任何内容。不要忘记安装运行时依赖项:

npm i --save regenerator-runtime core-js

或者,useBuiltIns: "entry"手动设置并导入它:

import "regenerator-runtime/runtime";
import "core-js/stable"; // if polyfills are also needed

选项 2:@babel/transform-runtime@babel/runtime

这种替代方案没有全局范围污染,适用于图书馆。

{
  "plugins": [
    [
      "@babel/plugin-transform-runtime",
      {
        "regenerator": true,
        "corejs": 3 // or 2; if polyfills needed
        ...
      }
    ]
  ]
}
安装它:
npm i -D @babel/plugin-transform-runtime
npm i @babel/runtime

如果使用corejspolyfill,则替换@babel/runtime@babel/runtime-corejs2(for "corejs": 2) 或@babel/runtime-corejs3(for "corejs": 3)。

{ "presets": [ [ "@babel/preset-env", { "targets": { "esmodules": true } } ] ] } 这对我构建 node.js 有帮助
2021-03-11 19:22:24
请注意,您应该使用@babel/runtime-corejs2or@babel/runtime-corejs3如果分别使用corejs值为2选项3这在文档中提到:babeljs.io/docs/en/babel-plugin-transform-runtime#corejs
2021-03-11 19:22:24
我的意思是我已经知道了,但为了帮助他人,这应该是正确的答案。最好的祝福!
2021-03-12 19:22:24
谢谢@Robin-Hoodie,我更新了答案的最后一部分,以便更清楚地了解这个主题。
2021-03-31 19:22:24