这可能是Babel CLI 中的一个错误(我使用的是 6.24.1),但似乎 Babel 在源数据通过管道传输到它时.babelrc
不适用。
例:
给定此源文件,foo.js
:
const foo = 10;
好:此命令执行您认为应该执行的操作,.babelrc
位于同一目录中,其中包含es2015
预设:
babel foo.js --out-file foo.classic.js
这会导致foo.classic.js
,并具有正确转译的内容:
"use strict";
var foo = 10;
错误:此命令未执行预期操作:
cat foo.js | babel --out-file foo2.classic.js
这会导致foo2.classic.js
,内容不变:
const foo = 10;
好:此命令执行您的预期,因此它不是实际配置的错误:
cat foo.js | babel --presets es2015 --out-file foo3.classic.js
结果foo3.classic.js
:
"use strict";
var foo = 10;
分析:在管道情况下,Babel 显然是从管道读取数据并将其传递出去(因为创建了输出文件),但 Babel 在从管道获取数据时似乎完全忽略了.babelrc
。
作为参考,这是应该应用的.babelrc
:
{
"presets": [ "es2015" ]
}
为什么要使用管道?
对于它的价值,你可能会想,"为什么要通过管道输入到 Babel? 为什么不直接使用文件呢?
嗯,一方面,管道是一个受支持的功能,所以它应该"正常工作"。
但就我而言,传递给 Babel 的源文件本身就是代码生成链的结果,该链产生有效的 ES6 代码作为输出。 最好不必让代码生成器输出一个~temp.js
中间文件,然后必须将其删除;如果管道按预期工作,那就更好了。
问题:
这是一个错误吗? 如果是,有谁知道比仅仅发出一个名为~temp.js
的文件,将其传递给 Babel,然后将其删除更好的解决方法?
这是当前预期的行为,但我们在 https://github.com/babel/babel/pull/5384 中讨论了一些替代方案。
有关一些信息,请参阅我的评论。如前所述,您当前的修复方法是
cat foo.js | babel --filename foo.js --out-file foo2.classic.js
告诉 Babel 文件名,这样它就知道在哪里搜索.babelrc
文件。