В режиме разработки Vite выполняет предварительное преобразование зависимостей через esbuild, объединяя множество мелких ESM-модулей в более крупные чанки. Этот процесс ускоряет последующую загрузку приложения и снижает количество HTTP-запросов. Поведение управляется системой dependency pre-bundling, которая активируется автоматически при старте dev-сервера.
В ряде случаев требуется исключить отдельные пакеты из этого
процесса. Для этого используется параметр
optimizeDeps.exclude.
optimizeDeps.excludeПараметр optimizeDeps.exclude позволяет явно указать
зависимости, которые не должны попадать в предварительную
оптимизацию.
Основная идея заключается в том, что Vite не будет:
// vite.config.js
export default {
optimizeDeps: {
exclude: ['some-package']
}
}
Исключённая зависимость обрабатывается иначе:
node_modules/.viteТакой режим отключает ключевую оптимизацию Vite, поэтому используется только при необходимости.
optimizeDeps.excludeНекоторые библиотеки содержат конструкции, которые esbuild не может корректно обработать в рамках pre-bundling:
requiremodule/exportsВ таких случаях исключение из оптимизации предотвращает ошибки трансформации.
Отдельные пакеты предоставляют несколько форматов сборки, но
определяются в package.json некорректно. Это может
приводить к:
Named export not foundИсключение позволяет отдать контроль загрузки самому dev-серверу.
Если пакет содержит побочные эффекты при импорте, pre-bundling может изменить порядок выполнения кода. В таких случаях исключение сохраняет оригинальную структуру модулей.
Исключение часто используется как инструмент отладки:
Использование exclude напрямую влияет на поведение
dev-сервера.
В большинстве случаев исключение ухудшает производительность разработки, поэтому применяется точечно.
optimizeDeps.includeexclude работает совместно с include, и
между ними существует приоритетная логика:
include явно добавляет зависимость в pre-bundlingexclude запрещает оптимизацию, даже если пакет
импортируется косвенноexport default {
optimizeDeps: {
include: ['some-package'],
exclude: ['some-package']
}
}
В конфликтной ситуации exclude имеет более высокий
приоритет.
Vite сохраняет результат оптимизации в директории:
node_modules/.vite
При добавлении зависимости в exclude происходит:
.vite директорииИзменение конфигурации exclude часто требует перезапуска
сервера разработки, поскольку dependency graph строится на старте.
Некоторые CommonJS-библиотеки могут некорректно оптимизироваться esbuild. При исключении:
requireЭто может быть полезно для библиотек, активно использующих
module.exports и динамическую загрузку.
В монорепозиториях (pnpm, yarn workspaces)
часто встречаются локальные пакеты, которые:
dist-сборщикаИсключение таких зависимостей из оптимизации позволяет избежать:
Чрезмерное исключение зависимостей приводит к росту числа модулей, обрабатываемых браузером напрямую, что замедляет старт dev-сервера.
Без pre-bundling один и тот же пакет может загружаться в виде множества мелких модулей.
Hot Module Replacement становится менее предсказуемым из-за отсутствия единого оптимизированного графа зависимостей.
Для анализа влияния exclude используется встроенная
диагностика Vite:
.vite/depsПоведение можно косвенно оценивать по:
Полное отключение:
optimizeDeps: {
disabled: true
}
и частичное исключение через exclude отличаются
принципиально:
disabled: true отключает весь механизм
pre-bundlingexclude сохраняет оптимизацию для остальных
зависимостейexclude используется как точечная корректировка, тогда
как disabled — радикальная мера.
В практике чаще всего требуют исключения:
module поляПоведение всегда зависит от конкретной структуры пакета и способа его публикации.
exclude в
архитектуре ViteoptimizeDeps.exclude является инструментом управления
границей между:
Он позволяет переключать отдельные зависимости из режима «bundled pre-cache» в режим «live ESM resolution», сохраняя гибкость системы загрузки без полного отключения оптимизации.