ReferenceError: regeneratorRuntime 未定义(但在范围内工作)

新手上路,请多包涵

我遇到过这种奇怪的情况:

ReferenceError: regeneratorRuntime is not defined

…我已经设法在非常小的设置中重现(与同一问题上的类似 SO 问题相比),并且还注意到一些奇怪的行为取决于是否使用范围。

以下代码有效:

 'use strict';

require('babel-polyfill');

{  // scope A (if you remove it you observe different behavior when .babelrc is present)

    function *simplestIterator() {
        yield 42;
    }

    for (let v of simplestIterator()) {
        console.log(v);
    }

}

套餐是:

 $ npm ls --depth 0
simple-babel-serverside-node-only-archetype@1.0.0 /home/mperdikeas/regeneratorRuntimeNotDefined
├── babel-cli@6.7.5
├── babel-core@6.7.6
├── babel-polyfill@6.7.4
├── babel-preset-es2016@6.0.11
└── babel-runtime@6.6.1

.babelrc 的内容是:

 $ cat .babelrc
{
    "presets": ["es2016"]
}

但是,当删除范围并将 simplestIterator 放置在全局范围时,它会失败:

 ReferenceError: regeneratorRuntime is not defined

更奇怪的是,如果 .babelrc 文件被删除/重命名,无论范围是否存在,代码都会成功。顺便说一句,无论是范围还是封装生成器的 IIFE 都没有区别。

在此处 演示此行为的最小 github 存储库。

观察行为:

 git clone https://github.com/mperdikeas/regeneratorRuntimeNotDefined.git
cd regeneratorRuntimeNotDefined/
npm install
npm run build && npm run start

以上将在控制台输出 42 。现在移除示波器,看看会发生什么。然后重命名 .babelrc 以查看它再次工作(有或没有范围)。

我的问题是:

  • 为什么 es2016 Babel 预设会触发此错误
  • 为什么将生成器放在范围内可以解决问题?

更新

基于接受的答案,因为这是我正在编写的模块的代码,所以我最终做了:

 require('babel-polyfill');
module.exports = require('./app.js');

原文由 Marcus Junius Brutus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 812
2 个回答

Babel 假定 polyfill 将在您的应用程序中的任何其他内容之前加载,但是您使用的是一个函数声明,它被提升了,这意味着它存在并且在 require 被调用 之前 可用。

如果是生成器,则需要 regeneratorRuntime 由 polyfill 提供,但是在初始化再生器时还没有加载 polyfill。

Babel 团队的建议是制作两个文件:

索引.js

 require('babel-polyfill');
require('./app');

原文由 loganfsmyth 发布,翻译遵循 CC BY-SA 3.0 许可协议

您也可以使用 es2015 preset 和 transform-regenerator 插件执行以下操作:

.babelrc

 {
  "presets": ["es2015"],
  'plugins': [
    'transform-regenerator'
  ]
}

代码

let regeneratorRuntime =  require("regenerator-runtime");
// You code with ES6 generators

PS 当然你应该安装 babel-plugin-transform-regenerator npm 包。

原文由 Mark Lavrynenko 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题