Система событий в Parcel строится вокруг реактивной модели: сборка рассматривается как поток состояний, каждое из которых фиксируется и передаётся подписчикам. Такой подход позволяет интегрировать Parcel с системами логирования, мониторинга, CI/CD и инструментами разработки без вмешательства в сам процесс бандлинга.
События формируются на разных этапах жизненного цикла сборки:
Каждый этап сопровождается структурированным объектом события, который содержит контекст текущего состояния сборки.
В Parcel (через API @parcel/core) события передаются как
поток объектов с типом события, определяющим фазу процесса.
Событие фиксирует старт сборки. Оно содержит базовую информацию о конфигурации и входных точках.
Ключевые поля:
type: buildStartbuildId: идентификатор сборкиentries: список входных файловoptions: конфигурация бандлераНа этом этапе граф зависимостей ещё не построен, но уже определена структура будущей сборки.
Событие отражает промежуточное состояние процесса.
Используется для отслеживания длительных операций:
Содержит:
Финальное успешное состояние сборки.
Содержит:
type: buildSuccessbuildTime: общее время выполненияbundleGraph: итоговый граф бандловchangedAssets: список изменённых ресурсовrequestBundleResults: результаты генерации бандловИменно через этот объект доступна структура итогового артефакта сборки, включая все оптимизации и разделения кода.
Событие аварийного завершения процесса.
Основные поля:
type: buildFailurediagnostics: массив диагностических сообщенийcodeFrames: контекст ошибок в исходном кодеbuildTime: время до ошибкиДиагностика в Parcel структурирована: каждая ошибка содержит тип, уровень серьёзности, трассировку и привязку к исходным файлам.
В программной модели Parcel подписка на события реализуется через
экземпляр класса Parcel, предоставляемого пакетом
@parcel/core.
Механизм основан на функции обратного вызова, принимающей поток событий сборки.
import Parcel from '@parcel/core';
const bundler = new Parcel({
entries: 'src/index.js',
defaultConfig: '@parcel/config-default'
});
bundler.watch((err, event) => {
if (err) {
// критическая ошибка инфраструктуры
return;
}
switch (event.type) {
case 'buildStart':
break;
case 'buildProgress':
break;
case 'buildSuccess':
break;
case 'buildFailure':
break;
}
});
Callback выполняет роль центрального обработчика, получающего все события в реальном времени. Архитектура предполагает единый поток событий, а не множественные независимые подписки.
Все события Parcel имеют общую основу:
type — идентификатор событияbuildTime — время выполнения (если применимо)buildId — уникальный идентификатор процессаОбъекты событий не мутируют в процессе передачи. Каждое событие является снимком состояния сборки на конкретный момент времени.
В Parcel существует отдельный уровень подписки на события — Reporter-плагины. Они предназначены для интеграции с внешними системами: терминалами, логгерами, сервисами мониторинга.
Плагин реализуется через @parcel/plugin:
import { Reporter } from '@parcel/plugin';
export default new Reporter({
report({ event, options }) {
switch (event.type) {
case 'buildStart':
break;
case 'buildProgress':
break;
case 'buildSuccess':
break;
case 'buildFailure':
break;
}
}
});
Reporter получает доступ ко всем событиям сборки без необходимости
использования низкоуровневого API Parcel.
Особенность модели заключается в том, что reporter не влияет на процесс сборки. Он работает асинхронно и не блокирует пайплайн.
При использовании режима наблюдения (watch) события
формируются непрерывно, при каждом изменении исходных файлов.
Жизненный цикл выглядит как повторяющийся цикл:
Каждый новый цикл получает новый buildId, что позволяет
различать последовательные сборки в одном процессе.
Ошибки в Parcel разделяются на два уровня:
Инфраструктурные ошибки передаются первым аргументом callback:
bundler.watch((err, event) => {
if (err) {
// ошибка уровня процесса
}
});
Компиляционные ошибки приходят как buildFailure,
содержащий диагностический массив:
Диагностика структурирована так, чтобы обеспечить машинную обработку и группировку ошибок по типам.
Событийная модель Parcel часто используется для интеграции с внешними инструментами:
События позволяют строить детализированные логи сборки:
На основе buildTime и buildProgress
формируются метрики:
События buildSuccess и buildFailure
используются для:
События Parcel не блокируют основной поток выполнения. Обработчики вызываются асинхронно, что исключает задержки в процессе бандлинга.
Это приводит к следующим характеристикам модели:
В режиме наблюдения события формируются на основе инкрементального анализа изменений.
При изменении одного модуля:
buildProgress отражает локальную переработкуbuildSuccess содержит обновлённый подграфСобытийная модель остаётся неизменной независимо от масштаба пересборки, что обеспечивает единообразие обработки логики.
Parcel гарантирует последовательность событий внутри одного
buildId. Это означает:
buildStart всегда предшествует
buildSuccess или buildFailurebuildProgress всегда находятся между нимиТакая модель упрощает агрегацию данных в многопоточном окружении и позволяет корректно синхронизировать внешние системы мониторинга с состоянием сборки.