Концепция environments в Vite 6

В Vite 6 появляется формализованная модель окружений (environments), которая делает внутреннюю архитектуру сборщика более явной и управляемой. Если ранее различие между клиентской сборкой, SSR-сборкой и различными таргетами выражалось через отдельные конфигурации и условные ветвления, то новая модель вводит единый слой абстракции, описывающий каждую среду выполнения как самостоятельный объект со своим графом модулей, плагинным контекстом и стратегией бандлинга.

Environments в Vite 6 — это способ декомпозиции процесса сборки на изолированные, но координируемые контексты. Каждый environment определяет, где выполняется код, как он трансформируется и каким образом резолвятся зависимости.


Базовая модель environment

Каждое окружение в Vite 6 представляет собой именованный контекст, который описывает:

  • среду выполнения (browser, node, worker и пользовательские варианты)
  • стратегию обработки модулей
  • правила резолва зависимостей
  • плагинный pipeline
  • output-конфигурацию

Внутри Vite environment можно рассматривать как расширение идеи build и ssr, но без жесткой привязки к одному сценарию.

Ключевая идея заключается в том, что теперь сборка не делится на «клиентскую» и «серверную» в конфигурационном смысле. Вместо этого создаются независимые окружения, которые могут сосуществовать в рамках одного проекта.


Основные типы environments

Browser environment

Browser environment является стандартным окружением Vite. Оно описывает классическую клиентскую сборку:

  • ESM-ориентированный output
  • оптимизация под браузерные рантаймы
  • поддержка code-splitting
  • обработка ассетов через pipeline Vite

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


SSR environment

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

Характерные особенности:

  • Node-compatible output
  • отсутствие браузерных полифиллов
  • отдельный dependency graph
  • возможность изоляции серверных трансформаций

SSR environment позволяет избежать смешивания клиентских и серверных трансформаций на уровне плагинов.


Worker environment

Worker environment описывает выполнение кода в Web Workers или аналогичных изолированных потоках.

Особенности:

  • ограниченный API контекст
  • отдельная стратегия резолва импортов
  • возможность оптимизации под messaging-based архитектуру
  • специфическая обработка модулей без DOM-зависимостей

Архитектура environment graph

В Vite 6 environments образуют граф окружений. Это не просто список, а связанная структура, где:

  • одно окружение может зависеть от другого
  • зависимости могут быть частичными (shared modules)
  • возможна изоляция или шаринг чанков

Например, SSR environment может импортировать модули из browser environment в режиме виртуализации, но с трансформацией под серверный контекст.

Граф окружений позволяет Vite оптимизировать:

  • дедупликацию зависимостей
  • разделение vendor-кода
  • стратегию pre-bundling

Разделение модульных графов

Одно из ключевых изменений — каждый environment имеет собственный module graph.

Это означает:

  • модуль, загруженный в SSR, не обязательно идентичен модулю в browser
  • плагины могут вести разные трансформации для одного и того же файла
  • кеширование становится environment-scoped

Такой подход устраняет проблему «протекания контекста», когда серверные и клиентские трансформации влияли друг на друга.


Плагинная модель и environments

Плагины в Vite 6 получают доступ к информации об environment, в котором выполняется трансформация.

Это влияет на:

  • resolveId
  • load
  • transform
  • renderChunk

Плагин может адаптировать поведение в зависимости от окружения:

  • в browser environment добавлять polyfill-обработку
  • в SSR environment исключать DOM-зависимости
  • в worker environment минимизировать API surface

Таким образом, plugin API становится environment-aware.


Конфигурация environments

Vite 6 вводит возможность явно описывать окружения в конфигурации:

  • создание кастомных environments
  • наследование от стандартных
  • переопределение стратегий сборки

Каждое окружение может иметь собственные параметры:

  • build
  • rollupOptions
  • resolve
  • optimizeDeps

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

  • клиентское SPA
  • SSR backend
  • edge functions
  • worker-процессы

Кастомные environments

Кастомные environments позволяют выходить за пределы стандартных browser/SSR/worker моделей.

Типичные сценарии:

  • edge runtime (Cloudflare Workers, Vercel Edge)
  • embedded runtime (Electron main process)
  • hybrid rendering pipelines
  • multi-target build systems

Каждое кастомное окружение может определять собственный:

  • module resolution strategy
  • output format
  • externalization rules
  • plugin behavior

Изоляция зависимостей

Environments вводят строгую изоляцию зависимостей:

  • зависимости резолвятся внутри конкретного окружения
  • отсутствует автоматическое разделение dependency graph между окружениями
  • shared dependencies явно конфигурируются

Это снижает риск конфликтов версий и поведения пакетов между SSR и browser сборками.


Shared modules и cross-environment imports

Несмотря на изоляцию, Vite 6 поддерживает сценарии совместного использования модулей.

Подход основан на:

  • explicit sharing
  • transformation per environment
  • адаптации output

Модуль может быть:

  • полностью отдельным в каждом environment
  • частично переиспользованным
  • транспилированным под конкретный runtime

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


Runtime resolution и environment context

Во время выполнения Vite использует environment context для:

  • выбора стратегии загрузки модулей
  • определения формата импорта
  • управления динамическими import()

Например:

  • в browser environment dynamic import ведет к code-splitting
  • в SSR environment dynamic import может быть синхронизирован или эмулирован
  • в worker environment import может быть заменен на message-based загрузку

Влияние на сборку и оптимизацию

Модель environments влияет на весь pipeline Vite:

Dependency pre-bundling

Каждое окружение может иметь собственный pre-bundle cache.

Tree-shaking

Tree-shaking становится environment-specific, так как разные runtime могут требовать разные части API.

Chunking strategy

Разбиение на чанки зависит от того, пересекаются ли окружения по модулям.


Совместимость с существующими проектами

Старая модель Vite (без явного environments API) продолжает работать через дефолтные окружения:

  • browser environment заменяет классический client build
  • SSR environment соответствует ssr режиму
  • worker environment покрывает worker plugins

Таким образом, миграция является постепенной, а не разрушающей.


Роль environments в будущем архитектуры Vite

Environments становятся базовой единицей масштабирования Vite. Вместо двухрежимной модели «client/server» формируется универсальная система исполнения, где каждый target определяется декларативно.

Это открывает возможности:

  • единый build pipeline для разных платформ
  • унификация SSR, edge и worker логики
  • более точный контроль над зависимостями
  • предсказуемая изоляция runtime-контекстов