Одной из особенностей Esbuild является возможность записывать результат сборки не в файл, а непосредственно в стандартный поток вывода (stdout). Такой режим особенно полезен при построении конвейеров обработки данных, интеграции с другими инструментами командной строки, генерации временных артефактов и использовании Esbuild в автоматизированных сценариях.
По умолчанию Esbuild стремится записывать результаты сборки в файловую систему. Однако во многих случаях конечный файл не требуется, поскольку результат может быть сразу передан следующей программе через конвейер операционной системы.
В большинстве операционных систем процессы работают с тремя стандартными потоками:
| Поток | Назначение |
|---|---|
| stdin | Входные данные |
| stdout | Основной вывод программы |
| stderr | Сообщения об ошибках |
Когда Esbuild выводит результат в stdout, содержимое сгенерированного JavaScript-кода, CSS-кода или другого артефакта появляется непосредственно в консоли либо передаётся следующему процессу через механизм перенаправления.
Схематически процесс выглядит следующим образом:
Исходный файл
│
▼
Esbuild
│
▼
stdout
│
┌────┴────┐
▼ ▼
Консоль Другая программа
--outfile и stdoutВ обычной ситуации применяется команда:
esbuild app.js --bundle --outfile=dist/app.js
Результат сохраняется в файл:
dist/app.js
Если необходимо вывести сборку непосредственно в терминал, параметр
--outfile не указывается.
Пример:
esbuild app.js --bundle
Вывод:
(() => {
console.log("Hello");
})();
Полученный код отображается в консоли и одновременно считается содержимым потока stdout.
--outfile и ошибка конфигурацииEsbuild не позволяет одновременно использовать stdout и вывод в файл.
Некорректный пример:
esbuild app.js --bundle --outfile=app.bundle.js
и ожидать вывод в консоль одновременно.
Режим работы должен быть выбран однозначно:
Наиболее распространённый сценарий использования stdout связан с перенаправлением данных в другие утилиты.
Пример:
esbuild app.js --bundle | gzip > app.js.gz
Последовательность действий:
gzip.Схема работы:
app.js
│
▼
esbuild
│
stdout
│
▼
gzip
│
▼
app.js.gz
Подобный подход широко применяется в CI/CD-системах и сценариях автоматизации.
Хотя Esbuild способен самостоятельно создавать файлы через
outfile, иногда запись выполняется средствами оболочки.
Пример:
esbuild app.js --bundle > bundle.js
Здесь происходит следующее:
bundle.js.Функционально результат похож на использование outfile,
однако управление записью берёт на себя операционная система.
Стандартный поток вывода часто используется совместно с минификацией.
Пример:
esbuild app.js --bundle --minify
Результат:
(()=>{console.log("Hello")})();
Такой вывод может быть немедленно передан другой программе:
esbuild app.js --bundle --minify | gzip
--formatФормат генерируемого модуля не зависит от способа вывода.
CommonJS:
esbuild app.js --bundle --format=cjs
ES Module:
esbuild app.js --bundle --format=esm
IIFE:
esbuild app.js --bundle --format=iife
Во всех случаях результат отправляется в stdout.
При использовании JavaScript API вывод в stdout обычно реализуется через отключение записи на диск.
Пример:
import * as esbuild from 'esbuild';
const result = await esbuild.build({
entryPoints: ['app.js'],
bundle: true,
write: false
});
Параметр:
write: false
указывает Esbuild не записывать файлы в файловую систему.
Сгенерированный код становится доступным через объект результата:
console.log(result.outputFiles[0].text);
Фактически содержимое выводится в stdout средствами Node.js.
Полный пример:
import * as esbuild from 'esbuild';
const result = await esbuild.build({
entryPoints: ['app.js'],
bundle: true,
write: false
});
process.stdout.write(
result.outputFiles[0].text
);
transform() и stdoutМетод transform() также хорошо сочетается с выводом в
стандартный поток.
Пример:
import * as esbuild from 'esbuild';
const result = await esbuild.transform(
'const x = () => 10',
{
minify: true
}
);
process.stdout.write(result.code);
Результат:
const x=()=>10;
В данном случае файловая система вообще не используется.
Esbuild способен выводить не только JavaScript.
Пример:
esbuild styles.css --minify
Вывод:
body{margin:0;padding:0}
Далее результат может быть передан другой программе:
esbuild styles.css --minify | some-tool
При использовании source map следует учитывать способ их генерации.
Обычный вариант:
esbuild app.js --bundle --sourcemap
При записи в stdout отдельный файл карты создать невозможно, поскольку отсутствует путь назначения.
Поэтому обычно применяется встроенная карта:
esbuild app.js --bundle --sourcemap=inline
В результате карта исходников встраивается непосредственно в выводимый код.
Esbuild хорошо интегрируется с классическими Unix-инструментами.
Фильтрация результата:
esbuild app.js --bundle | grep "console"
Подсчёт размера:
esbuild app.js --bundle | wc -c
Просмотр первых строк:
esbuild app.js --bundle | head
Просмотр последних строк:
esbuild app.js --bundle | tail
Подобные сценарии позволяют быстро анализировать результаты сборки без создания временных файлов.
При работе внутри контейнеров вывод в stdout особенно востребован.
Пример:
esbuild app.js --bundle --minify
Полученный результат может быть перехвачен другой командой контейнера либо системой логирования.
Такой подход уменьшает количество временных файлов и упрощает организацию сборочных процессов.
Во многих системах непрерывной интеграции артефакты не обязательно сохранять локально.
Пример сценария:
esbuild src/index.js --bundle --minify | gzip | base64
Результат может быть:
Запись в stdout делает подобные цепочки максимально гибкими.
Минимизация операций ввода-вывода
Отсутствует необходимость создавать промежуточные файлы.
Интеграция с конвейерами
Результат легко передаётся другим программам.
Удобство автоматизации
Подходит для скриптов сборки и CI/CD-процессов.
Гибкость обработки
Вывод можно фильтровать, архивировать, анализировать или модифицировать без промежуточного сохранения.
Снижение нагрузки на файловую систему
Особенно заметно при большом количестве временных сборок.
Если сборка предполагает генерацию множества файлов, режим stdout становится неудобным, поскольку поток вывода представляет собой единую последовательность данных.
Для корректной работы карт исходников обычно используется режим:
--sourcemap=inline
При наличии большого количества ресурсов чаще используются:
--outfile
или
--outdir
поскольку они позволяют сохранить структуру выходных файлов.
Код сборки отправляется в stdout, а ошибки и предупреждения — в stderr.
Это позволяет безопасно использовать конвейеры:
esbuild app.js --bundle | gzip
Даже если возникают диагностические сообщения, они не повреждают поток выходного кода.
| Возможность | stdout | outfile |
|---|---|---|
| Вывод в консоль | Да | Нет |
| Работа через pipe | Да | Нет |
| Автоматическое создание файла | Нет | Да |
| Удобство для CI/CD | Высокое | Среднее |
| Работа с несколькими файлами | Ограничена | Полная |
| Использование временных артефактов | Удобно | Менее удобно |
| Интеграция с Unix-инструментами | Отличная | Ограниченная |
Запись результата в stdout превращает Esbuild из обычного сборщика файлов в универсальный инструмент потоковой обработки данных. Благодаря этому сборка может становиться частью сложных конвейеров, взаимодействовать с системными утилитами, работать без промежуточных файлов и эффективно использоваться в сценариях автоматизации любого уровня сложности.