Babel CLI 在输入通过管道传输时忽略配置



这可能是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文件。

最新更新