Mundarija (33)
- Bu darsda
- 1. Nega bu kerak?
- 2. Config fayl qayerda va qanday o'qiladi
- 2.1 Faylning nomi
- 2.2 Vite .ts faylni qanday o'qiydi
- 2.3 Config o'zgarsa — server qayta ishga tushadi
- 3. defineConfig: muharrir uchun turlar
- 3.1 Eng kichik config
- 3.2 Xato kalit — Vite jim qoladi
- 3.3 satisfies UserConfig — muqobil yozuv
- 4. Asosiy kalitlar
- 4.1 Umumiy: root, base, plugins
- 4.2 Dev server: server
- 4.3 Build: build
- 4.4 resolve.alias — yo'lni almashtirish
- 4.5 define — build vaqtidagi o'zgarmas
- 5. Funksiya ko'rinishi: buyruqqa qarab config
- 5.1 command va mode
- 5.2 Sardorning yechimi
- 5.3 loadEnv — config ichida .env ni o'qish
- 6. vazifalar config'ini o'qiymiz
- 7. Ko'p uchraydigan xatolar
- 7.1 Config sintaksis xatosi
- 7.2 Git Bash'da --base / buziladi
- 7.3 define da qo'shtirnoqsiz satr
- 7.4 Xato kalit nomi
- 8. Mashqlar
- 1-mashq (oson): Qaysi kalit?
- 2-mashq (o'rta): Birinchi config
- 3-mashq (qiyin): Buyruqqa qarab config
- 9. Real ishda
- Xulosa
- Manbalar
Vite II: vite.config ni o'qish va yozish
Qisqacha:
vite.config.ts— Vite'ning yagona sozlama fayli. U obyekt (yoki obyekt qaytaradigan funksiya) eksport qiladi:plugins— plaginlar,base— sayt qaysi papkada turishi,server— dev server,build—dist/qanday yoziladi. YordamchidefineConfigmuharrirga kalit nomlarini tanitadi, funksiya ko'rinishi esavitevavite builduchun turli sozlama berishga imkon beradi. Faylsiz ham Vite ishlaydi — sukut qiymatlari bilan.
Bu darsda
- Vite config faylini qayerdan izlashini va qanday yuklashini tushuntira olasiz.
defineConfigvasatisfies UserConfignima uchun kerakligini bilasiz.base,server.port,server.host,server.open,build.outDir,resolve.alias,definekalitlarini yoza olasiz.- Buyruq (
serve/build) va rejimga qarab o'zgaradigan config yozasiz. vazifalardagivite.config.tsni boshidan oxirigacha o'qib bera olasiz.
Oldin bilishingiz kerak: Vite I: nega tez va loyiha yaratish, Bundler nima, Polyfill, browserslist va Baseline, Type assertion, non-null va satisfies.
1. Nega bu kerak?
Vite I darsida vazifalar ga npm run dev va npm run preview ni qo'shdik. Ishladi. Lekin ildizda bitta fayl Sardorni bezovta qilyapti — vite.config.ts. Unda 58 qator: rolldownOptions, entryFileNames, transformIndexHtml... Uni biz Bundler nima darsidan beri qadamma-qadam to'ldirdik. Endi Jasur aka so'rayapti: "Shu fayldagi har qator nima qiladi? Bittasini o'chirsak nima buziladi?"
Sardorning yana bir muammosi bor. U «Bahor» menyusi uchun yangi kichik loyiha ochdi (npm create vite) va undan GitHub Pages'da sayt qilmoqchi. Shablonda vite.config.ts umuman yo'q. Build ham ishlaydi. Lekin Pages'da sahifa bo'sh chiqdi: CSS va JS /assets/... dan so'raldi, sayt esa /bahor-menyu/ papkasida. Bitta qator config yetishmayapti.
Bu dars — config faylning "anatomiyasi". Oshxona o'xshatishi: Vite — oshpaz, u sukut bo'yicha standart retsept bilan pishiradi. vite.config.ts — oshpazga berilgan yozma buyurtma: "tuzni kamroq, bitta porsiyani boshqa idishga". Buyurtma bo'lmasa — standart osh. Buyurtmada noto'g'ri so'z bo'lsa — oshpaz uni shunchaki tushunmaydi va standartini qiladi. Oxirgi gapni eslab qoling: u darsning eng muhim tuzog'i.
2. Config fayl qayerda va qanday o'qiladi
2.1 Faylning nomi
Vite ishga tushganda (vite, vite build, vite preview) loyiha ildizidan shu nomlarni shu tartibda qidiradi (Vite 8.3.3 manba kodidagi DEFAULT_CONFIG_FILES ro'yxati):
| Tartib | Fayl | Qachon |
|---|---|---|
| 1 | vite.config.js |
oddiy JavaScript loyiha |
| 2 | vite.config.mjs |
"type" yo'q, lekin ESM kerak |
| 3 | vite.config.ts |
TypeScript loyiha (bizda) |
| 4–6 | .cjs, .mts, .cts |
kam uchraydi |
Birinchi topilgani ishlatiladi. Boshqa nom bilan — --config bayrog'i: vite build --config vite.staging.ts. Fayl topilmasa — xato yo'q, Vite sukut qiymatlari bilan ishlaydi. Shablon shuning uchun config'siz keladi.
2.2 Vite .ts faylni qanday o'qiydi
Node 24 .ts ni o'zi o'qiy oladi, lekin Vite bunga tayanmaydi. U config faylni avval Rolldown bilan bitta vaqtinchalik JavaScript faylga yig'adi, keyin uni import qiladi. Shuning uchun configda import lar, TypeScript turlari va hatto __dirname ham ishlaydi. Sxemaga qarang:
flowchart TB
A["vite / vite build"] --> B["vite.config.*<br/>qidiradi"]
B --> C["Rolldown: .ts → .mjs<br/>(vaqtinchalik)"]
C --> D["import: obyekt<br/>yoki funksiya"]
D --> E["funksiya bo'lsa:<br/>command, mode beriladi"]
E --> F["+ CLI bayroqlari<br/>+ sukut qiymatlari"]
F --> G["yakuniy config"]Pastki ikki tugunga e'tibor bering. Yakuniy sozlama uch joydan yig'iladi: sukut qiymatlari, sizning faylingiz va buyruq qatoridagi bayroqlar. Bayroq eng kuchli. Sinab ko'rdik: configda server: { port: 5767 }, buyruqda --port 5768:
npx vite --port 5768 VITE v8.3.3 ready in 214 ms
➜ Local: http://localhost:5768/
➜ Network: use --host to exposeBayroqsiz npx vite esa 5767 ni oldi. Yuklash usulini --configLoader bayrog'i o'zgartiradi (bundle — sukut, runner va native — tajriba bosqichida). Bugun unga tegmaymiz.
2.3 Config o'zgarsa — server qayta ishga tushadi
Dev server ishlab turganda vite.config.ts ni saqlasangiz, Vite o'zi qayta yuklanadi:
11:42:44 [vite] vite.config.ts changed, restarting server...
11:42:44 [vite] server restarted.src/ dagi fayllardan farqli: ular HMR bilan almashadi, config esa butun serverni qayta quradi. Vaqt — sizda boshqacha.
Tekshirib ko'ring: Loyiha ildizida ham
vite.config.js, hamvite.config.tsbor. Vite qaysi birini o'qiydi?
Javob
vite.config.js ni — u ro'yxatda birinchi. .ts fayl jimgina e'tiborsiz qoladi, siz esa uni tahrirlab "nega o'zgarmayapti?" deb hayron bo'lasiz. Bunday holat ko'pincha JS loyihani TypeScript'ga ko'chirganda yuz beradi: eski .js fayl o'chirilmay qoladi. Loyihada bitta config fayl bo'lsin.
3. defineConfig: muharrir uchun turlar
3.1 Eng kichik config
// vite.config.ts
import { defineConfig } from "vite";
export default defineConfig({});defineConfig — Vite'ning yordamchi funksiyasi. U hech narsani o'zgartirmaydi: berganingizni o'sha holida qaytaradi. Uning yagona vazifasi — turlar. VS Code { ichida Ctrl+Space bosganda kalitlar ro'yxatini ko'rsatadi, sichqoncha ostida har kalitning izohi chiqadi. Xuddi do'kondagi blanka kabi: bo'sh qog'oz emas, kataklari belgilangan.
3.2 Xato kalit — Vite jim qoladi
Endi darsning bosh tuzog'i. Sardor portni o'zgartirmoqchi edi, lekin shoshib yozdi:
import { defineConfig } from "vite";
export default defineConfig({
server: {
prot: 3000,
},
build: {
outdir: "build",
},
});npx vite build — hech qanday ogohlantirish yo'q, natija baribir dist/ ga tushdi:
dist/index.html 0.49 kB │ gzip: 0.31 kB
dist/assets/index-lc8mfrVt.css 0.07 kB │ gzip: 0.09 kB
dist/assets/index-4Q89cMZ6.js 1.08 kB │ gzip: 0.59 kBVite noma'lum kalitni tekshirmaydi — prot va outdir ni shunchaki o'qimadi. Xatoni faqat TypeScript ushlaydi. Shu faylni tsc 7.0.2 bilan tekshirdik:
vite.config.ts(5,5): error TS2769: No overload matches this call.
The last overload gave the following error.
Object literal may only specify known properties, and 'prot' does not exist in type 'ServerOptions$1'.
vite.config.ts(8,5): error TS2769: No overload matches this call.
The last overload gave the following error.
Object literal may only specify known properties, but 'outdir' does not exist in type 'BuildEnvironmentOptions'. Did you mean to write 'outDir'?Tarjimasi: "Chaqiruvga mos keladigan variant yo'q. Obyekt faqat ma'lum xususiyatlarni ko'rsata oladi, ServerOptions turida esa prot yo'q". Ikkinchisida TypeScript hatto maslahat beradi: "outDir demoqchimisiz?". No overload matches this call — defineConfig ning bir nechta ko'rinishi (obyekt, funksiya, Promise) bor, va birortasi mos kelmadi.
Muharrirda bu qizil chiziq bo'lib darhol ko'rinadi. vazifalar da esa config'ni tsc ham tekshiradi — buni tsconfig: app/node bo'linishi darsida sozlaymiz. Hozircha qoida: config yozganda muharrirdagi qizil chiziqqa ishoning, Vite'ning jimligiga emas.
3.3 satisfies UserConfig — muqobil yozuv
satisfies darsida va'da qilgan edik: Vite hujjatlarida config shunday ham yoziladi:
import type { UserConfig } from "vite";
export default {
server: {
port: 3000,
},
} satisfies UserConfig;import type — faqat tur olinadi, build'da bu qator yo'qoladi. satisfies obyektni UserConfig turi bilan solishtiradi. Xato kalitda xabar qisqaroq va aniqroq:
vite.config.ts(5,5): error TS2353: Object literal may only specify known properties, and 'prot' does not exist in type 'ServerOptions$1'.Qaysi birini tanlash — did masalasi. defineConfig keng tarqalgan (Vite shablonlari va ko'p loyihalar shunday), funksiya ko'rinishini ham qo'llaydi. Kursda defineConfig ni ishlatamiz.
Tekshirib ko'ring:
defineConfigolib tashlansa (export default { … }), build ishlaydimi?
Javob
Ishlaydi — Vite oddiy obyektni ham qabul qiladi. defineConfig faqat turlar uchun. Lekin muharrir endi kalitlarni tanimaydi: prot kabi xato qizil bo'lmaydi va avtoto'ldirish ishlamaydi. Ya'ni yo'qotadigan narsangiz — himoya, ishlashi emas.
4. Asosiy kalitlar
Config kalitlari bo'limlarga ajratilgan. Har birini Sardorning bahor-menyu loyihasida sinab ko'ramiz.
4.1 Umumiy: root, base, plugins
| Kalit | Nima qiladi | Sukut |
|---|---|---|
root |
loyiha ildizi (index.html qayerda) |
joriy papka |
base |
saytning manzildagi papkasi | "/" |
plugins |
plaginlar massivi | [] |
mode |
rejim (.env fayllari) |
buyruqqa qarab |
base — Sardorning Pages muammosining yechimi. Vite index.html dagi hamma yo'lni base bilan boshlaydi. Uch qiymat bilan build qildik va dist/index.html dagi skript qatoriga qaradik:
base |
dist/index.html da |
|---|---|
"/" |
src="/assets/index-CR-CoZmS.js" |
"./" |
src="./assets/index-CR-CoZmS.js" |
"/bahor-menyu/" |
src="/bahor-menyu/assets/index-CR-CoZmS.js" |
E'tibor bering: hash uchalasida bir xil — fayl tarkibi o'zgarmadi, faqat unga olib boradigan yo'l. Sayt login.github.io/bahor-menyu/ da tursa — "/bahor-menyu/" yoki "./". vazifalar da "./" (nisbiy yo'l): repo nomi o'zgarsa ham ishlaydi. "./" ning cheklovi bor — bir nechta sahifali ilovada ichki manzillar bilan noqulay. Bu haqda React qismlarida, sahifalar orasida yurish (routing) bilan birga gaplashamiz — hozir bilish shart emas.
plugins — Vite'ga yangi ish o'rgatadigan obyektlar massivi. vazifalar da hozir bitta o'zimiz yozgan plagin bor (blocking-render). Plaginlar chuqur — Vite plaginlari darsida.
4.2 Dev server: server
| Kalit | Nima qiladi | Sukut |
|---|---|---|
server.port |
dev server porti | 5173 |
server.strictPort |
port band bo'lsa — to'xtash | false |
server.host |
tarmoqdagi boshqa qurilmalarga ochish | "localhost" |
server.open |
ishga tushganda brauzerni ochish | false |
Port band bo'lsa nima bo'ladi? Sinab ko'rdik: 5763 portni boshqa dastur egallagan, Vite'ga shu portni berdik.
npx vite --port 5763Port 5763 is in use, trying another one...
VITE v8.3.3 ready in 293 ms
➜ Local: http://localhost:5764/
➜ Network: use --host to exposeVite keyingi bo'sh portni oldi. Qulay, lekin xavfli: brauzerdagi eski vkladka 5763 da qolib, boshqa loyihani ko'rsatishi mumkin. Port aniq bo'lishi kerak bo'lsa (masalan, backend CORS ro'yxatida faqat shu port) — strictPort:
npx vite --port 5763 --strictPorterror when starting dev server:
Error: Port 5763 is already in use(Undan keyin at httpServerStart … qatorlari keladi — biz ularni qisqartirdik.) Tarjimasi: "5763 port allaqachon band". Endi Vite jim almashtirmaydi, siz sababini qidirasiz.
server.host — telefoningizdan sinash uchun. U Dev server proxy darsida, chunki xavfsizlik bilan bog'liq. server.proxy ham o'sha darsda.
vite preview uchun xuddi shunday preview bo'limi bor (preview.port, sukut 4173).
4.3 Build: build
| Kalit | Nima qiladi | Sukut |
|---|---|---|
build.outDir |
natija papkasi | "dist" |
build.assetsDir |
JS, CSS, rasm qaysi ichki papkada | "assets" |
build.emptyOutDir |
build oldidan papkani tozalash | outDir ildiz ichida bo'lsa — true |
build.target |
qaysi brauzerlar uchun | "baseline-widely-available" |
| Kalit | Nima qiladi | Sukut |
|---|---|---|
build.sourcemap |
.map fayllar |
false |
build.rolldownOptions |
Rolldown'ga to'g'ridan-to'g'ri sozlama | — |
build.chunkSizeWarningLimit |
"katta chunk" ogohlantirishi (kB) | 500 |
build.assetsInlineLimit |
kichik faylni data: qilib qo'shish (bayt) |
4096 |
target ni Polyfill va Baseline, sourcemap ni Source map'lar darsida sozlagansiz. rolldownOptions — Vite 8 nomi: Vite 7 gacha bu rollupOptions edi (bundler Rollup bo'lgan). Eski loyihalarda rollupOptions ni ko'rasiz — Vite 8 uni hali tushunadi, lekin yangi kodda rolldownOptions yozing.
outDir loyihadan tashqarida bo'lsa, Vite uni o'zi tozalashdan qo'rqadi:
(!) outDir C:\…\l27\chiqish is not inside project root and will not be emptied.
Use --emptyOutDir to override.Tarjimasi: "outDir loyiha ildizi ichida emas va tozalanmaydi. Majburlash uchun --emptyOutDir". Bu himoya: outDir: "../" deb xato yozsangiz, Vite qo'shni papkalarni o'chirib yubormaydi. Lekin eski build fayllari yangilari bilan aralashib qoladi.
4.4 resolve.alias — yo'lni almashtirish
resolve: {
alias: {
"/assets/js/tema.js": "/src/tema.ts",
},
},Alias (taxallus) — "import'da A yo'lini ko'rsang, aslida B ni ol". Ko'pincha @/ — src/ uchun qisqa yo'l sifatida ishlatiladi. Bu misol vazifalar dan — uni assetlar va public papka darsida qo'shamiz. @/ va uning tuzoqlari — Path alias darsida.
4.5 define — build vaqtidagi o'zgarmas
Declaration fayllari darsida declare const BAHOR_BUILD: string ni ko'rdik va "bunday nomni build vositasi qo'yadi (Vite'dagi define)" degan edik. Mana u. main.ts oxirida:
declare const BAHOR_BUILD: string;
const footer = document.createElement("small");
footer.textContent = `Versiya: ${BAHOR_BUILD}`;
document.body.append(footer);Configda:
export default defineConfig({
define: {
BAHOR_BUILD: JSON.stringify("2026-10-07"),
},
});Build'dan keyin dist/assets/index-….js ichida (bir bo'lak):
Versiya: 2026-10-07`,document.body.append(r)define — matnni almashtirish: build vaqtida kodning har BAHOR_BUILD so'zi berilgan qiymat bilan almashadi. Shuning uchun qiymat — JavaScript kodi sifatida yoziladi. JSON.stringify("2026-10-07") — qo'shtirnoqli satr "2026-10-07". Qo'shtirnoqsiz yozsak-chi? Sinab ko'rdik — define: { BAHOR_BUILD: "2026-10-07" }:
Versiya: 2009`,document.body.append(r)2009! Vite 2026-10-07 ni kod deb qo'ydi, minifikator esa ayirishni hisoblab qo'ydi: 2026 − 10 − 7 = 2009. Xato yo'q, ogohlantirish yo'q — saytda shunchaki noto'g'ri raqam. Qoida: define dagi har satr qiymat — JSON.stringify(...) ichida.
Dev serverda define boshqacha ishlaydi: Vite manbani o'zgartirmaydi, globalThis.BAHOR_BUILD = "…" ni o'zining kichik yordamchi modulida (vite/dist/client/env.mjs) qo'yadi. Natija bir xil, lekin dev'da BAHOR_BUILD haqiqiy global o'zgaruvchi.
Tekshirib ko'ring:
define: { DEBUG: false }va koddaif (DEBUG) { console.log("...") }. Build'da nima bo'ladi?
Javob
DEBUG so'zi false bilan almashadi: if (false) { … }. Minifikator bu blok hech qachon bajarilmasligini ko'radi va uni butunlay o'chiradi — Tree shaking va minifikatsiya darsidagi "o'lik kod". false — satr emas, shuning uchun JSON.stringify shart emas (lekin JSON.stringify(false) ham xuddi false beradi).
5. Funksiya ko'rinishi: buyruqqa qarab config
5.1 command va mode
Ba'zan dev va build uchun turli sozlama kerak. Masalan, Sardorga dev'da base: "/", Pages build'ida "/bahor-menyu/" kerak. Buning uchun defineConfig ga obyekt emas, funksiya beriladi. Vite uni chaqiradi va argumentda nima ishga tushirilganini aytadi:
import { defineConfig } from "vite";
export default defineConfig(({ command, mode, isPreview }) => {
console.log("config:", { command, mode, isPreview });
return {};
});To'rt xil buyruq bilan ishga tushirdik. Har birida config'ning birinchi chiqargan qatori:
| Buyruq | command |
mode |
isPreview |
|---|---|---|---|
vite |
'serve' |
'development' |
false |
vite build |
'build' |
'production' |
false |
vite build --mode staging |
'build' |
'staging' |
false |
vite preview |
'serve' |
'production' |
true |
command— nima qilinyapti:'serve'(server) yoki'build'(yig'ish). Faqat ikki qiymat.mode— rejim: qaysi.envfayllari o'qilishini belgilaydigan nom. Sukut bo'yicha dev —development, build —production, lekin--modebilan istalgan nom (masalanstaging— "sinov serveri"). Rejimlar va.env— keyingi darsda.isPreview—vite previewdatrue. E'tibor bering: preview ham'serve', chunki u ham server.
5.2 Sardorning yechimi
import { defineConfig } from "vite";
export default defineConfig(({ command }) => ({
base: command === "build" ? "/bahor-menyu/" : "/",
}));=> ({ … }) — o'q funksiya obyektni to'g'ridan-to'g'ri qaytaradi (qavslarsiz { funksiya tanasi deb o'qilardi). Shart oddiy ternar operator.
5.3 loadEnv — config ichida .env ni o'qish
Funksiya ko'rinishining yana bir sababi — .env fayllardagi qiymatni config'ning o'zida ishlatish. Vite .env ni brauzer kodi uchun o'qiydi, lekin config fayl unga avtomatik kirmaydi. Buning uchun loadEnv(mode, papka) bor — mode aynan funksiya argumentidan keladi:
import { defineConfig, loadEnv } from "vite";
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd());
return {
// env.VITE_API_URL — .env.<mode> faylidan
};
});vazifalar aynan shu shaklga keyingi darsda o'tadi. Hozir faqat sababini biling: obyekt ko'rinishida mode yo'q.
6. vazifalar config'ini o'qiymiz
Sizning vazifalar loyihangizdagi vite.config.ts (Vite I holatidagi). Avval faylni to'liq ko'ring, keyin jadval bilan o'qiymiz:
import { defineConfig } from "vite";
export default defineConfig({
plugins: [
{
name: "blocking-render",
transformIndexHtml: {
order: "post",
handler: (html) =>
html.replace(
'<script type="module" crossorigin',
'<script type="module" blocking="render" crossorigin',
),
},
},
],
base: "./",
build: {
target: ["chrome117", "edge117", "firefox119", "safari17.4"],
modulePreload: { polyfill: false },
sourcemap: true,
rolldownOptions: {
input: {
index: "index.html",
tema: "assets/js/tema.ts",
},
output: {
entryFileNames: (chunk) =>
chunk.name === "tema"
? "assets/js/tema.js"
: "assets/[name]-[hash].js",
},
},
},
});Izohlarni olib tashladik — sizning faylingizda ular bor. Endi qatorma-qator:
| Qator | Nima qiladi | O'chirsak |
|---|---|---|
plugins: [{ name: "blocking-render", … }] |
build'dagi index.html ga blocking="render" ni qaytaradi |
CLS 0.057, test baribir "yashil" |
base: "./" |
yo'llar nisbiy | Pages'da CSS/JS 404 |
target: [...] |
Object.groupBy bor brauzerlar |
sukut ro'yxati (Firefox 114…) — u yerda ilova yiqiladi |
modulePreload: { polyfill: false } |
keraksiz polyfill yo'q | index chunk'iga ortiqcha kod qo'shiladi |
| Qator | Nima qiladi | O'chirsak |
|---|---|---|
sourcemap: true |
.map fayllar |
DevTools'da xato minifikatsiya qilingan qatorda |
input.index |
asosiy kirish — index.html |
input berilgani uchun sukut bekor: sahifa build'ga tushmaydi |
input.tema |
tema.ts — alohida kirish |
tema.js build'ga tushmaydi, 404 |
entryFileNames |
tema — hash'siz nom, qolgani [name]-[hash] |
tema-D3k….js — index.html uni topmaydi |
Har qatorning sababi — o'z darsida: blocking-render va input — Bundler nima, target va modulePreload — Polyfill va Baseline, sourcemap — Source map'lar, [name]-[hash] — Code splitting va hash. Bu dars ularni bitta xaritaga yig'di: config — o'tgan darslardagi qarorlarning ro'yxati.
Ikki qiziq joy:
entryFileNames— funksiya. Rolldown har chunk uchun uni chaqiradi va chunk nomiga qarab fayl nomini qaytaradi.[name]va[hash]— joy egallovchilar (placeholder): Rolldown ularni chunk nomi va tarkib hash'i bilan almashtiradi.handler: (html) => html.replace(...)—index.htmlning matnini oladi va o'zgartirilganini qaytaradi. Bu — plagin hooki (build bosqichiga ulanadigan funksiya). Hook'lar Vite plaginlari darsining asosiy mavzusi.
Tekshirib ko'ring: Nega
entryFileNamesdatemauchun hash ishlatilmaydi,indexuchun esa ishlatiladi?
Javob
index chunk'ini Vite o'zi index.html ga yozadi — nomi qanday bo'lsa ham, to'g'ri havola qo'yadi. tema.js esa <script src="assets/js/tema.js"> — oddiy skript, Vite uni qayta yozmaydi (build chiqishidagi can't be bundled ogohlantirishi shu haqda). Nom o'zgarsa, HTML eski nomni so'raydi va 404 oladi. Shuning uchun tema uchun nom qat'iy. Narxi: bu faylni brauzer keshi max-age tugaguncha eski holida ushlab turishi mumkin.
7. Ko'p uchraydigan xatolar
7.1 Config sintaksis xatosi
Vergul tushib qoldi (server: { … } dan keyin):
failed to load config from C:\…\bahor-menyu\vite.config.ts
error during build:
Error: Build failed with 1 error:
[PARSE_ERROR] Expected `,` or `}` but found `Identifier`
╭─[ vite.config.ts:7:3 ]
│
3 │ export default defineConfig({
│ ┬
│ ╰── Opened here
│
7 │ build: {
│ ──┬──
│ ╰──── `,` or `}` expected
───╯Tarjimasi: "Config yuklanmadi. Tahlil xatosi: , yoki } kutilgan edi, nom topildi". Xabarni Rolldown beradi (u config'ni yig'yapti) va chiroyli ko'rsatadi: 3-qatorda { ochilgan, 7-qatorda build dan oldin vergul yo'q. Xato ko'rsatilgan joyda emas, undan oldin — Xato xabarini o'qish san'ati dagi qoida bu yerda ham ishlaydi.
7.2 Git Bash'da --base / buziladi
Sardor Git Bash'da sinadi: npx vite build --base /bahor-menyu/. dist/index.html da esa:
src="/Dasturlash/Install/Git/bahor-menyu/assets/index-CR-CoZmS.js"Git Bash / bilan boshlangan argumentni Windows yo'li deb o'ylab, oldiga Git o'rnatilgan papkani qo'shib yubordi (sizda boshqa papka bo'ladi). Bu Vite xatosi emas — MSYS (Git Bash ichidagi qatlam) "yordami". Yechimlar: base ni config'ga yozing (eng to'g'ri yo'l), yoki npm skriptida ishlating (npm run Windows'da cmd.exe orqali ishlaydi), yoki buyruq oldidan MSYS_NO_PATHCONV=1.
7.3 define da qo'shtirnoqsiz satr
Yuqorida ko'rdik: "2026-10-07" → saytda 2009. Satr qiymat — har doim JSON.stringify("...").
7.4 Xato kalit nomi
outdir, prot, rollupOption — Vite jim o'tkazib yuboradi. Himoya — defineConfig va muharrirdagi qizil chiziq.
8. Mashqlar
Mashqlar kurs/mashqlar/16/27-vite-config/ da. Avval loyihani tayyorlang: Vite I darsidagidek npm create vite@latest bahor-menyu -- --template vanilla-ts. Keyin src/ ni «Bahor» menyusi bilan almashtiring: menyu.ts — taomlar ro'yxati, main.ts — ularni <ul> ga chiqaradi.
1-mashq (oson): Qaysi kalit?
Har talabga config kaliti:
- Dev server 3000 portda ishlasin —
server.. - Port band bo'lsa, Vite boshqasini olmasin —
server.. - Build
dist/ga emas,chiqish/ga yozilsin —build.. - Sayt
example.com/menyu/da turadi — . - Kodda
APP_VERSIONso'zi"1.2.0"satriga almashsin — .
Yechim
server.port: 3000server.strictPort: truebuild.outDir: "chiqish"base: "/menyu/"— oxiridagi/muhim ("./"ham ishlaydi).define: { APP_VERSION: JSON.stringify("1.2.0") }—JSON.stringifysiz1.2.0JavaScript'da sintaksis xatosi bo'lardi (ikki nuqtali son yo'q).
2-mashq (o'rta): Birinchi config
bahor-menyu ga vite.config.ts yozing:
- dev server —
5300port, band bo'lsa xato bilan to'xtasin, ishga tushganda brauzer o'zi ochilsin; - build natijasi —
chiqish/papkasiga; - yo'llar nisbiy.
Keyin npx vite build ni bajaring va chiqishdagi yo'llarga qarang. chiqish/index.html dagi <script> qatorini toping.
Yechim
// vite.config.ts — 2-mashq
import { defineConfig } from "vite";
export default defineConfig({
base: "./",
server: {
port: 5300,
strictPort: true,
open: true,
},
build: {
outDir: "chiqish",
},
});Build chiqishi (hash'lar sizda boshqacha bo'lishi mumkin):
chiqish/index.html 0.43 kB │ gzip: 0.28 kB
chiqish/assets/index-lc8mfrVt.css 0.07 kB │ gzip: 0.09 kB
chiqish/assets/index-CR-CoZmS.js 0.98 kB │ gzip: 0.55 kBchiqish/index.html da: <script type="module" crossorigin src="./assets/index-CR-CoZmS.js">. .gitignore ga chiqish/ ni qo'shishni unutmang — u ham dist/ kabi build natijasi.
3-mashq (qiyin): Buyruqqa qarab config
main.ts ga darsdagi BAHOR_BUILD qatorlarini qo'shing. Config shunday bo'lsin:
vite builddabase—"/bahor-menyu/",vite(dev) da —"/";vite builddaBAHOR_BUILD— bugungi sana ("2026-10-07"ko'rinishida), dev'da —"dev"so'zi.
Ishora: funksiya ko'rinishi va command. Bugungi sana: new Date().toISOString().slice(0, 10) — Date asoslari dagi ISO satrning birinchi 10 belgisi.
Yechim
// vite.config.ts — 3-mashq: buyruqqa qarab config
import { defineConfig } from "vite";
export default defineConfig(({ command }) => {
const isBuild = command === "build";
return {
// GitHub Pages: sayt /bahor-menyu/ papkasida; dev'da — ildiz
base: isBuild ? "/bahor-menyu/" : "/",
define: {
// build — bugungi sana, dev — "dev" so'zi
BAHOR_BUILD: JSON.stringify(
isBuild ? new Date().toISOString().slice(0, 10) : "dev",
),
},
};
});Tekshirish: npx vite build, keyin dist/index.html da src="/bahor-menyu/assets/index-….js", JS faylida Versiya: 2026-10-07 (sizda o'z sanangiz). npx vite da sahifa pastida Versiya: dev.
Nega toISOString() UTC sanasini beradi? Toshkentda soat 00:00–05:00 orasida build qilsangiz, sana kechagi bo'ladi. Versiya belgisi uchun bu muhim emas; aniq mahalliy sana kerak bo'lsa — Intl bilan formatlang.
9. Real ishda
- Har Vite loyihada ildizda shu fayl bor: React, Vue, Svelte, Astro (o'z config'i ichida Vite). Yangi loyihaga kelganda uni
package.jsondagiscriptsdan keyin ikkinchi bo'lib o'qing — u loyihaning "qarorlar ro'yxati". - Monorepo va ko'p muhitli loyihalarda config funksiya ko'rinishida bo'ladi:
modega qarabbase, proxy, plaginlar. Ba'zan bir nechta fayl (vite.config.ts,vite.staging.ts) va--configbayrog'i ishlatiladi. - Intervyu savollari: "
defineva.envfarqi nima?", "Pages'da sahifa oq — nima tekshirasiz?" (javob:base), "Vite config'ni qanday tiplaysiz?".
Xulosa
- Vite
vite.config.js/.mjs/.ts/...ni shu tartibda qidiradi,.tsni Rolldown bilan yig'ib yuklaydi; fayl bo'lmasa — sukut qiymatlari. - Yakuniy config: sukut + fayl + CLI bayroqlari (bayroq eng kuchli). Config o'zgarsa, dev server qayta ishga tushadi.
- Vite noma'lum kalitni jim o'tkazib yuboradi — himoya
defineConfig(yokisatisfies UserConfig) vatsc. base— saytning papkasi,server.port/strictPort/open— dev server,build.outDir— natija papkasi,define— matnni almashtirish (JSON.stringifybilan!).- Funksiya ko'rinishi
{ command, mode, isPreview }oladi: dev va build uchun turli sozlama,loadEnvuchunmode.
Keyingi dars: Vite III: env o'zgaruvchilar va rejimlar — .env fayllari, VITE_ prefiksi va import.meta.env; vazifalar dagi API manzili koddan .env ga ko'chadi.
Manbalar
- Vite hujjatlari: "Configuring Vite", "Shared Options" (
base,define), "Server Options", "Build Options" — vite.dev/config/ - Vite 8.3.3 manba kodi:
node_modules/vite/dist/node/chunks/node.js—DEFAULT_CONFIG_FILES,DEFAULT_DEV_PORT(5173),DEFAULT_PREVIEW_PORT(4173) - Vite 8 migratsiya qo'llanmasi: "Migration from v7" (
rollupOptions→rolldownOptions) — vite.dev/guide/migration
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!