什么决定了babel-transiled脚本中`require`调用的顺序?

时间:2016-05-28 21:02:15

标签: node.js ecmascript-6 babeljs

所以,到目前为止,我的工作流程是

import "babel-polyfill";

使用async / await等功能要求babel在转换中包含再生器运行时。

对于需要我模块的用户,我看到了以下问题:

  • 用户处于ES2015环境中,并使用babel-polyfill转换代码。由于babel-polyfill只需要一次,因此根本无法使用我的模块。
  • 如果我选择来加入babel-polyfill,则babel不知道模块 需要babel-polyfill并且赢了&# 39;尊重生成的require顺序(至少我认为发生的事情)。

我最近创建了一个不带babel-polyfill的npm模块,但要求用户在我的npm模块上调用babel-polyfill之前包含require,因为它使用asyncawait

因此,在我目前的项目中,我想在index.js中使用我的模块:

import "babel-polyfill";
import Server from "./Server";
import foo from "bar";
import baz from "qux";

其中Server是一个扩展我的模块的类,需要babel-polyfill

然而,index.js的翻译开头是这样的:

!function(e, r) {
  if ("function" == typeof define && define.amd)
      define(["bar", "qux", "./Server", "babel-polyfill"], r);
  else if ("undefined" != typeof exports)
      r(require("bar"), require("qux"), require("./Server"), require("babel-polyfill"));
  // etc.
}();

在这里,我可以清楚地看到./Serverbabel-polyfill之前需要,尽管我的ES2015 import语法要求相反。事实上,整个订单都是混乱的。

这就是我收到错误的原因:

ReferenceError: regeneratorRuntime is not defined

如何告诉babel尊重我的来源订单?

1 个答案:

答案 0 :(得分:0)

据我所知,你不能告诉Babel尊重你的来源的顺序 - 它总是提升进口并在之后评估其他一切。当您想要首先确保评估某些代码(通常是全局分配)时,唯一的方法似乎是切换到需要。根据我的回答here

许多issues针对与此相关的Babel提出(并关闭/拒绝)。