babel/register 的使用冲突

Conflicting use of babel/register

两个本地 npm 包之间的 babel/register 似乎有冲突。

在一个包中,我正在执行以下操作:

require('babel/register');
require('index');

并且在同一个包的索引文件中:

require('test');

并且在 "test" 包中:

require('babel/register');
require('test/index');

这会引发以下错误:

throw new Error("only one instance of babel/polyfill is allowed");

但是如果我从 "test" 包中取出 babel/register 行,我会在 "test" 包的 index 文件中得到以下错误:

import fs from 'fs';
^^^^^^
SyntaxError: Unexpected reserved word

我也尝试过使用 System.import 导入 "test" 包(使用 BabelJS 站点上指定的 polyfill),但在这种情况下,我得到与上述相同的错误。我应该如何将一个包导入另一个包并保留使用 ES6 imports/exports 和其他 ES6 功能的能力?

编辑:我稍微简化了一点,我仍然需要将 "test" 放入第一个包中,但我没有加载中间文件。相反,“测试的"main"文件设置为test/index.理论上,现在它只是加载一个ES6模块,它应该能够注册。我仍然得到上面的错误。

如您所见,babel/register 仅意味着每个应用程序 运行 一次,通常这将是您启动的顶级应用程序。

您面临的问题是,默认情况下,require('babel/register') 只会将您的系统设置为直接在模块内部转译文件,它不会处理 node_modules。通常期望 node_modules 中的任何内容在发布到您的模块注册表时都会提前编译。

一个选项是将 ignore: false 作为选项传递,例如require('babel/register')({ignore: false}); 然而,这通常不是一个好主意,可能会导致其他问题。这将使 Babel 转译 所有 文件,但这并不总是一件安全的事情,因为并非所有 JavaScript 代码都保证是有效的 ES6 模块。

最好的解决方案是提前编译您的 test 模块。但是,如果这不起作用,您可以使用 only 选项为应转译的路径指定正则表达式或 glob。

错误:only one instance of babel/polyfill is allowed 正是@loganfsmyth 提到的:多个 polyfill,这可能是由于同时使用 babel-node 和要求 ./register-babel 造成的。

但是,在我的例子中,奇怪的是,这个错误没有出现 ,直到 我遇到了另一个错误。我的意思是,一切正常,然后我遇到了 EADDRINUSE 错误。当它发生时,它被遮蔽并且出现了 polyfill 错误。很奇怪。我没有在任何与 Babel 相关的地方触及我的代码。

修复 polyfill 后,EADDRINUSE 出现了,我能够解决所有问题。

在我的例子中,我逃脱了设置:

self._babelPolyfill = false;

我不知道第二次设置 polyfill 是否会导致一些微妙的问题,但是通过大量的单元测试,我没有发现使用这个 hack 来避免脚本阻塞的任何问题。