Это может быть ошибкой в Babel CLI (я использую 6.24.1), но, похоже, что Babel не применяет .babelrc
когда исходные данные .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 полностью игнорирует .babelrc
когда он получает данные из канала.
Для справки, это - .babelrc
который должен применяться:
{
"presets": [ "es2015" ]
}
Зачем использовать трубы?
Для чего это стоит, вы можете задаться вопросом: "Зачем вводить вход в Babel? Почему бы просто не использовать файлы?"
Ну, во-первых, трубопровод является поддерживаемой функцией, поэтому он должен "просто работать".
Но в моем случае исходные файлы, передаваемые в Babel, сами являются результатом цепочки генерации кода, которая выводит действительный код ES6 в качестве вывода. Было бы неплохо, если бы генератор кода не ~temp.js
промежуточный файл ~temp.js
а затем должен был быть удален после этого; было бы намного лучше, если бы трубы работали так, как они предполагали.
Вопрос:
Это ошибка? Если да, знает ли кто-нибудь об улучшенном ~temp.js
пути, чем просто испускает файл с именем ~temp.js
, передавая его в Babel, а затем удаляя его?
Это ожидаемое поведение, но мы говорили о некоторых альтернативах в https://github.com/babel/babel/pull/5384.
См. Мой комментарий здесь для некоторой информации. Как уже упоминалось, текущее исправление для вас будет состоять в том, чтобы сделать
cat foo.js | babel --filename foo.js --out-file foo2.classic.js
сообщить Бабелю имя файла, поэтому он знает, где искать файл .babelrc
.
kirs
с предложением--babelrc
добавить опцию--babelrc
. Его не сложно понять (или реализовать), он похож на параметры--config
, которые есть во многих других инструментах (поэтому есть прецедент), и он очень предсказуем в своем поведении.kirs
определенно прав в одном: текущее поведение абсолютно нарушает Принцип Наименьшего Изумления, так что само по себе требует каких-то изменений. Либо он должен читать из текущего каталога, либо добавить--babelrc
(или, что еще лучше, сделать и то и другое) для поддержки взаимодействия сstdin
.