Parcel использует многоуровневую систему кэширования, ориентированную на сокращение времени повторных сборок и минимизацию повторной обработки неизменённых модулей. Основная идея заключается в сохранении результатов трансформаций, анализа зависимостей и упаковки в промежуточном кэше, который используется при последующих запусках.
Кэш хранится на уровне файловой системы и включает:
Кэш является персистентным, что означает сохранение между запусками процесса сборки.
Parcel строит граф зависимостей один раз, после чего работает только с изменёнными узлами графа. При изменении файла пересчитывается только его подграф зависимостей, а не весь проект.
Ключевым механизмом является отслеживание хешей содержимого:
Это позволяет резко уменьшить время rebuild при сохранении корректности результата.
В основе системы лежит хеш содержимого, а не времени изменения файла. Такой подход снижает вероятность ложных инвалидаций.
Хеш вычисляется на основе:
При изменении любого из этих факторов происходит инвалидация кэша конкретного узла графа.
Особое значение имеет детерминированность: одинаковый вход всегда должен давать одинаковый хеш, что критично для воспроизводимости сборки.
Parcel сохраняет кэш в директории .parcel-cache. Внутри
используется структурированное распределение данных:
Файлы кэша оптимизированы под быстрый доступ и частичное чтение. Это снижает I/O нагрузку при инкрементальных сборках.
Каждый трансформер в Parcel (например, Babel или Sass) работает как чистая функция от входного модуля и конфигурации.
Система кэширует:
При совпадении всех параметров трансформация не выполняется повторно, а результат берётся из кэша.
Parcel активно использует многопоточную обработку через worker threads. Это позволяет распределять нагрузку между ядрами процессора.
Параллельно выполняются:
Каждый воркер работает с изолированным состоянием, а кэш синхронизируется через общий файловый слой.
Граф зависимостей в Parcel является центральной структурой, определяющей производительность сборки.
Оптимизации включают:
Чем стабильнее структура проекта, тем эффективнее работает повторное использование узлов графа.
Различие между холодной и тёплой сборкой существенно влияет на производительность.
Cold start:
Warm rebuild:
В режиме разработки Parcel оптимизирует сборку под частые изменения файлов.
Используются механизмы:
В результате изменения кода отражаются в сборке почти мгновенно, особенно в проектах средней сложности.
Зависимости из node_modules обрабатываются отдельно и
кэшируются агрессивнее, чем пользовательский код.
Особенности:
Это значительно снижает стоимость больших зависимостей в проекте.
Одной из ключевых задач системы является предотвращение избыточной инвалидации кэша.
Проблемные случаи:
Parcel решает эти проблемы через строгую детерминированность пайплайна и контроль входных параметров трансформаций.
Эффективность кэширования можно оценивать через несколько ключевых показателей:
Высокий cache hit rate напрямую коррелирует с сокращением времени сборки.
Минификация также включена в систему кэширования. Результаты сохраняются отдельно для разных режимов сборки.
Кэшируются:
Это позволяет избегать повторной дорогостоящей обработки финального бандла при небольших изменениях исходников.
Любое изменение конфигурации сборщика приводит к пересчёту соответствующих частей кэша.
К конфигурационным факторам относятся:
.parcelrc;Parcel учитывает конфигурацию как часть ключа кэша, обеспечивая корректность пересборки при изменениях окружения.