Файловый кэш Parcel: где хранится

Файловый кэш в Parcel (bundler) организован как двухуровневая система: локальный (проектный) и глобальный (пользовательский). Такая архитектура снижает время повторных сборок, минимизирует повторную трансформацию модулей и позволяет эффективно переиспользовать результаты компиляции между запусками сборщика.

Основной слой кэширования располагается внутри проекта в директории:

.parcel-cache/

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

Структура и содержимое

Внутреннее устройство .parcel-cache не предназначено для ручного редактирования, но логически включает несколько типов данных:

  • AST и трансформации — результаты парсинга JavaScript, TypeScript, CSS и других форматов.
  • Сериализованные графы зависимостей — информация о связях между модулями.
  • Кэш плагинов — результаты работы трансформеров и резолверов.
  • Контент-адресуемые записи — данные, идентифицируемые хешами содержимого файлов.
  • Манифесты сборки — вспомогательная информация для восстановления состояния сборки.

Parcel использует инкрементальную модель: при повторной сборке он сравнивает хеши входных файлов и, если изменения отсутствуют, извлекает готовые результаты из .parcel-cache без повторного выполнения трансформаций.

Принцип работы локального кэша

Механизм основан на сочетании следующих факторов:

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

Любое изменение хотя бы одного из этих параметров приводит к инвалидированию соответствующих записей кэша. Это обеспечивает корректность сборки при сохранении высокой скорости повторного запуска.

Глобальный кэш Parcel

Помимо локального кэша, используется глобальное хранилище, расположенное в пользовательской системе.

Стандартные пути

  • Linux:

    ~/.cache/parcel
  • macOS:

    ~/Library/Caches/parcel
  • Windows:

    %LOCALAPPDATA%\parcel-cache

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

Назначение глобального кэша

Глобальный кэш используется для:

  • хранения результатов трансформаций, зависящих только от версии Parcel и плагинов;
  • переиспользования данных между проектами;
  • ускорения установки и первого запуска сборки;
  • хранения бинарных или оптимизированных представлений ресурсов.

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

Контент-адресуемое хранение

Parcel активно использует подход content-addressable storage. Это означает, что ключом для хранения данных является не имя файла, а его содержимое, преобразованное в хеш.

Особенности модели

  • идентичные входные данные всегда приводят к одинаковым ключам;
  • повторное использование возможно даже при переносе файлов между проектами;
  • исключается дублирование одинаковых трансформаций;
  • уменьшается объём дискового пространства.

Такой подход особенно эффективен при работе с большими монорепозиториями, где одинаковые зависимости встречаются многократно.

Инвалидация кэша

Механизм очистки и обновления кэша встроен в систему сборки.

Причины инвалидирования

Кэш пересчитывается при:

  • изменении исходного файла;
  • обновлении конфигурации (.parcelrc, package.json);
  • изменении зависимостей;
  • обновлении версий плагинов;
  • смене окружения Node.js.

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

Частичная и полная очистка

Инвалидация может происходить на разных уровнях:

  • точечная — пересборка одного модуля;
  • графовая — пересборка цепочки зависимостей;
  • полная — при радикальных изменениях конфигурации или окружения.

Производительность кэша

Файловый кэш напрямую влияет на скорость сборки:

  • холодный старт требует полного анализа графа;
  • тёплый старт использует .parcel-cache;
  • повторная сборка часто ограничивается чтением готовых артефактов.

На больших проектах разница может составлять порядок величины — от десятков секунд до долей секунды при инкрементальной пересборке.

Хранение метаданных зависимостей

Parcel сохраняет не только результаты трансформаций, но и структуру зависимостей:

  • дерево импортов модулей;
  • динамические импорты;
  • CSS-связи (@import, URL-ресурсы);
  • ассеты (изображения, шрифты).

Эти данные позволяют восстанавливать граф без повторного анализа исходного кода.

Сериализация и формат хранения

Внутренние данные кэша сериализуются в бинарном формате, оптимизированном под быстрый доступ. В зависимости от версии Parcel могут использоваться:

  • структурированные бинарные блоки;
  • индексированные таблицы;
  • memory-mapped файлы;
  • компрессированные сегменты.

Такой формат снижает накладные расходы на чтение и запись при инкрементальной сборке.

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

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

  • изменения в .parcelrc приводят к полной или частичной инвалидизации;
  • переключение режимов (development/production) создаёт отдельные кэш-сегменты;
  • изменение плагинов влияет на ключи трансформаций.

Parcel учитывает конфигурацию как часть хеша окружения сборки.

Очистка и пересоздание кэша

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

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

Глобальный кэш при этом может оставаться нетронутым, что ускоряет последующие сборки.

Связь кэша с инкрементальной сборкой

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

Изменение входных данных приводит к локальной пересборке только затронутых узлов графа, что делает систему устойчивой к масштабированию проектов.