Переменные окружения и режимы сборки
↑ 6.2 Сборка и инфраструктура: Vite, monorepo, CI∕CD · ← Предыдущая · → Следующая
Зачем это на собесе
Разница build-time и runtime конфигурации и то, что переменные клиента — публичны.
Объяснение
Vite читает .env-файлы по режиму:
.env # всегда
.env.local # всегда, не в git
.env.development # режим development (vite dev)
.env.production # режим production (vite build)
.env.staging # vite build --mode staging// доступны только переменные с префиксом VITE_ (защита от утечек серверных секретов)
const api = import.meta.env.VITE_API_URL;
import.meta.env.MODE; // "development" | "production" | свой режим
import.meta.env.DEV / PROD / BASE_URL / SSR;// Типизация: env.d.ts
interface ImportMetaEnv { readonly VITE_API_URL: string; readonly VITE_SENTRY_DSN?: string }Ключевой момент: import.meta.env.* подставляется на этапе сборки (build-time). Значит, один и тот же артефакт нельзя использовать для разных окружений без пересборки. Решение — runtime-конфигурация (см. Релиз SPA: runtime config, source maps, CDN-кэш и rollback): файл config.json/window.__CONFIG__, генерируемый контейнером при старте.
Режимы сборки: --mode staging меняет набор .env и MODE; условная логика (if (import.meta.env.DEV)) удаляется из prod-бандла (dead code elimination).
| Тема | Правило |
|---|---|
| Секреты | Никогда в клиентских переменных: любая VITE_* попадает в бандл и видна пользователю |
| Публичные значения | URL API, DSN Sentry, ключи публичных сервисов, флаги |
define | подстановка констант (__APP_VERSION__) |
| Различия окружений | URL, аналитика, флаги, уровни логов |
| CI | переменные передаются на этапе сборки; для runtime — при запуске контейнера |
| Валидация | проверять обязательные переменные при старте (Zod) |
| Node-переменные в конфиге Vite | loadEnv(mode, process.cwd(), "") |
Quasar: build.env в quasar.config, process.env.*.
Нюансы и подводные камни
- «Секретный» ключ в
VITE_*= публичный ключ. - Сборка для stage и prod отдельно нарушает принцип «один артефакт» — используйте runtime-конфигурацию.
- Опечатка в имени переменной даёт
undefinedбез ошибки: валидируйте при старте. - Изменение
.envтребует перезапуска dev-сервера. - Значения — строки: приводите типы (
"false"— truthy).
Практика
- Настройте
.env.development/.env.production/.env.stagingи типизацию. - Добавьте валидацию переменных при старте приложения.
- Убедитесь, что серверных секретов нет в
dist.
Вопросы с ответами
Почему
VITE_префикс?Чтобы в клиентский бандл попадали только явно публичные переменные, а не всё окружение.
Можно ли хранить секрет в переменной окружения фронтенда?
Нет: она встраивается в бандл и доступна любому пользователю.