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 来避免脚本阻塞的任何问题。
两个本地 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 来避免脚本阻塞的任何问题。