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

Babel CLI ignores configuration when input is piped

这可能是 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" ]
}

为什么要用管道?

对于它的价值,您可能想知道,"Why pipe input to Babel? Why not just use files?"

嗯,一方面,管道是受支持的功能,因此它应该 "just work."

但在我的例子中,传递给 Babel 的源文件本身是生成有效 ES6 代码作为输出的代码生成链的结果。最好不要让代码生成器输出一个 ~temp.js 中间文件,然后再删除它;如果管道能正常工作就更好了。


题目:

这是一个错误吗?如果是,有没有人知道比只发出一个名为 ~temp.js 的文件,将其传递给 Babel,然后删除它更好的解决方法?

这是目前预期的行为,但我们在 https://github.com/babel/babel/pull/5384 中讨论了一些替代方案。

有关某些信息,请参阅 my comment here。正如那里提到的,当前的解决方法是

cat foo.js | babel --filename foo.js --out-file foo2.classic.js

告诉 Babel 文件名,这样它就知道在哪里搜索 .babelrc 文件。