Вывод результата в stdout

SWC (Speedy Web Compiler) рассматривает вывод как часть конвейера трансформации, где результат компиляции JavaScript/TypeScript не сохраняется внутри процесса, а передаётся дальше через стандартные потоки ввода-вывода. Такой подход обеспечивает интеграцию с UNIX-экосистемой и позволяет использовать SWC как звено в цепочке инструментов без промежуточных файлов.

stdout в контексте SWC — это основной канал доставки результирующего кода после трансформации AST. CLI-интерфейс и Node.js-обёртки используют его для передачи JavaScript-кода, sourcemaps или комбинированных структурных данных.


Роль stdout в CLI SWC

При запуске компилятора через CLI результат трансформации может направляться либо в файл, либо в стандартный поток вывода.

В случае отсутствия параметра вывода в файл, SWC использует stdout как канал результата:

  • преобразованный JavaScript-код
  • либо JSON-структура (при специальных режимах)
  • либо объединённый поток кода и sourcemap (в зависимости от конфигурации)

Типичный процесс выглядит как конвейер:

  1. чтение исходного файла или stdin
  2. парсинг в AST
  3. трансформация AST
  4. генерация кода
  5. запись результата в stdout

stdout в этом процессе выступает конечной стадией генерации.


Модель потоковой передачи данных

SWC не ограничивается однократным выводом. Внутри архитектуры реализуется потоковая модель, где данные могут передаваться по мере генерации.

Ключевые особенности:

  • минимизация буферизации результата
  • возможность интеграции с системными пайпами (|)
  • отсутствие необходимости создавать временные файлы
  • поддержка chaining-инструментов (grep-подобные утилиты, форматтеры, минификаторы)

Пример логики потока:

AST → Codegen → Buffer → stdout

В некоторых конфигурациях буферизация заменяется прямой записью в поток, что снижает задержки при больших входных файлах.


Использование stdin → stdout pipeline

Одной из ключевых возможностей SWC является работа через стандартный ввод и вывод без участия файловой системы.

Сценарий:

  • вход: stdin
  • обработка: SWC transform
  • выход: stdout

Это позволяет включать SWC в цепочки:

cat input.js | swc | node

или

swc < input.ts > output.js

stdout становится универсальным транспортом для результата трансформации.


Форматы данных, передаваемых в stdout

SWC может выводить различные типы данных в зависимости от режима работы.

JavaScript-код

Основной режим — генерация JavaScript после трансформации TypeScript, JSX или современных синтаксических конструкций.

stdout содержит:

  • транспилированный ES5/ESM/CJS код
  • результат минификации (при включённых оптимизациях)
  • нормализованный синтаксис после трансформаций

Source Maps

При включённой генерации sourcemap возможны два варианта вывода:

  • отдельный файл (чаще всего)
  • inline-сourcemap в stdout

Inline-вариант внедряется как base64-кодированный блок:

sourceMappingURL=dat a:application/json;base64,...

SWC добавляет его в конец stdout-потока, если задан соответствующий режим конфигурации.


JSON-вывод

Некоторые режимы SWC (например, интеграции с билд-системами) используют stdout как транспорт для структурированных данных.

В таком случае stdout может содержать:

  • AST в сериализованном виде
  • диагностическую информацию
  • метаданные трансформации
  • карту зависимостей модулей

Формат обычно JSON Lines или единый JSON-объект.


Буферизация и производительность stdout

Архитектура SWC оптимизирована под высокую скорость генерации, поэтому работа с stdout реализована с учётом следующих принципов:

Минимизация системных вызовов

Код накапливается в буфере и отправляется в stdout пакетами, что снижает нагрузку на I/O.

Zero-copy подход

При генерации строк часто используется стратегия минимального копирования данных, что уменьшает overhead при больших файлах.

Параллелизм

SWC может выполнять трансформацию в многопоточном режиме (через Rust worker threads), но stdout остаётся единым синхронизированным каналом вывода, в который агрегируются результаты.


Поведение stdout при ошибках

При возникновении ошибок компиляции SWC разделяет потоки:

  • stdout — только успешный результат трансформации
  • stderr — диагностические сообщения и ошибки

Такое разделение позволяет использовать SWC в автоматизированных пайплайнах без риска загрязнения выходного кода ошибками.

Пример логики:

  • код успешно преобразован → stdout заполнен JS
  • ошибка парсинга → stdout пустой, stderr содержит сообщение

Влияние конфигурации на stdout

Поведение stdout зависит от параметров конфигурации:

mode: “normal”

  • вывод JS-кода
  • минимальная структура данных

mode: “detailed”

  • расширенный вывод с метаданными
  • возможны JSON-структуры

sourceMaps: true

  • добавление sourcemap в конец stdout или inline-вставка

minify: true

  • stdout содержит сжатый код без форматирования
  • удаляются пробелы, комментарии и избыточные конструкции

stdout в интеграции с Node.js

При использовании SWC через Node.js API stdout может быть эмулирован или перехвачен:

  • через child_process.spawn
  • через pipe в WritableStream
  • через обёртки CLI-интерфейса

Пример модели:

Node process → SWC CLI → stdout → Node stream consumer

stdout в этом контексте становится промежуточным транспортом между процессами.


Поток stdout в watch-режиме

При включённом режиме наблюдения за файлами SWC может многократно обновлять stdout при каждом изменении входных данных.

Особенности:

  • каждый пересбор генерирует новый поток вывода
  • возможна последовательная запись результатов
  • интеграция с live-reload системами через pipe

stdout в таком режиме используется как непрерывный канал обновлений, а не как одноразовый результат.


Согласованность вывода

SWC гарантирует атомарность вывода в stdout на уровне одного файла трансформации:

  • результат одного файла не перемешивается с другим
  • поток завершается после полного вывода
  • данные не интерливятся между конкурентными задачами

Это важно при параллельной обработке нескольких входных модулей.


Ограничения stdout как канала

Несмотря на универсальность, stdout имеет ограничения:

  • отсутствие случайного доступа к уже выведенным данным
  • невозможность частичного обновления результата
  • зависимость от буферизации терминала или оболочки
  • ограниченная диагностика внутри основного потока вывода

SWC компенсирует это разделением stdout/stderr и возможностью дополнительного JSON-режима.


Роль stdout в архитектуре трансформации

stdout в SWC является финальной точкой вычислительного графа компиляции. Вся система трансформации строится вокруг идеи:

Source → AST → Transformations → Codegen → stdout

Такой подход делает SWC совместимым с потоковыми системами сборки и позволяет использовать его как низкоуровневый компилятор в составе более сложных инструментов.