我在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/index.
理论上,现在它只是加载一个ES6模块,它应该能够注册。我仍然得到上述错误。
答案 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
出现了,我能够解决所有问题。