使用babel / register的冲突

时间:2015-07-08 02:49:33

标签: node.js babeljs

我在babel/register两个本地npm包之间出现了冲突。

在一个包中,我正在做以下事情:

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

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

require('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导入/导出和其他ES6功能的能力?

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

3 个答案:

答案 0 :(得分:2)

如您所见,babel/register仅适用于每个应用程序运行一次,通常是您正在启动的顶级应用程序。

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

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

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

答案 1 :(得分:1)

在我的情况下,我离开了设置:

self._babelPolyfill = false;

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

答案 2 :(得分:0)

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

然而,在我的情况下,这个错误奇怪地没有显示直到我有另一个错误。我的意思是,一切正常,然后我遇到EADDRINUSE错误。当它发生时,它被遮蔽并且polyfill错误出现了。很奇怪。在与Babel相关的任何地方,我都没有碰过我的代码。

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