В экосистеме Vite файлы окружения используются для конфигурации переменных, которые должны отличаться между режимами запуска, окружениями и стадиями сборки. Эти файлы основаны на стандарте dotenv, но Vite накладывает собственную систему приоритетов, правил именования и механизма загрузки.
Переменные окружения в Vite доступны через
import.meta.env, а их поведение строго определяется режимом
выполнения (mode) и набором файлов .env,
находящихся в корне проекта.
Vite поддерживает несколько стандартных файлов окружения, каждый из которых имеет определённый приоритет и область применения:
.env — базовый файл, применяемый во всех режимах.env.local — локальные переопределения (обычно
игнорируется системой контроля версий).env.[mode] — файл, зависящий от режима (например,
development, production,
staging).env.[mode].local — локальные переопределения для
конкретного режимаПримеры:
.env.env.local.env.development.env.development.local.env.production.env.production.localVite использует параметр mode для определения набора
переменных окружения. По умолчанию:
vite dev → mode = developmentvite build → mode = productionДополнительные режимы задаются явно:
vite --mode staging
В этом случае будут загружены:
.env.env.staging.env.local.env.staging.localПорядок имеет критическое значение, так как одинаковые переменные переопределяются последующими файлами.
Последовательность загрузки в Vite:
.env.env.local.env.[mode].env.[mode].localКаждый последующий файл имеет более высокий приоритет и перезаписывает значения предыдущего.
Если переменная объявлена в нескольких местах, действует правило переопределения:
.env задаёт базовое значение.env.local переопределяет .env.env.[mode] переопределяет оба предыдущих.env.[mode].local имеет максимальный приоритетПример:
.env
VITE_API_URL=https://api.example.com
.env.development
VITE_API_URL=http://localhost:3000
.env.development.local
VITE_API_URL=http://localhost:4000
В режиме development итоговым значением будет:
http://localhost:4000
Vite не предоставляет все переменные окружения в клиентский код автоматически. Доступны только те, которые имеют префикс:
VITE_
Пример:
VITE_API_URL=https://api.example.com
VITE_APP_NAME=MyApp
Использование в коде:
console.log(import.meta.env.VITE_API_URL)
Все переменные без префикса игнорируются в клиентской сборке и не попадают в bundle.
При запуске Vite выполняет несколько этапов обработки окружения:
mode.env* через dotenv-подобный парсерimport.meta.envВажно, что переменные не подгружаются динамически в runtime в production-сборке — они инлайнятся в код.
Vite предоставляет API loadEnv, позволяющий вручную
получить переменные окружения:
import { loadEnv } from 'vite'
export default ({ mode }) => {
const env = loadEnv(mode, process.cwd(), '')
return {
define: {
__APP_ENV__: env.APP_ENV
}
}
}
Параметры loadEnv:
mode — текущий режимenvDir — директория с env-файламиprefix — фильтр переменных (по умолчанию
VITE_)Если prefix передан как пустая строка, загружаются все переменные.
В dev-режиме переменные доступны через прокси-объект
import.meta.env, который сохраняет реактивность окружения
сервера разработки.
В build-режиме происходит полная статическая замена:
import.meta.env.VITE_API_URL
превращается в:
"https://api.example.com"
Это означает, что изменение .env после сборки не влияет на уже собранный код.
Vite не накладывает строгую типизацию на
import.meta.env, но TypeScript поддержка может быть
расширена через декларации:
interface ImportMetaEnv {
readonly VITE_API_URL: string
readonly VITE_APP_NAME: string
}
interface ImportMeta {
readonly env: ImportMetaEnv
}
Это позволяет избежать обращения к несуществующим переменным на уровне компиляции.
Все значения в .env интерпретируются как строки. Даже
если указано число или boolean:
VITE_DEBUG=true
VITE_PORT=3000
В коде они будут:
import.meta.env.VITE_DEBUG // "true"
import.meta.env.VITE_PORT // "3000"
Приведение типов выполняется вручную.
Vite поддерживает подстановку значений внутри .env файлов:
VITE_HOST=localhost
VITE_URL=http://${VITE_HOST}:3000
После обработки:
http://localhost:3000
При этом расширение работает только для переменных, уже определённых в текущем контексте загрузки.
Некоторые файлы могут исключаться из процесса через
.gitignore или .env.*.local, что используется
для хранения секретов:
Типичный пример:
VITE_API_KEY=secret_value
в .env.production.local, который не попадает в
репозиторий.
При использовании SSR в Vite окружение делится на клиентское и серверное:
VITE_ переменныеprocess.envЭто разделение предотвращает утечку секретных данных в браузер.
Типичные ошибки связаны с неправильным пониманием приоритетов:
.env.local переопределит
.env.productionVITE_Корректная модель поведения всегда опирается на порядок загрузки и режим выполнения.
Система окружения Vite строится вокруг трёх принципов:
mode)VITE_Эти механизмы обеспечивают предсказуемость конфигурации между разработкой, тестированием и production-сборкой, исключая динамическую изменчивость окружения в собранном коде.