Файловый кэш в Parcel (bundler) организован как двухуровневая система: локальный (проектный) и глобальный (пользовательский). Такая архитектура снижает время повторных сборок, минимизирует повторную трансформацию модулей и позволяет эффективно переиспользовать результаты компиляции между запусками сборщика.
Основной слой кэширования располагается внутри проекта в директории:
.parcel-cache/
Эта директория создаётся автоматически при первом запуске сборки и содержит данные, привязанные к конкретному проекту. Внутри хранятся результаты трансформаций модулей, метаданные зависимостей, граф модулей и промежуточные представления ассетов.
Внутреннее устройство .parcel-cache не предназначено для
ручного редактирования, но логически включает несколько типов
данных:
Parcel использует инкрементальную модель: при повторной сборке он
сравнивает хеши входных файлов и, если изменения отсутствуют, извлекает
готовые результаты из .parcel-cache без повторного
выполнения трансформаций.
Механизм основан на сочетании следующих факторов:
Любое изменение хотя бы одного из этих параметров приводит к инвалидированию соответствующих записей кэша. Это обеспечивает корректность сборки при сохранении высокой скорости повторного запуска.
Помимо локального кэша, используется глобальное хранилище, расположенное в пользовательской системе.
Linux:
~/.cache/parcelmacOS:
~/Library/Caches/parcelWindows:
%LOCALAPPDATA%\parcel-cacheЭтот уровень кэширования содержит более тяжёлые и переиспользуемые артефакты, которые могут быть общими для разных проектов.
Глобальный кэш используется для:
В отличие от локального, глобальный кэш не привязан к конкретной структуре проекта и может использоваться повторно в различных окружениях.
Parcel активно использует подход content-addressable storage. Это означает, что ключом для хранения данных является не имя файла, а его содержимое, преобразованное в хеш.
Такой подход особенно эффективен при работе с большими монорепозиториями, где одинаковые зависимости встречаются многократно.
Механизм очистки и обновления кэша встроен в систему сборки.
Кэш пересчитывается при:
.parcelrc,
package.json);Parcel отслеживает эти изменения через систему хеширования и метаданные графа зависимостей.
Инвалидация может происходить на разных уровнях:
Файловый кэш напрямую влияет на скорость сборки:
.parcel-cache;На больших проектах разница может составлять порядок величины — от десятков секунд до долей секунды при инкрементальной пересборке.
Parcel сохраняет не только результаты трансформаций, но и структуру зависимостей:
@import, URL-ресурсы);Эти данные позволяют восстанавливать граф без повторного анализа исходного кода.
Внутренние данные кэша сериализуются в бинарном формате, оптимизированном под быстрый доступ. В зависимости от версии Parcel могут использоваться:
Такой формат снижает накладные расходы на чтение и запись при инкрементальной сборке.
Конфигурационные файлы оказывают прямое влияние на структуру кэша:
.parcelrc приводят к полной или частичной
инвалидизации;Parcel учитывает конфигурацию как часть хеша окружения сборки.
При удалении .parcel-cache сборка запускается в холодном
режиме. Это приводит к:
Глобальный кэш при этом может оставаться нетронутым, что ускоряет последующие сборки.
Инкрементальная модель Parcel опирается на кэш как на основной источник ускорения. Каждый модуль рассматривается как независимая единица, связанная с набором входных параметров.
Изменение входных данных приводит к локальной пересборке только затронутых узлов графа, что делает систему устойчивой к масштабированию проектов.