Vite — Примеры
Пример 1 — Секрет в переменной окружения с префиксом
Модуль оформления заказа читает платёжный секрет из переменной окружения, а сама переменная работает локально и попадает в собранный JavaScript. Объясните, какое правило нарушено, затем поместите значение туда, где ему место.
# .env
VITE_PAYMENTS_SECRET=<боевой секрет>
// src/checkout.js
const secret = import.meta.env.VITE_PAYMENTS_SECRET;
Решение
# .env — только публичные значения
VITE_API_BASE=/api
// src/checkout.js
const apiBase = import.meta.env.VITE_API_BASE;
// server/checkout.js — секрет остаётся на сервере
const secret = process.env.PAYMENTS_SECRET;
Клиентскому коду открыты только переменные с префиксом инструмента, и это не механизм безопасности: всё открытое подставляется в бандл как литерал, поэтому любой, кто скачает JavaScript, прочитает его. Префикс — метка намерения, которая говорит «это значение публично», и потому секрет, названный с этим префиксом, публикуется. Конфигурация, которая должна оставаться приватной, живёт в серверной конфигурации времени выполнения, куда попадают через эндпоинт, а клиент получает только то, что ему можно знать, — здесь это базовый путь API.
Пример 2 — Сборка, снимающая типы без их проверки
Продакшен-сборка проходит успешно, а ошибка типов доходит до пользователя: скрипт сборки запускает один бандлер. Скажите, что инструмент на самом деле делает с TypeScript, затем закройте разрыв, не добавляя вторую систему сборки.
{
"scripts": { "build": "vite build" }
}
// src/pricing.ts
const rate: number = "wholesale".length ? 1.07 : "0.9";
// ^ попадает в продакшен, потому что типы снимаются, а не проверяются
Решение
{
"scripts": {
"typecheck": "tsc --noEmit",
"build": "tsc --noEmit && vite build",
"check": "npm run typecheck && npm run test && npm run build"
}
}
Бандлер снимает аннотации типов, чтобы быстро получить JavaScript, однако никогда их не проверяет: неверная аннотация ничего не стоит во время сборки и всё — во время выполнения. Если запустить компилятор без вывода в том же скрипте, проверка возвращается, причём до медленного шага сборки, — именно этот порядок скрипт check задаёт один раз для людей, хуков и конвейера. Та же форма подходит и серверу разработки: это быстрый цикл обратной связи, а не ворота. Всё, что должно быть истинно перед релизом, обязана обеспечивать команда, которую кто-то действительно запускает.