Директория .parcel-cache

В процессе сборки Parcel активно использует локальное кэширование промежуточных результатов трансформации модулей. Для этого в корне проекта создаётся скрытая директория .parcel-cache, которая служит постоянным хранилищем вычисленных артефактов между запусками сборки.

Основная задача этой директории заключается в сокращении времени последующих сборок за счёт переиспользования уже обработанных ресурсов. Parcel стремится избегать повторного выполнения дорогих операций — парсинга, трансформации, транспиляции и оптимизации — если входные данные не изменились.


Структура и содержимое .parcel-cache

Внутреннее устройство директории не является частью публичного API и может изменяться между версиями Parcel, однако логически её содержимое можно разделить на несколько категорий.

Кэш трансформированных модулей

Parcel хранит результаты обработки каждого модуля исходного кода. Это включает:

  • преобразованный AST (абстрактное синтаксическое дерево)
  • результат транспиляции (например, TypeScript → JavaScript)
  • результаты работы плагинов трансформации
  • промежуточные представления модулей для дальнейших стадий сборки

Каждый модуль идентифицируется через хеш зависимости, который учитывает:

  • содержимое файла
  • зависимости, импортируемые модулем
  • конфигурацию окружения (environment)
  • плагины и их параметры

Любое изменение этих факторов приводит к инвалидации соответствующего кэша.


Граф зависимостей

Parcel строит и сохраняет граф зависимостей проекта. В .parcel-cache хранится:

  • структура связей между модулями
  • информация о динамических и статических импортов
  • порядок вычисления модулей
  • связи между чанками (chunks)

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


Артефакты резолвинга

Отдельный слой кэша отвечает за разрешение модулей:

  • результаты работы алгоритма module resolution
  • пути до файлов после alias-обработки
  • результаты поиска в node_modules
  • кэширование условных экспортов (conditional exports в package.json)

Это снижает накладные расходы на повторное вычисление путей при каждой сборке.


Кэш плагинов и трансформеров

Parcel поддерживает расширяемую систему плагинов. Для них также формируется изолированный кэш:

  • результаты transform-плагинов
  • результаты оптимизаторов
  • метаданные сторонних компиляторов (Babel, PostCSS, TypeScript)

Каждый плагин получает собственный namespace внутри кэша, что предотвращает конфликты между различными этапами сборки.


Механизм инвалидации кэша

Ключевая особенность .parcel-cache заключается в строгой системе инвалидации. Кэш считается валидным только при совпадении всех входных параметров.

Факторы инвалидации:

  • изменение исходного файла
  • изменение зависимостей
  • изменение конфигурации Parcel (parcel config, .babelrc, tsconfig и др.)
  • изменение версии зависимых плагинов
  • изменение переменных окружения, влияющих на сборку

Parcel использует content hashing, где итоговый ключ кэша формируется из совокупности всех влияющих факторов. Даже минимальное изменение входных данных приводит к генерации нового ключа.


Инкрементальная сборка и ускорение процесса

Использование .parcel-cache позволяет реализовать инкрементальную модель сборки. При повторном запуске:

  1. Parcel загружает существующий кэш
  2. Сравнивает входные хеши модулей
  3. Пересчитывает только изменённые узлы графа
  4. Переиспользует результаты для неизменённых частей

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


Физическое расположение и формат хранения

По умолчанию директория располагается в корне проекта:

project/
  src/
  dist/
  .parcel-cache/

Формат хранения бинарный и оптимизирован под быстрый доступ. Внутри используются:

  • сериализованные структуры графа
  • бинарные представления AST
  • служебные индексы для поиска модулей
  • служебные JSON-метаданные (внутреннего формата Parcel)

Прямое редактирование файлов кэша не предусмотрено и может привести к неконсистентности сборки.


Поведение при удалении .parcel-cache

Удаление директории приводит к полной потере кэшированных данных. При следующем запуске сборки Parcel:

  • заново анализирует все исходные файлы
  • перестраивает граф зависимостей
  • повторно выполняет все трансформации
  • формирует новый кэш с нуля

Это эквивалентно «холодному старту» сборки.

В большинстве случаев удаление используется для устранения:

  • повреждённого кэша
  • некорректных артефактов после обновления Parcel
  • проблем несовместимости плагинов

Поведение в системах контроля версий

Директория .parcel-cache обычно исключается из системы контроля версий. Причины:

  • кэш зависит от локальной среды
  • содержит производные данные, а не исходный код
  • может быть восстановлен автоматически

Стандартная запись для .gitignore:

.parcel-cache

Использование в CI/CD

В системах непрерывной интеграции кэш может существенно ускорять сборку. Однако важно учитывать корректную стратегию его сохранения.

Типовой подход:

  • сохранять .parcel-cache между сборками
  • инвалидировать кэш при изменении зависимостей
  • очищать кэш при смене версии Parcel или Node.js

Некорректное использование кэша в CI может приводить к:

  • устаревшим артефактам
  • несогласованным сборкам между окружениями
  • трудно воспроизводимым ошибкам

Влияние конфигурации Parcel на кэш

Конфигурационные файлы напрямую влияют на ключи кэширования:

  • .parcelrc
  • package.json (поля Parcel)
  • конфигурации трансформеров
  • настройки targets (browser/node)
  • режимы production/development

Изменение любого параметра приводит к частичной или полной инвалидации кэша, даже если исходный код остаётся неизменным.


Оптимизации и особенности поведения

Parcel использует несколько уровней оптимизации кэша:

  • ленивое вычисление (lazy evaluation) модулей
  • разделение кэша по окружениям (environments)
  • дедупликация одинаковых трансформаций
  • параллельная запись кэша в многопоточном режиме
  • приоритизация горячих модулей (hot modules)

Это позволяет минимизировать диск I/O и ускорять повторные сборки даже в сложных монорепозиториях.


Проблемные сценарии и диагностика

Некоторые типичные ситуации связаны с некорректным поведением кэша:

Несоответствие результата сборки

  • часто связано с устаревшим кэшем после обновления зависимостей

Аномально медленная пересборка

  • возможна деградация кэша или его частичная инвалидизация

Различия между локальной и CI сборкой

  • часто вызваны различиями в переменных окружения или версии Node.js

Для диагностики применяются режимы:

  • запуск без кэша
  • принудительная пересборка зависимостей
  • очистка .parcel-cache перед сборкой

Роль кэша в архитектуре Parcel

Директория .parcel-cache является центральным элементом архитектуры сборщика. Она обеспечивает:

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

Parcel фактически рассматривает файловую систему кэша как продолжение внутреннего состояния компилятора между запусками процесса сборки.