Mundarija (37)
- Bu darsda
- 1. Nega bu kerak?
- 2. .env fayl va VITE_ prefiksi
- 2.1 Birinchi .env
- 2.2 Build ichida nima bor
- 2.3 Tayyor o'zgaruvchilar
- 3. Rejimlar va fayllar tartibi
- 3.1 Rejim nima
- 3.2 Tajriba: kim yutadi
- 3.3 .local fayllar — faqat sizniki
- 3.4 staging rejimi va PROD
- 4. Build vaqti, ishga tushish vaqti emas
- 4.1 Qiymat faylga "pishib" qoladi
- 4.2 .env o'zgarsa — dev server qayta ishga tushadi
- 4.3 Qiymat doim satr
- 5. Turlar: vite-env.d.ts
- 5.1 TypeScript import.meta.env ni bilmaydi
- 5.2 Nimani ushlaydi, nimani yo'q
- 6. Hujumchi nigohi
- 7. Vazifalar qadami: API manzili .env ga
- 7.1 Ikkita .env fayl
- 7.2 Kod va turlar
- 7.3 Unutilgan .env — jim xato
- 7.4 vite.config.ts — funksiya va loadEnv
- 7.5 Tekshirish va commit
- 8. Ko'p uchraydigan xatolar
- 8.1 VITE_ siz nom — undefined
- 8.2 process.env brauzer kodida
- 8.3 .env ni o'zgartirdim — sayt o'zgarmadi
- 8.4 Bo'sh joy va qo'shtirnoq
- 9. Mashqlar
- 1-mashq (oson): Qaysi qiymat?
- 2-mashq (o'rta): Sarlavha .env dan
- 3-mashq (qiyin): Majburiy o'zgaruvchilar
- 10. Real ishda
- Xulosa
- Manbalar
Vite III: env o'zgaruvchilar va rejimlar
Qisqacha: Vite
.envfayllardagi qiymatlarni rejimga (development,production, o'zingiz bergan nom) qarab o'qiydi. Brauzer kodiga faqatVITE_bilan boshlangan o'zgaruvchilar tushadi —import.meta.env.VITE_API_URL. Qiymat build vaqtida JavaScript fayl ichiga matn bo'lib yoziladi, shuning uchunVITE_o'zgaruvchida sir (parol, token) bo'lmasligi kerak: uni saytni ochgan har kim ko'radi.
Bu darsda
.env,.env.local,.env.[mode],.env.[mode].localfayllari qaysi tartibda o'qilishini bilasiz.import.meta.envdagiMODE,DEV,PROD,BASE_URLni ishlatasiz.VITE_prefiksi nima uchun borligini va brauzerda nega sir saqlab bo'lmasligini tushuntira olasiz.vite-env.d.tsbilan o'zgaruvchilarga tur berasiz va--mode stagingbilan alohida build qilasiz.vazifalardagi API manzilini koddan.envga ko'chirasiz va unutilgan qiymatni build'da ushlaysiz.
Oldin bilishingiz kerak: Vite II: vite.config, Kengaytirish va declaration merging, Declaration fayllari, .gitignore.
1. Nega bu kerak?
vazifalar ning asosiy.ts faylida bitta qator bor:
const api = apiKlient({
asosiyUrl: "https://ilmhamroh.uz/api/mashq",Manzil kodga "qotirib" yozilgan. Hozircha muammo yo'q — API bitta. Lekin 25-qismda o'z backend'ingizni yozasiz: u kompyuteringizda http://localhost:3000 da ishlaydi. Har safar sinash uchun asosiy.ts ni o'zgartirasizmi? Keyin commit'dan oldin qaytarishni unutasiz — va sayt foydalanuvchilari sizning kompyuteringizga so'rov yuboradi.
Jasur akaning talabi ham shunday: "«Bahor» saytining ikki nusxasi bo'lsin — haqiqiy va sinov. Sinov nusxasi boshqa API bilan ishlasin". Kod bitta, sozlama har xil.
Yechim — muhit o'zgaruvchilari (environment variables): dastur tashqaridan oladigan nomli qiymatlar. Ular kod ichida emas, alohida faylda yoki terminalda turadi. Kod esa faqat nomni biladi: "API manzilini ber". Oshxona o'xshatishi: retsept "tuz — ta'bga ko'ra" deydi. Toshkentdagi filial bir xil, Samarqanddagisi boshqacha tuzlaydi — retsept esa bitta.
2. .env fayl va VITE_ prefiksi
2.1 Birinchi .env
Sardorning bahor-menyu loyihasida ildizga .env fayl yaratamiz:
VITE_TITLE=umumiy .env
VITE_API_URL=https://example.com/api
DB_PAROL=qwerty123Format oddiy: har qatorda NOM=qiymat, qo'shtirnoq shart emas, # bilan boshlangan qator — izoh. Nomlar odatda katta harf va _ bilan.
Kodda o'qish — import.meta.env orqali. src/env.ts:
console.log("env:", JSON.stringify(import.meta.env));
console.log("maxfiy:", import.meta.env.DB_PAROL);
if (import.meta.env.DEV) {
console.log("faqat dev'da");
}import.meta — modulning o'zi haqidagi obyekt (ESM import darsidan import.meta.url ni bilasiz). env ni unga Vite qo'shadi — brauzer va Node'da u yo'q.
2.2 Build ichida nima bor
npx vite build dan keyin dist/assets/index-….js ichidan shu qatorni topdik (minifikatsiya qilingan, bir bo'lak):
JSON.stringify({BASE_URL:`/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1,VITE_API_URL:`https://api.example.com`,VITE_TITLE:`.env.local`})Uch narsaga qarang:
import.meta.envyo'qoldi. Uning o'rnida tayyor obyekt turibdi. Vite build vaqtidaimport.meta.envni qiymatlar bilan almashtirdi —definedagidek matnni almashtirish.DB_PAROLyo'q. Koddaimport.meta.env.DB_PAROLbor edi, build'da esaconsole.log("maxfiy:", void 0)— ya'niundefined. Vite brauzer kodiga faqatVITE_bilan boshlanadigan nomlarni beradi.faqat dev'daqatori yo'q.import.meta.env.DEVbuild'dafalsebo'ldi,if (false)bloki esa o'lik kod sifatida o'chirildi (Tree shaking).
(VITE_TITLE nega .env.local — pastda tushuntiramiz.)
VITE_ prefiksi — himoya devori. .env faylda ko'pincha serverga tegishli sirlar ham turadi: baza paroli, to'lov tizimi kaliti. Vite ularni tasodifan saytga chiqarib yubormasligi uchun "ochiq" qiymatlarni alohida belgilashni talab qiladi. Prefiksni envPrefix sozlamasi bilan o'zgartirish mumkin, lekin kerak emas.
2.3 Tayyor o'zgaruvchilar
Vite har doim beshta o'zgaruvchi qo'shadi:
| O'zgaruvchi | Ma'nosi | vite (dev) |
vite build |
|---|---|---|---|
MODE |
joriy rejim nomi | "development" |
"production" |
DEV |
dev server'dami | true |
false |
PROD |
production build'mi | false |
true |
BASE_URL |
base qiymati |
"/" |
"/" |
Beshinchisi — SSR (server tomonda chizish, 23-qismda Next.js bilan; hozir bilish shart emas) — biz uchun doim false.
Dev serverda Vite xuddi shu ishni boshqacha qiladi: faylni so'raganingizda boshiga bitta qator qo'shadi. curl http://localhost:5771/src/env.ts bilan ko'rdik (birinchi qator):
import.meta.env = {"BASE_URL": "/", "DEV": true, "MODE": "development", "PROD": false, "SSR": false, "VITE_API_URL": "https://example.com/api", "VITE_TITLE": "umumiy .env"};console.log("env:", JSON.stringify(import.meta.env));Qiymatlar boshqa — chunki rejim boshqa. Bu bizni keyingi bo'limga olib keladi.
Tekshirib ko'ring:
.envdaAPI_KEY=abcbor, koddaimport.meta.env.API_KEY. Build'dan keyin sayt nimani ko'radi?
Javob
undefined. API_KEY da VITE_ prefiksi yo'q, Vite uni brauzer kodiga bermaydi. Xato ham chiqmaydi — import.meta.env ning turida [key: string]: any bor, shuning uchun TypeScript ham jim. Kalitni saytda ishlatmoqchi bo'lsangiz — avval "bu sir emasmi?" deb o'ylang (bu haqda «Hujumchi nigohi» bo'limida).
3. Rejimlar va fayllar tartibi
3.1 Rejim nima
Oldingi darsda rejim (mode) ni ko'rdik: vite — development, vite build — production, --mode bilan — istalgan nom. Rejimning asosiy vazifasi — qaysi .env fayllar o'qilishini tanlash.
Vite to'rt xil faylni qidiradi:
| Fayl | Qachon o'qiladi | Git'ga |
|---|---|---|
.env |
har doim | ha |
.env.local |
har doim | yo'q |
.env.[mode] |
faqat shu rejimda | ha |
.env.[mode].local |
faqat shu rejimda | yo'q |
Bir nom bir nechta faylda bo'lsa — aniqrog'i yutadi. Tartib (kuchsizdan kuchliga): .env → .env.local → .env.[mode] → .env.[mode].local. Ulardan ham kuchlisi — terminaldagi o'zgaruvchi.
flowchart LR
A[".env"] --> B[".env.local"]
B --> C[".env.production"]
C --> D[".env.production.local"]
D --> E["terminal:<br/>VITE_X=... vite build"]O'ngga qarab har fayl chapdagini "ustidan yozadi". Pastdagi tajribada buni raqamlar bilan ko'ramiz.
3.2 Tajriba: kim yutadi
bahor-menyu da to'rt fayl:
| Fayl | Ichida |
|---|---|
.env |
VITE_TITLE=umumiy .env, VITE_API_URL=https://example.com/api |
.env.local |
VITE_TITLE=.env.local |
.env.production |
VITE_API_URL=https://api.example.com |
.env.staging |
VITE_API_URL=https://staging.example.com, VITE_TITLE=staging |
Uch xil build va natija (build ichidagi qiymatlar):
| Buyruq | VITE_API_URL |
VITE_TITLE |
|---|---|---|
vite build |
https://api.example.com |
.env.local |
vite build --mode staging |
https://staging.example.com |
staging |
VITE_API_URL=https://shell.example.com vite build |
https://shell.example.com |
.env.local |
- Birinchi qator:
VITE_API_URL—.env.productiondan (u.envdan kuchli).VITE_TITLE—.env.localdan:.env.productionda bu nom yo'q,.env.localesa.envdan kuchli. - Ikkinchi qator: rejim
staging— endi.env.productionumuman o'qilmadi,.env.stagingishladi..env.stagingdagiVITE_TITLE.env.localni ham yengdi. - Uchinchi qator: terminaldagi qiymat hamma fayldan kuchli. CI'da (GitHub Actions) qiymatni shunday berish qulay.
dev uchun ham xuddi shunday — faqat rejim development va .env.development o'qiladi.
3.3 .local fayllar — faqat sizniki
.local bilan tugaydigan fayllar — shaxsiy sozlamalar: sizning kompyuteringizdagi backend manzili, sinov kaliti. Ular git'ga tushmaydi — .gitignore ga bitta qator yetadi:
*.localJamoadagi har kim o'z .env.development.local faylini yozadi, umumiy .env.development esa repo'da qoladi.
3.4 staging rejimi va PROD
Staging ("sahna", sinov nusxasi) — haqiqiy saytning nusxasi, lekin sinov API'si bilan. Unga vite build --mode staging va .env.staging yetadi. package.json da qulay skript:
{
"scripts": {
"build": "vite build",
"build:staging": "vite build --mode staging"
}
}Tuzoq: staging build'da import.meta.env.MODE — "staging", lekin PROD — baribir true (yuqoridagi tajribada MODE:"staging",PROD:!0). PROD "bu production rejimimi?" degani emas, "bu minifikatsiya qilingan build'mi?" degani. Rejimga qarab ish qilish kerak bo'lsa — MODE ni solishtiring.
Tekshirib ko'ring:
.envdaVITE_A=1,.env.development.localdaVITE_A=2,.env.productiondaVITE_A=3.npm run devvanpm run builddaVITE_Anima?
Javob
Dev: 2 — rejim development, .env.development.local eng kuchli. Build: 3 — rejim production, .env.development.local o'qilmaydi, .env.production .env dan kuchli. Qiymatlar satr bo'lib keladi ("2", "3") — son kerak bo'lsa, Number(...) bilan o'giring.
4. Build vaqti, ishga tushish vaqti emas
4.1 Qiymat faylga "pishib" qoladi
«Build ichida nima bor» bo'limidagi chiqishga yana qarang: VITE_API_URL: dan keyin manzil — matn. Saytni serverga yuklagandan keyin .env ni o'zgartirsangiz, hech narsa o'zgarmaydi: dist/ dagi fayl allaqachon yozilgan. Yangi qiymat uchun — yangi build.
Bu — build vaqtidagi (build-time) env. Uning teskarisi — ishga tushish vaqtidagi (runtime) env: Node server har ishga tushganda process.env ni o'qiydi, qiymatni server qayta ishga tushganda almashtirish mumkin (24-qismda). Brauzer kodida process.env yo'q — u yerda faqat build vaqti bor.
| Build vaqti (Vite) | Ishga tushish vaqti (Node server) | |
|---|---|---|
| Qachon o'qiladi | vite build paytida |
dastur har ishga tushganda |
| Qayerda turadi | JS fayl ichida, matn | server xotirasida |
| O'zgartirish | qayta build | qayta ishga tushirish |
| Kim ko'radi | saytni ochgan har kim | faqat server |
Bitta build'ni bir nechta serverga turli sozlama bilan qo'yish kerak bo'lsa (katta kompaniyalarda uchraydi), sozlama brauzerda alohida fayldan olinadi: ilova ochilganda fetch("./config.json"). Bu murakkabroq — kichik loyihada rejim + qayta build yetarli.
4.2 .env o'zgarsa — dev server qayta ishga tushadi
Dev server ishlab turganda .env.development ni saqlasak:
19:25:18 [vite] .env.development changed, restarting server...
19:25:18 [vite] server restarted.Config fayl kabi: brauzer sahifani qayta yuklaydi va yangi qiymatni oladi.
4.3 Qiymat doim satr
Jasur aka menyuda ko'pi bilan nechta taom ko'rsatilishini sozlamoqchi. Sardor .env ga VITE_MAX_TAOM=5 yozdi va kodda keyingi raqamni hisobladi:
console.log("keyingi:", import.meta.env.VITE_MAX_TAOM + 1);
console.log("bormi:", import.meta.env.VITE_YOQ === undefined);Build ichida:
console.log(`keyingi:`,`51`),console.log(`bormi:`,!0)6 emas, "51"! .env faylda tur yo'q — hamma qiymat satr. "5" + 1 — yashirin coercion: satrlar ulanadi, sonlar qo'shilmaydi. Vite buni build vaqtida o'zi hisoblab, tayyor "51" ni yozib qo'ydi. Ikkinchi qator: yo'q o'zgaruvchi — undefined (!0 — true).
Qoida: son kerak bo'lsa — Number(import.meta.env.VITE_MAX_TAOM), mantiqiy qiymat kerak bo'lsa — === "true" bilan solishtiring. VITE_DEBUG=false ham satr: if ("false") — rost, chunki bo'sh bo'lmagan satr har doim truthy. Turlar faylida (vite-env.d.ts) bunday o'zgaruvchilarni ham string deb yozing — number deb yozsangiz, TypeScript sizga yolg'on gapiradi.
5. Turlar: vite-env.d.ts
5.1 TypeScript import.meta.env ni bilmaydi
TypeScript uchun import.meta da env yo'q — uni Vite qo'shadi. Turlarni Vite'ning vite/client paketidan olish kerak. npm create vite shabloni buni tsconfig.json da qiladi ("types": ["vite/client"]), yoki alohida faylda:
/// <reference types="vite/client" />/// <reference types="…" /> — "shu paketning turlarini ham ol" degan maxsus izoh (uch chiziq bilan). U faylning eng boshida bo'lishi shart.
vite/client MODE, DEV, PROD, BASE_URL ni biladi. Bizning VITE_API_URL ni esa — yo'q: u [key: string]: any orqali o'tadi, ya'ni turi any. O'z o'zgaruvchilarimizni qo'shamiz:
interface ImportMetaEnv {
readonly VITE_TITLE: string;
readonly VITE_API_URL: string;
}Bu — declaration merging: Vite'da ham interface ImportMetaEnv bor, bizniki u bilan birlashadi. type bilan bo'lmaydi — type birlashmaydi. readonly — kodda import.meta.env.VITE_TITLE = "…" deb yozib bo'lmasin.
5.2 Nimani ushlaydi, nimani yo'q
Ikki xato bilan sinadik (tsc --noEmit):
const x: number = import.meta.env.VITE_TITLE;
const y = import.meta.env.VITE_TITEL;src/xato.ts(1,7): error TS2322: Type 'string' is not assignable to type 'number'.Birinchisi ushlandi: tur endi string. Ikkinchisi — imlo xatosi (TITEL) — ushlanmadi: vite/client dagi [key: string]: any istalgan nomga ruxsat beradi. vazifalar da ham aynan shunday chiqdi (VITE_API_UR — xato yo'q). Shuning uchun turlar yetarli emas — qiymat bor-yo'qligini build vaqtida tekshirish kerak. Buni vazifalar qadamida qilamiz.
Tekshirib ko'ring:
vite-env.d.tsdareadonly VITE_API_URL: stringdeb yozdik. Agar.envda bu o'zgaruvchi umuman bo'lmasa, TypeScript ogohlantiradimi?
Javob
Yo'q. .d.ts — faqat va'da: "bu nom bor va u satr". TypeScript .env faylni o'qimaydi va va'dani tekshira olmaydi — xuddi Declaration fayllari darsidagi declare const BAHOR_BUILD kabi. Kodda qiymat string bo'lib ko'rinadi, ishga tushganda esa undefined keladi. Va'dani haqiqat bilan solishtiradigan joy — build: config ichidagi tekshiruv.
6. Hujumchi nigohi
VITE_ o'zgaruvchi — ochiq ma'lumot. Sinab ko'rdik: .env ga VITE_DB_PAROL=qwerty123 qo'shib build qildik va dist/assets/*.js da qwerty123 ni qidirdik — topildi. Bizning kod import.meta.env ni to'liq chiqaradi, shuning uchun hamma VITE_ qiymat faylga tushdi. Kod buni qilmasa ham, ishlatilgan har VITE_ qiymat JS faylda ochiq matn bo'lib turadi.
Hujumchi nima qiladi? Hech qanday "buzish" kerak emas: saytni ochadi, DevTools → Sources (yoki curl) bilan JS faylni oladi va VITE_, key, token, sk_ so'zlarini qidiradi. Minifikatsiya satrlarni yashirmaydi. Source map yoqilgan bo'lsa (Source map'lar) — manba kod ham o'qiladi.
Qoidalar:
VITE_— faqat brauzer baribir bilishi mumkin bo'lgan narsalar: API manzili, sayt nomi, xarita xizmatining ommaviy kaliti (domen bilan cheklangan).- Parol, to'lov kaliti, bazaga ulanish satri — hech qachon
VITE_emas. Ular faqat serverda (backend) yashaydi; brauzer server orqali ishlaydi (fetchasoslari dagi "Hujumchi nigohi" — xuddi shu qoida). - Tasodifan sir saytga chiqib ketsa —
.envdan o'chirish yetarli emas: eski build va git tarixi uni saqlaydi. Kalitni xizmatning o'zida bekor qilib, yangisini oling.
Yana bir tuzoq — loadEnv ning uchinchi argumenti. loadEnv(mode, papka, "") — "prefiksdan qat'i nazar hammasini ber". Bizda u 106 ta o'zgaruvchi qaytardi: .env dagilar va kompyuterning butun muhiti (Path, foydalanuvchi papkasi…). Bu config ichida ishlatish uchun normal. Lekin uni define orqali brauzerga uzatsangiz (define: { ENV: JSON.stringify(env) }) — kompyuteringiz haqidagi ma'lumot saytga chiqadi.
7. Vazifalar qadami: API manzili .env ga
Branch: refactor/env
7.1 Ikkita .env fayl
.env.production:
# npm run build (production rejimi) — sayt shu API bilan ishlaydi.
# VITE_ bilan boshlanadigan qiymat brauzer kodiga YOZILADI
# (import.meta.env): bu yerda sir (parol, token) bo'lmasin
VITE_API_URL=https://ilmhamroh.uz/api/mashq.env.development:
# npm run dev (development rejimi) — hozircha production bilan bir xil
VITE_API_URL=https://ilmhamroh.uz/api/mashqIkkalasi ham git'ga kiradi: API manzili sir emas, u saytda baribir ko'rinadi. Hozircha qiymatlar bir xil — dev manzilini Dev server proxy darsida o'zgartiramiz. .gitignore ga — shaxsiy fayllar uchun:
# Shaxsiy sozlamalar (.env.local, .env.development.local) — faqat
# o'z kompyuteringizda; .env.production va .env.development — umumiy
*.local7.2 Kod va turlar
assets/js/asosiy.ts:
const api = apiKlient({
// .env.production / .env.development — Vite build vaqtida qo'yadi
asosiyUrl: import.meta.env.VITE_API_URL,Faqat shu o'zgartirilsa, tsc to'xtaydi:
assets/js/asosiy.ts(80,26): error TS2339: Property 'env' does not exist on type 'ImportMeta'.Tarjimasi: "ImportMeta turida env xususiyati yo'q". Yangi fayl assets/js/vite-env.d.ts:
// import.meta.env turlari (16/#28): vite/client — MODE, DEV, PROD,
// BASE_URL; o'zimizniki — pastda (.env.production,
// .env.development)
/// <reference types="vite/client" />
// interface — Vite'ning ImportMetaEnv'i bilan birlashishi uchun
// (declaration merging, 15/T-16; type bilan bo'lmaydi)
interface ImportMetaEnv {
readonly VITE_API_URL: string;
}E'tibor bering: izohlar /// qatoridan oldin turibdi. Bu mumkin — /// dan oldin faqat boshqa izohlar bo'lishi mumkin, kod emas. tsc endi toza. Build ham o'zgarmadi: index chunk hash'i — Dvsf2Sj6, oldingi qadam bilan bayt-bayt bir xil. Ichida (bir bo'lak):
W=Ze({asosiyUrl:`https://ilmhamroh.uz/api/mashq`,kalit:Oe(),...Qiymat build vaqtida matn bo'lib yozildi — aynan avvalgi kod kabi.
7.3 Unutilgan .env — jim xato
Tajriba: .env.production ni vaqtincha o'chirib build qildik. Build "muvaffaqiyatli":
dist/assets/index-4oOmLEDy.js 25.35 kB │ gzip: 9.48 kBIchida esa:
W=Ze({asosiyUrl:void 0,...void 0 — undefined. Sayt ochiladi, lekin API'siz: har so'rov xato. Testlar ham o'tadi (ular API manzilini o'zi beradi). Bu — eng yomon turdagi xato: hamma yashil, foydalanuvchida esa buzilgan.
7.4 vite.config.ts — funksiya va loadEnv
Config'ni oldingi darsdagi funksiya ko'rinishiga o'tkazamiz va qiymatni tekshiramiz (o'zgarmagan qismi …):
import { defineConfig, loadEnv } from "vite";
// Funksiya ko'rinishi (16/#28): rejim (mode) — "development"
// (npm run dev) yoki "production" (npm run build) — bo'yicha
// .env.<mode> o'qiladi
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd());
// .env.<mode> yo'q yoki qiymat unutilgan bo'lsa, Vite jim
// "undefined" yozib yuboradi (o'lchandi) — build'ni to'xtatamiz
if (!env.VITE_API_URL) {
throw new Error(
`VITE_API_URL yo'q: .env.${mode} faylini tekshiring`,
);
}
return {
plugins: [ … ],
base: "./",
build: { … },
};
});loadEnv(mode, process.cwd())— Vite brauzer uchun qiladigan ishni config ichida qiladi: shu rejimning.envfayllarini o'qib,VITE_qiymatlarni obyekt qilib qaytaradi.process.cwd()— joriy papka (npm rununi loyiha ildiziga qo'yadi).throw new Error(...)— config'dagi istisno Vite'ni to'xtatadi. Endi.env.productionsiz:
failed to load config from …\vazifalar\vite.config.ts
error during build:
Error: VITE_API_URL yo'q: .env.production faylini tekshiringBuild qizil, CI to'xtaydi, buzuq sayt chiqmaydi. Xabar o'zbekcha va aniq: qaysi fayl. Qolgan return { … } — avvalgi obyekt, faqat bir pog'ona ichkariga surildi. Shuning uchun diff katta ko'rinadi.
7.5 Tekshirish va commit
npm run check
npm run buildNatija: testlar 145/145, lint va format:check toza, build — o'sha hash. Brauzer tekshiruvi (159 ta) ham o'tdi.
git switch -c refactor/env
git add .
git commit -m \
"refactor: API manzili .env dan (import.meta.env), loadEnv tekshiruvi"Diff: 6 fayl, +82 −51. Keyin odatdagidek — push, PR, gh pr merge --merge.
Tekshirib ko'ring: Nega
.env.productionni.gitignorega qo'shmadik? Axir "env fayllar git'ga kirmaydi" degan maslahatni eshitgan bo'lishingiz mumkin.
Javob
Bu maslahat sir saqlanadigan fayllar haqida (backend'dagi .env, parollar). Bizning .env.production da faqat API manzili — u baribir saytning JS faylida ochiq turadi. Uni git'dan chiqarsak, GitHub Actions build'ida fayl bo'lmaydi va config to'xtatadi (yoki tekshiruvsiz — buzuq sayt). Shaxsiy va maxfiy narsalar uchun — *.local fayllar, ular git'ga kirmaydi. .env.example (qaysi o'zgaruvchilar kerakligining namunasi) ni Loyiha ildizidagi fayllar darsida qo'shamiz.
8. Ko'p uchraydigan xatolar
8.1 VITE_ siz nom — undefined
API_URL=... deb yozilgan, kodda import.meta.env.API_URL — undefined, xato yo'q. Prefiksni tekshiring.
8.2 process.env brauzer kodida
Node darslaridan odat bo'lib process.env.VITE_API_URL yozilsa — dev'da konsolda:
Uncaught ReferenceError: process is not definedBrauzerda process yo'q. Vite kodi uchun — faqat import.meta.env. (vite.config.ts ichida esa aksincha — process.env ham, loadEnv ham ishlaydi: u Node'da bajariladi.)
8.3 .env ni o'zgartirdim — sayt o'zgarmadi
Build qilingan saytda qiymat faylga yozilgan — qayta build kerak. Dev'da Vite o'zi qayta ishga tushadi, lekin brauzer vkladkasi yopiq bo'lsa, yangilang.
8.4 Bo'sh joy va qo'shtirnoq
VITE_TITLE = Bahor (tenglik atrofida bo'sh joy) yoki qiymatdagi # — natija kutilmagan bo'lishi mumkin. Qoida: NOM=qiymat, bo'sh joysiz; qiymatda bo'sh joy yoki # bo'lsa — qo'shtirnoqda: VITE_TITLE="«Bahor» #1".
9. Mashqlar
1-mashq (oson): Qaysi qiymat?
Fayllar: .env — VITE_COLOR=yashil, .env.local — VITE_COLOR=sariq, .env.production — VITE_COLOR=qizil, .env.staging.local — VITE_COLOR=ko'k.
vite(dev) —vite build—vite build --mode staging—VITE_COLOR=oq vite build—
Yechim
sariq—developmentrejimi uchun fayl yo'q,.env.local.envdan kuchli.qizil—.env.production.env.localdan kuchli.ko'k—.env.staging.localeng kuchli fayl.oq— terminal hammasidan kuchli.
2-mashq (o'rta): Sarlavha .env dan
kurs/mashqlar/16/28-env/ da oldingi darsdagi bahor-menyu nusxasi:
.envdaVITE_TITLE=«Bahor» menyusivaVITE_API_URL=https://ilmhamroh.uz/api/mashq;.env.stagingdaVITE_TITLE=«Bahor» menyusi (sinov).main.ts:document.titleva<h1>—VITE_TITLEdan. Faqat dev'da konsolga API manzilini chiqaring.src/vite-env.d.tsda ikkala o'zgaruvchiga tur bering.vite buildvavite build --mode staging— build ichida qaysi sarlavha? Dev qatori build'ga tushdimi?
Yechim
src/vite-env.d.ts (shablonning tsconfig.json ida "types": ["vite/client"] bor — /// qatori shart emas):
// Bizning o'zgaruvchilar — vite/client turlariga qo'shiladi
interface ImportMetaEnv {
readonly VITE_TITLE: string;
readonly VITE_API_URL: string;
}src/main.ts (menyu qismi oldingi darsdagidek):
const title = import.meta.env.VITE_TITLE;
document.title = title;
document.querySelector("h1")!.textContent = title;
if (import.meta.env.DEV) {
console.log("API:", import.meta.env.VITE_API_URL);
}Natija: npx tsc --noEmit — toza. vite build — JS ichida «Bahor» menyusi, API: so'zi 0 marta (o'lik kod o'chdi). --mode staging — «Bahor» menyusi (sinov). VITE_API_URL staging'da ham bor — .env dan keldi.
3-mashq (qiyin): Majburiy o'zgaruvchilar
vite.config.ts yozing: VITE_TITLE va VITE_API_URL — majburiy. Qaysi biri yo'q bo'lsa, build to'xtasin va xabarda hamma yetishmaganlar ro'yxati bo'lsin. Sinash: .env ni vaqtincha boshqa nomga o'zgartirib, vite build --mode staging.
Yechim
// vite.config.ts — 3-mashq: majburiy env o'zgaruvchilar
import { defineConfig, loadEnv } from "vite";
const REQUIRED = ["VITE_TITLE", "VITE_API_URL"];
export default defineConfig(({ mode }) => {
// .env, .env.local, .env.<mode>, .env.<mode>.local — birga
const env = loadEnv(mode, process.cwd());
const missing = REQUIRED.filter((name) => !env[name]);
if (missing.length > 0) {
const names = missing.join(", ");
throw new Error(`${mode} rejimida yo'q: ${names}`);
}
return {};
});.env siz staging build:
Error: staging rejimida yo'q: VITE_API_URLVITE_TITLE .env.staging da bor — shuning uchun ro'yxatda faqat bittasi. filter hammasini bir yo'la topadi: birinchi xatoda to'xtamaydi, o'quvchi faylni bir marta tuzatadi.
10. Real ishda
- Har frontend jamoasida
.env.development,.env.productionva ba'zan.env.stagingbor. CI esa maxfiy bo'lmagan qiymatlarni ham ko'pincha "Variables" bo'limidan terminal o'zgaruvchisi qilib beradi. - Sir sizib chiqishi — real hodisa turi: GitHub va boshqa xizmatlar ochiq JS fayllarda kalitlarni avtomatik qidiradi. Frontend'dagi kalit — ommaviy deb hisoblanadi.
- Next.js da xuddi shu g'oya, prefiksi boshqa:
NEXT_PUBLIC_(23-qismda). - Intervyu savollari: "Nega frontend'da sir saqlab bo'lmaydi?", "build-time va runtime env farqi?", "
.env.localnima uchun?".
Xulosa
- Vite
.env→.env.local→.env.[mode]→.env.[mode].localni o'qiydi, keyingisi kuchli; terminal o'zgaruvchisi hammasidan kuchli..local— git'ga kirmaydi. - Brauzer kodiga faqat
VITE_o'zgaruvchilar tushadi,import.meta.envorqali; plusMODE,DEV,PROD,BASE_URL. - Qiymat build vaqtida JS faylga matn bo'lib yoziladi —
.envni o'zgartirsangiz, qayta build kerak;VITE_da sir bo'lmasin. vite-env.d.tsturni beradi, lekin nom xatosini ushlamaydi; unutilgan qiymat —loadEnvvathrowbilan build'da ushlanadi.vazifalar: API manzili.env.production/.env.developmentda, config funksiya ko'rinishida.
Keyingi dars: Vite IV: assetlar, public papka va maxsus importlar — rasm, CSS va JSON'ni import qilish, public/ va src/ farqi; vazifalar manbasi src/ ga ko'chadi.
Manbalar
- Vite hujjatlari: "Env Variables and Modes" — vite.dev/guide/env-and-mode
- Vite hujjatlari:
loadEnv,envPrefix,envDir— vite.dev/config/shared-options - Vite 8.3.3, Node 24.21.0 — darsdagi hamma build va dev chiqishlari 2026-10 da olingan
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!