В Vite кеш зависимостей является центральным механизмом ускорения
разработки. Он основан на идее предварительной обработки (pre-bundling)
npm-зависимостей с последующим сохранением результата в директории
node_modules/.vite. Этот слой кеширования позволяет
избежать повторной трансформации крупных сторонних библиотек при каждом
запуске dev-сервера.
Основная проблема, которую решает этот механизм, заключается в том, что большинство npm-пакетов поставляются в формате CommonJS или в виде множества мелких модулей. При использовании их напрямую в браузере возникает значительная нагрузка на резолвинг и преобразование. Vite устраняет это, выполняя однократную оптимизацию и сохраняя результат в виде готовых ESM-модулей.
Директория node_modules/.vite формируется автоматически
при первом запуске dev-сервера или при изменении набора зависимостей.
Внутри неё находится несколько ключевых элементов:
Каталог deps/ содержит уже преобразованные модули в
формате ESM. Каждый пакет из node_modules может быть разбит
на один или несколько файлов в зависимости от внутренней структуры
библиотеки и результата бандлинга esbuild.
Пример структуры:
node_modules/.vite/deps/
react.js
react-dom.js
lodash.js
lodash_chunk.js
Имена файлов формируются на основе хеширования содержимого и исходного имени пакета. Это позволяет избежать конфликтов и обеспечивает корректную инвалидизацию кеша при изменении зависимостей.
Кеш зависимостей создаётся на этапе pre-bundling. Этот процесс запускается Vite перед стартом dev-сервера.
Последовательность выглядит следующим образом:
Анализируется граф импортов исходного проекта
Выделяются внешние зависимости из
node_modules
Для каждой зависимости выполняется:
Результат сохраняется в
node_modules/.vite/deps
В качестве инструмента трансформации используется esbuild, что обеспечивает высокую скорость обработки даже крупных пакетов.
Файл metadata.json играет ключевую роль в контроле
актуальности кеша. Он содержит информацию о:
Пример логической структуры:
{
"hash": "a1b2c3",
"optimized": {
"react": {
"file": "react.js",
"src": "react/index.js"
}
}
}
При следующем запуске Vite сравнивает текущие зависимости и их хеши с сохранёнными значениями. Если обнаружено несоответствие, выполняется полная или частичная пересборка кеша.
Инвалидация кеша происходит в нескольких сценариях:
Добавление или удаление пакета в package.json приводит к
пересборке node_modules/.vite. Это самый очевидный случай
обновления кеша.
Если пакет обновляется через npm/yarn/pnpm, хеш зависимостей меняется, что автоматически вызывает перегенерацию кеша.
Параметры в vite.config.js, влияющие на оптимизацию
зависимостей, также приводят к инвалидированию кеша:
optimizeDeps.includeoptimizeDeps.excludeoptimizeDeps.esbuildOptionsЛюбое изменение этих настроек делает существующий кеш недействительным.
Удаление директории node_modules/.vite принудительно
сбрасывает все оптимизации. При следующем запуске они будут построены
заново.
Система кеширования основана на детерминированных хешах. Каждый пакет анализируется по следующим параметрам:
Хеш используется для:
deps/Такой подход позволяет гарантировать, что при одинаковом входе результат всегда будет одинаковым.
Dev-сервер Vite использует кеш в node_modules/.vite как
основной источник для внешних зависимостей. Это позволяет:
При запросе модуля браузером Vite проверяет:
deps/metadata.jsonОдной из ключевых задач кеша является преобразование CommonJS в ESM. Без этого браузер не может корректно интерпретировать большинство npm-библиотек.
В процессе кеширования выполняются:
require() в importmodule.exports на
export defaultРезультат сохраняется в deps/, где каждый модуль уже
полностью совместим с ES-модульной системой.
При повторном запуске dev-сервера Vite стремится максимально использовать существующий кеш. Это достигается за счёт:
package-lock.json, pnpm-lock.yaml
или yarn.lockЕсли все проверки проходят успешно, этап pre-bundling полностью пропускается, а сервер стартует практически мгновенно.
Кеш в node_modules/.vite оказывает прямое влияние на
производительность разработки:
Особенно заметен эффект в проектах с большим количеством тяжёлых библиотек, таких как UI-фреймворки, графические библиотеки и дата-обработчики.
Несмотря на автоматизацию, механизм кеша может приводить к ряду типичных ситуаций:
Иногда изменения в пакете не сразу отражаются в кешe из-за некорректной инвалидации. Это проявляется в виде несоответствия поведения библиотеки.
Разные настройки optimizeDeps могут приводить к
частичной пересборке, создавая неоднородное состояние кеша.
Прерывание процесса сборки может оставить
node_modules/.vite в неконсистентном состоянии, что требует
полной регенерации.
Слой node_modules/.vite является связующим звеном между
исходной средой разработки и браузерной ESM-моделью. Он выполняет
функцию промежуточного представления зависимостей, адаптированного под
требования современных браузеров.
Фактически этот кеш можно рассматривать как:
Его наличие позволяет Vite сохранять баланс между гибкостью dev-сервера и высокой скоростью работы с крупными зависимостями.