冲突使用babel / register

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

在一个包中,我正在做以下工作:

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

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

 require('test'); 

而在“testing”包中:

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

这会引发以下错误:

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

但是,如果我将babel/register行从“test”包中取出,“test”包的index文件中会出现以下错误:

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

我曾尝试使用System.import导入“testing”包(使用BabelJS站点上指定的填充),但在这种情况下,我得到了与上述相同的错误。 我应该如何导入一个包到另一个,并保留使用ES6导入/导出和其他ES6function的能力?

编辑:我简化了这一点,我仍然要求“testing”到第一个包,但我不加载中介文件。 相反,“testing”的“主”文件被设置为test/index.理论上,现在只是加载一个应该可以注册的ES6模块,我仍然会得到上述错误。

正如你所看到的, babel/register只能在每个应用程序中运行一次,而且通常这将是您开始的顶级应用程序。

您面临的问题是,默认情况下, require('babel/register')只会将您的系统设置为直接在模块内部传输文件,而不会处理node_modules 。 一般期望在发布到模块registry之前, node_modules中的任何内容node_modules将被提前编译。

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

最好的解决scheme是提前将您的test模块进行传输。 如果这不起作用,那么可以使用only选项为应该被转发的path指定一个正则expression式或者glob。

在我的情况下,我摆脱了设置:

 self._babelPolyfill = false; 

我不知道是否第二次设置polyfill会导致一些微妙的问题,但是通过大量的unit testing,我没有看到使用这个黑客程序来避免脚本窒息的问题。

错误: only one instance of babel/polyfill is allowed polyfill的only one instance of babel/polyfill is allowed就是@loganfsmyth提到的:多个polyfill,可以同时使用babel-node./register-babel

但是,在我的情况下,这个错误奇怪, 直到我有另一个错误显示出来。 我的意思是,一切正常,然后我有一个EADDRINUSE错误。 当它发生时,它被遮住了,出现了填充错误。 很奇怪。 我在任何与巴别有关的地方都没有碰到我的代码。

一旦我固定了EADDRINUSEEADDRINUSE出现了,我能够解决所有问题。