Reporter: вывод информации о сборке

Reporter в Parcel отвечает за формирование и вывод всей информации о процессе сборки: прогресс, ошибки, предупреждения, структуру бандлов, статистику и дополнительные диагностические данные. Это слой, который отделяет внутреннюю работу сборщика от способа отображения результата в терминале, CI-системах или внешних инструментах.

Система reporter построена как независимый слой поверх графа сборки. В процессе выполнения Parcel генерирует события (build events), которые затем передаются в один или несколько репортеров.

Ключевая идея заключается в разделении:

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

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

Основной CLI reporter

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

Он отображает:

  • старт сборки и режим (development/production);
  • список входных точек;
  • прогресс обработки модулей;
  • размер бандлов после оптимизации;
  • время сборки;
  • статус кеширования.

Пример типичного вывода:

✨ Built in 1.32s

dist/index.js       120 KB
dist/vendor.js      540 KB

Важная особенность CLI reporter — потоковый вывод. Информация обновляется по мере изменения состояния сборки, а не только в конце.

Прогресс и этапы сборки

Reporter отображает внутренние стадии пайплайна:

  • анализ зависимостей;
  • трансформация модулей;
  • tree-shaking;
  • оптимизация;
  • упаковка бандлов.

Каждый этап может сопровождаться прогресс-баром или текстовыми статусами. В режиме watch обновления происходят инкрементально, что позволяет отслеживать изменения почти в реальном времени.

Диагностические сообщения

Система диагностики интегрирована в reporter и включает три основных уровня:

Ошибки

Ошибки останавливают сборку и всегда выводятся с контекстом:

  • файл и позиция;
  • стек вызовов;
  • тип ошибки (syntax, resolve, transform);
  • подсказки по исправлению.

Пример:

@parcel/core: Cannot resolve 'react' from './App.js'

Предупреждения

Warnings не прерывают сборку, но сигнализируют о потенциальных проблемах:

  • неиспользуемые зависимости;
  • deprecated API;
  • медленные трансформации.

Информационные сообщения

Используются для уведомлений о внутренних решениях сборщика:

  • включение кеша;
  • использование fallback трансформера;
  • переключение оптимизаций.

Расширенный режим вывода

Parcel поддерживает более детализированный вывод, который активируется через настройки или CLI-флаги.

В расширенном режиме reporter может отображать:

  • дерево зависимостей;
  • размеры отдельных модулей;
  • разбивку по чанкам;
  • причины включения модулей в бандл.

Это особенно важно для анализа производительности и оптимизации сборки.

JSON reporter

JSON reporter используется для интеграции с внешними инструментами:

  • CI/CD системы;
  • dashboards;
  • аналитические сервисы;
  • кастомные инструменты мониторинга.

Вывод структурирован и содержит:

  • события сборки;
  • список ассетов;
  • ошибки и предупреждения;
  • временные метки.

Пример структуры:

{
  "type": "buildSuccess",
  "buildTime": 1320,
  "assets": [
    {
      "name": "index.js",
      "size": 120000
    }
  ]
}

JSON reporter важен для автоматизации, так как исключает необходимость парсинга текстового вывода.

Множественные reporters

Parcel позволяет использовать несколько reporters одновременно.

Например:

  • CLI reporter для разработчика;
  • JSON reporter для CI;
  • custom reporter для логирования.

Конфигурация может выглядеть следующим образом:

{
  "reporters": [
    "default",
    "parcel-reporter-json"
  ]
}

Каждый reporter получает одинаковый поток событий, но форматирует их независимо.

Custom reporter API

Система расширения reporter построена на событиях.

Custom reporter может подписываться на:

  • buildStart
  • buildProgress
  • buildSuccess
  • buildFailure
  • buildEvent

Базовая структура плагина:

export default {
  report({ event }) {
    if (event.type === 'buildSuccess') {
      console.log('Сборка завершена');
    }
  }
};

В более сложных сценариях reporter может:

  • писать логи в файл;
  • отправлять метрики;
  • интегрироваться с внешними API;
  • визуализировать зависимость модулей.

Информация о бандлах и ассетах

Reporter предоставляет детальную информацию о выходных файлах:

  • имя чанка;
  • размер до и после минификации;
  • хеш для кеширования;
  • список исходных модулей.

Эти данные позволяют анализировать:

  • эффективность code splitting;
  • влияние зависимостей на размер бандла;
  • стабильность кеша.

Watch mode и инкрементальные обновления

В режиме watch reporter обновляет только изменившиеся части:

  • пересобранные модули;
  • затронутые чанки;
  • изменённые зависимости.

Это снижает шум в выводе и ускоряет анализ изменений.

Сообщения часто выглядят как diff-обновления, а не полный повтор всей информации.

Производительность reporter

Reporter спроектирован так, чтобы минимально влиять на скорость сборки.

Основные принципы:

  • асинхронная обработка событий;
  • минимальная блокировка main thread;
  • батчинг сообщений;
  • ленивый рендеринг больших структур.

При использовании JSON reporter накладные расходы ниже, чем у текстового, из-за отсутствия форматирования строк.

Логирование в CI окружениях

В CI важна стабильность и предсказуемость вывода.

Reporter в таких сценариях:

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

Это позволяет корректно сохранять логи в системах вроде GitHub Actions или GitLab CI.

Событийная модель reporter

В основе лежит поток событий, где каждое событие имеет:

  • тип;
  • payload;
  • временную метку;
  • контекст сборки.

Такая модель позволяет:

  • синхронизировать несколько reporters;
  • строить внешние аналитические системы;
  • воспроизводить процесс сборки постфактум.

Структура диагностических данных

Диагностика, передаваемая reporter, включает:

  • code frame (фрагмент исходного кода);
  • указатель на файл;
  • категорию ошибки;
  • возможные исправления (code actions).

Это делает сообщения не просто информативными, а пригодными для автоматической обработки IDE и инструментами разработчика.