Parcel 2 построен вокруг строго типизированной и событийно-ориентированной системы плагинов, в которой весь процесс сборки разбивается на последовательные этапы трансформации графа зависимостей. Вместо монолитной логики сборщика используется конвейер, где каждый плагин отвечает за узкую область: поиск модулей, преобразование кода, оптимизацию, упаковку и финальную эмиссию ассетов.
В основе архитектуры лежит концепция Asset Graph — графа ассетов, где каждый узел представляет файл или модуль, а рёбра отражают зависимости. Сборка в Parcel 2 — это последовательное построение и модификация этого графа через цепочку плагинов.
Плагинная система ориентирована на несколько ключевых принципов:
В отличие от классических bundler’ов, Parcel стремится минимизировать глобальное состояние и делает упор на графовый подход, где каждый плагин работает с локальным контекстом узла.
Архитектура Parcel 2 определяет несколько категорий плагинов, каждая из которых подключается на определённом этапе пайплайна.
Резолверы отвечают за преобразование строковых импортов в реальные файлы графа.
Основные задачи:
import 'react' → путь к
пакету)Резолвер работает до построения графа и определяет структуру зависимостей.
Трансформеры — центральная часть системы. Они модифицируют содержимое ассетов.
Функции:
Каждый ассет может проходить через цепочку трансформеров, формируя pipeline обработки.
Валидаторы выполняют статический анализ:
Важно, что валидаторы не изменяют ассеты, а только добавляют диагностическую информацию.
Оптимизаторы применяются после формирования бандлов.
Они отвечают за:
Оптимизация происходит уже на уровне готовой структуры output-графа.
Namer определяет, как будут называться итоговые файлы:
Этот слой критичен для кеширования и CDN-доставки.
Packager собирает ассеты в финальные бандлы.
Он определяет:
Репортёры не влияют на сборку, но наблюдают за процессом:
Parcel 2 строит пайплайн как последовательность фаз:
Каждая фаза открывает доступ к соответствующим хукам плагинов.
Плагин в Parcel 2 — это объект, регистрирующий функции-хуки. Хуки вызываются движком в строго определённые моменты.
Отвечает за преобразование specifier в абсолютный путь.
Поведение:
Ключевая особенность — возможность каскадного разрешения: если один резолвер не обработал запрос, вызывается следующий.
Эти хуки формируют содержимое ассета.
load получает сырой контентtransform последовательно модифицирует егоTransform pipeline может быть асинхронным и зависеть от других ассетов.
Используется для генерации выходного кода из промежуточного представления.
Применяется, например, при:
Вызывается после построения bundle graph.
Позволяет модифицировать финальные бандлы:
Одной из ключевых особенностей Parcel 2 является агрессивная система кеширования.
Каждая стадия пайплайна:
Кеш привязан к:
При изменении любого параметра происходит точечная инвалидизация, а не полный пересбор.
Каждый плагин работает в изолированном контексте, получая только необходимые данные:
Parcel избегает глобальных singleton-состояний, заменяя их контекстными объектами, что улучшает:
Пайплайн Parcel 2 изначально рассчитан на конкурентную обработку:
Это достигается за счёт task scheduler внутри ядра сборщика, который управляет очередями задач.
После этапа трансформации формируется Bundle Graph — структура, отличающаяся от исходного asset graph.
Если asset graph описывает зависимости на уровне файлов, то bundle graph:
Плагины на этапе bundling работают уже не с файлами, а с логическими единицами доставки.
Parcel вставляет runtime-код, который обеспечивает:
Плагины могут модифицировать или расширять runtime, добавляя свою логику поведения.
Несмотря на модульность, плагины взаимодействуют через общие структуры данных:
Ключевая идея — отсутствие прямых вызовов между плагинами. Все взаимодействие происходит через изменение состояния графа.
Каждый плагин может учитывать target-среду:
Target влияет на:
Parcel использует декларативную конфигурацию, где плагины активируются в зависимости от условий окружения.
Плагинная архитектура Parcel 2 спроектирована так, чтобы новые возможности добавлялись без изменения ядра.
Добавление нового поведения обычно включает:
Такой подход позволяет внедрять поддержку новых языков, форматов и инструментов без изменения основного pipeline.
Система плагинов опирается на ряд гарантий:
Эти гарантии позволяют масштабировать сборку на большие проекты без потери стабильности поведения.