Mundarija (39)
- Bu darsda
- 1. Nega bu kerak?
- 2. Node versiyalari qanday yashaydi
- 2.1 To'rt bosqich
- 2.2 2026-yil oktabr holati
- 3. Versiya menejeri
- 3.1 U qanday ishlaydi
- 3.2 Menejerlar: 2026-yil oktabr holati
- 4. fnm bilan amaliyot
- 4.1 O'rnatish va sozlash
- 4.2 Bir nechta Node o'rnatish
- 4.3 Versiyalar orasida almashish
- 4.4 .nvmrc va avtomatik almashish
- 5. Boshqa menejerlar
- 5.1 nvm-windows 2
- 5.2 nvm (macOS, Linux, WSL)
- 5.3 Volta va mise
- 6. .nvmrc ni to'g'ri yozish
- 6.1 Format
- 6.2 Qaysi birini tanlash
- 7. engines: npm'ga talab
- 7.1 engines maydoni
- 7.2 Ogohlantirish, xato va jimlik
- 7.3 devEngines — yangi va qat'iyroq
- 8. Corepack: paket menejerining versiyasi
- 9. CI ham .nvmrc ni o'qiydi
- 10. Ko'p uchraydigan xatolar
- 10.1 Versiya o'rnatilmagan — va siz eski versiyada qoldingiz
- 10.2 Ichki papkada .nvmrc topilmaydi
- 10.3 Eski o'rnatuvchidagi Node PATH'da qolgan
- 10.4 Ogohlantirishni o'qimaslik
- 11. Mashqlar
- 1-mashq (oson): Qaysi versiya ishlaydi?
- 2-mashq (o'rta): Ikki loyiha
- 3-mashq (qiyin): Versiya tekshiruvchi skript
- 4-mashq: Vazifalar qadami — .nvmrc va engines
- 12. Real ishda
- Xulosa
- Manbalar
Node versiya menejerlari: nvm, fnm, Volta va .nvmrc
Qisqacha: Har loyiha o'z Node versiyasini talab qiladi. Versiya menejeri (Windows'da fnm yoki nvm-windows, macOS/Linux'da nvm yoki fnm) bir kompyuterda bir nechta Node'ni saqlaydi va papkaga kirganingizda kerakligiga o'tkazadi. Loyiha talabi ikki joyga yoziladi.
.nvmrcmenejer va CI'ga qaysi versiyani yoqishni aytadi.package.jsondagienginesesa npm'ga qaysi versiyalarda ishlash mumkinligini aytadi.enginessukut bo'yicha faqat ogohlantiradi — to'xtatish uchunengine-strict=truekerak.
Bu darsda
- Node reliz jadvalini (Current, faol LTS, xizmat, EOL) o'qiy olasiz va loyiha uchun versiya tanlaysiz.
- fnm bilan bir nechta Node o'rnatib, ular orasida almashasiz;
.nvmrcbo'yicha avtomatik almashishni sozlaysiz. - nvm-windows, nvm, Volta va mise farqini va 2026-yildagi holatini bilasiz.
engines,engine-strictvadevEnginesnimani to'xtatishini, nimani to'xtatmasligini ko'rsatasiz.vazifalarga.nvmrcvaenginesqo'shib, CI'ni shu faylga bog'laysiz.
Oldin bilishingiz kerak: Node.js nima va uni o'rnatish, Frontend asboblar zanjiri, Muhit o'zgaruvchilari va PATH, GitHub Pages'ga Actions orqali deploy.
1. Nega bu kerak?
Oldingi darsda ko'rdik: zanjirning hamma vositasi Node ichida ishlaydi. Endi bu nimaga olib kelishini ko'ramiz.
Sardorning kompyuterida Node bir yil oldin rasmiy o'rnatuvchidan qo'yilgan: v22.17.0. U vazifalar ni GitHub'dan yuklab oldi va odatdagidek o'rnatdi. Haqiqiy chiqish:
npm cinpm warn EBADENGINE Unsupported engine {
npm warn EBADENGINE package: undefined,
npm warn EBADENGINE required: { node: '>=24' },
npm warn EBADENGINE current: { node: 'v22.17.0', npm: '10.9.2' }
npm warn EBADENGINE }
added 102 packages, and audited 103 packages in 3s
32 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilitiesSariq ogohlantirish chiqdi, lekin paketlar o'rnatildi. Sardor ogohlantirishni o'qimadi — ko'pchilik o'qimaydi. Keyin testlar:
npm testTypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for …\vazifalar\assets\js\api.ts
…
ℹ tests 26
ℹ pass 13
ℹ fail 13(Terminaldagi ko'rinish; yo'l qisqartirildi, o'rtasi tashlandi.) Tarjimasi: ".ts — noma'lum fayl kengaytmasi". Jasur akaning kompyuterida xuddi shu loyiha 143 ta testdan o'tadi. Sardorda esa 18 ta test faylidan 13 tasi umuman yuklanmadi.
Sabab — versiya. Node 22.17.0 .ts faylni o'zi bajara olmaydi. Turlarni o'chirib bajarish (type stripping) Node 22 da keyinroq — 22.18.0 dan sukut bo'yicha yoqilgan. vazifalar testlari esa .ts modullarni to'g'ridan-to'g'ri import qiladi (15-qismdan beri).
Bu "mening kompyuterimda ishlaydi" muammosining eng ko'p uchraydigan shakli. Bugun uni uch qatlamda yechamiz:
- Versiya menejeri — Sardor bir buyruq bilan kerakli Node'ga o'tadi.
.nvmrc— loyiha "menga Node 24 kerak" deb o'zi aytadi; menejer ham, CI ham shu faylni o'qiydi.engines— npm noto'g'ri versiyani sezadi, kerak bo'lsa ishni to'xtatadi.
2. Node versiyalari qanday yashaydi
2.1 To'rt bosqich
Node o'rnatish darsida LTS va Current farqini ko'rgansiz. To'liq rasmi — to'rt bosqich:
| Bosqich | Nima bo'ladi | Kimga |
|---|---|---|
| Current (joriy) | Yangi imkoniyatlar qo'shiladi | Sinab ko'ruvchilarga |
| Faol LTS (Active LTS) | Xatolar tuzatiladi, kichik yangiliklar | Hammaga |
| Xizmat (Maintenance) | Faqat jiddiy xato va xavfsizlik tuzatishlari | Ko'chishga ulgurmaganlarga |
| EOL (End of Life) | Hech qanday tuzatish yo'q | Hech kimga |
EOL (End of Life — umr oxiri) — versiyaga boshqa yangilanish chiqmaydigan sana. EOL'dan keyin topilgan xavfsizlik teshigi hech qachon yopilmaydi. Shuning uchun EOL versiyada sayt yoki server ishlatish — ochiq eshik qoldirish bilan barobar.
2.2 2026-yil oktabr holati
Diagrammada har versiyaning hayoti ko'rsatilgan. Sanalar Node.js loyihasining rasmiy jadvalidan (nodejs/Release repozitoriysi). Qizil vertikal chiziq — bugungi kun.
gantt
title Node.js versiyalari hayoti (2026-10 holati)
dateFormat YYYY-MM-DD
axisFormat %Y
section Node 22
Faol LTS :a1, 2024-10-29, 2025-10-21
Xizmat (Maintenance) :a2, 2025-10-21, 2027-04-30
section Node 24
Current :b0, 2025-05-06, 2025-10-28
Faol LTS :b1, 2025-10-28, 2026-10-20
Xizmat :b2, 2026-10-20, 2028-04-30
section Node 26
Current :c0, 2026-05-05, 2026-10-28
Faol LTS :c1, 2026-10-28, 2027-10-20
Xizmat :c2, 2027-10-20, 2029-04-30
section Node 27
Alpha :d0, 2026-10-28, 2027-04-22
Current :d1, 2027-04-22, 2027-10-20
LTS :d2, 2027-10-20, 2030-04-30Diagrammadan uchta xulosa chiqadi:
- Node 20 — 2026-yil 30-aprelda EOL bo'ldi. Diagrammada u yo'q, chunki uni endi ishlatmaslik kerak.
- Node 24 — hozir faol LTS. 2026-yil 20-oktabrda xizmat bosqichiga o'tadi, lekin xavfsizlik tuzatishlari 2028-yil 30-aprelgacha chiqadi.
- Node 26 — 2026-yil 28-oktabrda LTS bo'ladi. Shu kuni yangi Node 27 ning Alpha (sinov) bosqichi boshlanadi.
Node 27 dan jadval o'zgaradi: yiliga bitta katta versiya (aprelda), har biri oktabrda LTS bo'ladi, toq/juft farqi yo'qoladi. Versiya raqami yilga mos keladi: 27 — 2027, 28 — 2028. Avvalgi toq versiyalarning o'rnini 6 oylik Alpha kanali egallaydi.
Tekshirib ko'ring: 2026-yil noyabrda yangi loyiha boshlayapsiz. Node 24 ni tanlaysizmi yoki 26 ni?
Javob
Ikkalasi ham to'g'ri tanlov bo'lishi mumkin, lekin 26 uzoqroq yashaydi: u 28-oktabrdan LTS, xavfsizlik tuzatishlari 2029-yil aprelgacha. Node 24 esa noyabrda allaqachon xizmat bosqichida bo'ladi. Muhimi — kutubxonalaringiz yangi versiyani qo'llashini tekshirish (pastdagi engines bo'limi shu haqda). vazifalar hozircha 24 da qoladi: bugun (2026-10-07) u faol LTS.
3. Versiya menejeri
3.1 U qanday ishlaydi
Rasmiy o'rnatuvchi Node'ni bitta papkaga qo'yadi (Windows'da C:\Program Files\nodejs) va uni PATH ga yozadi. Terminal node so'zini ko'rsa, PATH'dagi papkalarni tartib bilan ko'rib chiqadi va birinchi topilganini ishga tushiradi. Bitta papka — bitta versiya.
Versiya menejeri (version manager) — bir nechta Node'ni o'z papkasida saqlaydigan va PATH'dagi node ni kerakli versiyaga yo'naltiradigan dastur. O'xshatish: kalitlar shkafi. Har xona (loyiha) uchun alohida kalit osilgan, navbatchi (menejer) siz qaysi eshik oldida turganingizga qarab kerakli kalitni beradi.
3.2 Menejerlar: 2026-yil oktabr holati
Versiyalarni GitHub relizlaridan tekshirdik (2026-10-07):
| Menejer | Qayerda ishlaydi | Oxirgi versiya | Holati |
|---|---|---|---|
| fnm | Windows, macOS, Linux | 1.39.0 (2026-03-06) | Faol, Rust'da, tez |
| nvm-windows | Faqat Windows | 2.0.1 (2026-10-02) | Faol, 2026-yil sentabrda to'liq qayta yozildi |
| nvm | macOS, Linux, WSL | 0.40.8 (2026-09-21) | Faol, eng eski va mashhur |
| Volta | Hammasi | 2.0.2 (2024-12-05) | Qo'llab-quvvatlanmaydi (2025-11 dan) |
| mise | Hammasi | 2026.10.3 (2026-10-05) | Faol, Volta mualliflari tavsiya qiladi |
Bu kursda Windows 11 + Git Bash asosiy muhit, shuning uchun amaliyot fnm bilan: u Windows'da ham, macOS/Linux'da ham bir xil ishlaydi va .nvmrc ni o'zi o'qiydi. Qolganlarini ham ko'rib chiqamiz — begona loyihada ularni albatta uchratasiz.
4. fnm bilan amaliyot
4.1 O'rnatish va sozlash
O'rnatish va shell sozlamasini Node o'rnatish darsida qisqa ko'rgan edik. Eslatma:
winget install Schniz.fnmGit Bash uchun ~/.bashrc oxiriga bitta qator:
eval "$(fnm env --use-on-cd --shell bash)"PowerShell uchun — $PROFILE fayliga (fnm README'sidagi qator, telefonga sig'ishi uchun ikkiga bo'lingan):
fnm env --use-on-cd --shell powershell |
Out-String | Invoke-Expressionfnm env shell'ga kerakli muhit o'zgaruvchilarini va PATH'ni beradi. --use-on-cd esa cd buyrug'ini "o'rab oladi": har cd dan keyin fnm papkada .nvmrc, .node-version yoki package.json bor-yo'qligini tekshiradi.
Diqqat: Quyidagi chiqishlar haqiqiy: fnm 1.39.0 ni biz Windows 11 da, Git Bash'da alohida sinov papkasida ishga tushirdik. Kompyuterda oldindan rasmiy o'rnatuvchidan Node 22.17.0 bor edi — xuddi Sardordagidek.
4.2 Bir nechta Node o'rnatish
fnm --version
fnm install 24
fnm install 22
fnm listfnm 1.39.0
Installing Node v24.21.0 (x64)
Installing Node v22.23.3 (x64)
* v22.23.3
* v24.21.0 default
* systemQatorma-qator:
fnm install 24— 24 ning eng yangi tuzatishini o'rnatdi:v24.21.0. Aniq raqam yozish shart emas.- Birinchi o'rnatilgan versiya o'zi
default(sukut bo'yicha) bo'ldi. system— fnm'dan tashqari o'rnatilgan Node (bizda —C:\Program Files\nodejsdagi 22.17.0). fnm uni ko'radi, lekin boshqarmaydi.
Terminalda yuklab olish chizig'i (progress) ham ko'rinadi — u yuqoridagi chiqishda yo'q.
4.3 Versiyalar orasida almashish
node -v
fnm use 22
node -v
fnm default 24
fnm currentv24.21.0
Using Node v22.23.3
v22.23.3
v22.23.3fnm use 22— faqat shu terminal oynasida 22 ga o'tadi. Boshqa oynalar o'zgarmaydi.fnm default 24— yangi oynalar uchun sukut versiya. Hech narsa chiqarmaydi.fnm current— hozir shu oynada qaysi versiya ishlayapti.default24 bo'lsa ham, bu oynadause 22qilganmiz — shuning uchunv22.23.3.
To'ldiring: yangi terminal oynasini ochsangiz, node -v chiqaradi.
4.4 .nvmrc va avtomatik almashish
Ikki papka yaratdik: eski-loyiha/.nvmrc ichida 22, yangi-loyiha/.nvmrc ichida 24. Endi faqat cd qilamiz:
cd eski-loyiha
node -v
cd ../yangi-loyiha
node -vUsing Node v22.23.3
v22.23.3
Using Node v24.21.0
v24.21.0Using Node … qatorini cd ning o'zi chiqardi — buni --use-on-cd qildi. Biz fnm use ni yozmadik.
Sardorning muammosi shunday yechildi. vazifalar da .nvmrc (ichida 24) bor. Sardor fnm'ni o'rnatib, fnm install 24 qildi:
cd vazifalar
node -v
npm -v
npm testUsing Node v24.21.0
v24.21.0
11.19.0
ℹ tests 143
ℹ pass 143
ℹ fail 0(npm test chiqishidan faqat yakuniy qatorlar.) E'tibor bering: npm ham almashdi — 10.9.2 emas, 11.19.0. Har Node versiyasi o'z npm'i bilan keladi.
Tekshirib ko'ring:
.nvmrcichida24, sizda esa faqat Node 22 o'rnatilgan.cdqilsangiz nima bo'ladi?
Javob
fnm xato beradi: versiya o'rnatilmagan. Buni pastdagi «Ko'p uchraydigan xatolar» bo'limida haqiqiy chiqish bilan ko'ramiz. Eng xavflisi — xatodan keyin oldingi versiya ishlayverishi. Tuzatish: fnm install (versiyasiz — .nvmrc dagini o'rnatadi) yoki fnm use --install-if-missing.
5. Boshqa menejerlar
Bu bo'limdagi buyruqlarni biz ishga tushirmadik (global o'rnatish kerak bo'ladi). Ular rasmiy hujjatlardan olingan, havolalar — «Manbalar» bo'limida.
5.1 nvm-windows 2
README'siga ko'ra, Microsoft va Google hujjatlari Windows uchun shu menejerni tavsiya qiladi. 2026-yil 2-sentabrda 2.0.0 chiqdi: dastur Go va Zig'da to'liq qayta yozildi, loyiha nvm-windows/nvm repozitoriysiga ko'chdi. Asosiy yangiliklar:
- Administrator huquqi shart emas.
- Shim rejimi (sukut bo'yicha) —
nodebuyrug'i o'rniga kichik "vositachi" dastur turadi. U har chaqiruvda joriy papkadagi.nvmrc,.node-versionyokipackage.json(engines.node) ni o'qib, kerakli Node'ni ishga tushiradi. Hujjatga ko'ra narxi — har chaqiruvga 25–35 ms. - Yo'q versiyani avtomatik o'rnatish va
nvm pinbuyrug'i — versiyani.nvmrcga yozadi.
nvm install lts
nvm install 24
nvm use 24
nvm list
nvm pin 24 --file=.nvmrcDiqqat: nvm-windows — nvm'ning Windows nusxasi emas. Bu boshqa mualliflarning alohida loyihasi, buyruqlari o'xshash, lekin bir xil emas. 1.x versiyasi faqat nvm use bilan qo'lda almashardi, .nvmrc ni o'qimasdi — eski qo'llanmalarda shunday yozilgan.
5.2 nvm (macOS, Linux, WSL)
Eng eski menejer — shell skripti, Windows'da (WSL'siz) ishlamaydi. O'rnatish — rasmiy skript bilan (README'dagi qator):
curl -o- \
https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.8/install.sh \
| bashnvm install 24
nvm use
nvm alias default 24Versiyasiz nvm use .nvmrc ni qidiradi. U joriy papkadan yuqoriga qarab qidiradi: src/ ichida tursangiz ham loyiha ildizidagini topadi. Avtomatik almashish (cd da) esa nvm'da yo'q — README'dagi qo'shimcha shell kodi bilan qo'shiladi.
5.3 Volta va mise
Volta versiyani .nvmrc ga emas, package.json ga yozardi:
volta pin node@24{
"volta": { "node": "24.21.0" }
}2025-yil 14-noyabrda mualliflar e'lon qildi: "Volta is unmaintained" — "Volta endi qo'llab-quvvatlanmaydi". Bugun ishlayotgani ishlayveradi, lekin yangi Windows yoki macOS chiqqanda buzilsa, tuzatilmaydi. Yangi loyihaga o'rnatmang. Eski loyihada "volta" maydonini ko'rsangiz — ichidagi versiyani .nvmrc ga ko'chiring.
mise — Volta mualliflari tavsiya qilgan vosita. U Node'dan tashqari Python, Go va boshqalarni ham boshqaradi, sozlamani mise.toml ga yozadi (mise use node@24). Muhim farq: mise .nvmrc ni sukut bo'yicha o'qimaydi — buni sozlamada alohida yoqish kerak.
| Vosita | Nimani o'qiydi |
|---|---|
| fnm 1.39 | .node-version, .nvmrc, engines.node |
| nvm-windows 2 | .nvmrc, .node-version, engines.node |
| nvm 0.40 | faqat .nvmrc |
| mise | mise.toml; .nvmrc — yoqilsa |
Jadvaldan xulosa: .nvmrc ni deyarli hamma tushunadi. Shuning uchun vazifalar da aynan shu fayl.
6. .nvmrc ni to'g'ri yozish
6.1 Format
.nvmrc — bitta qatorlik matn fayli: versiya va oxirida qator ko'chishi. nvm hujjatiga ko'ra # dan keyingi izoh va bo'sh qatorlar e'tiborsiz qoladi. Mumkin bo'lgan qiymatlar:
.nvmrc |
Ma'nosi |
|---|---|
24 |
24 ning eng yangi tuzatishi |
24.21.0 (yoki v24.21.0) |
Aynan shu versiya |
lts/* |
Eng yangi LTS — vaqt o'tishi bilan o'zgaradi |
.node-version — xuddi shu vazifadagi fayl, boshqa menejerlar (masalan nodenv) uchun. fnm ikkalasini ham o'qiydi.
6.2 Qaysi birini tanlash
vazifalar da .nvmrc ichida — 24. Nega aynan shu?
24.21.0emas — aniq versiya yozsangiz, har xavfsizlik tuzatishida faylni qo'lda yangilashingiz kerak.24esa CI'da doim eng yangi 24.x ni oladi.lts/*emas — u 2026-yil 28-oktabrda jimgina 26 ga aylanadi. Bundan tashqari, sinovimizda fnm 1.39.0cddalts/*ni o'qiy olmadi (Node 24 o'rnatilgan bo'lsa ham):error: Requested version lts-latest is not currently installed.
Qoida: .nvmrc ga katta versiya raqamini yozing. Versiyani almashtirish — ongli qaror bo'lsin, kalendar qarori emas.
Tekshirib ko'ring: Malika
.nvmrcga24.21.0yozdi. Bir oydan keyin Node 24.22.0 xavfsizlik tuzatishi bilan chiqdi. CI qaysi versiyada ishlaydi?
Javob
24.21.0 da — fayl aynan shuni talab qiladi. Tuzatish CI'ga yetib bormaydi, toki kimdir .nvmrc ni qo'lda o'zgartirmaguncha. 24 yozilganda CI har ishga tushganda eng yangi 24.x ni olardi.
7. engines: npm'ga talab
7.1 engines maydoni
.nvmrc — menejer uchun ko'rsatma: "qaysi versiyani yoqay?". engines — package.json dagi maydon, npm uchun shart: "loyiha qaysi versiyalarda ishlaydi?".
{
"engines": {
"node": ">=24"
}
}">=24" — 24 yoki undan yangi. Versiya diapazonlari (^, ~, ||) — Semver darsida. Kutubxonalar ham engines yozadi. Masalan, npm view vite@8.3.3 engines — { node: '^20.19.0 || >=22.12.0' }: Vite 8 Node 20.19 dan eskisida ishlamaydi.
7.2 Ogohlantirish, xato va jimlik
engines ni sinash uchun alohida papkada kichik loyiha qildik: "name": "bahor-menyu", "engines": { "node": ">=25" } (ataylab — bizda Node 24.21.0) va bitta salom skripti.
Oddiy o'rnatish:
npm installnpm warn EBADENGINE Unsupported engine {
npm warn EBADENGINE package: 'bahor-menyu@1.0.0',
npm warn EBADENGINE required: { node: '>=25' },
npm warn EBADENGINE current: { node: 'v24.21.0', npm: '11.19.0' }
npm warn EBADENGINE }
up to date, audited 1 package in 305ms
found 0 vulnerabilitiesTarjimasi: "qo'llanmaydigan dvigatel: talab — Node 25 yoki yangi, hozir — 24.21.0". warn — ogohlantirish. Buyruq muvaffaqiyatli tugadi (exit 0).
--engine-strict bayrog'i bilan:
npm install --engine-strictnpm error code EBADENGINE
npm error engine Unsupported engine
npm error engine Not compatible with your version of node/npm: bahor-menyu@1.0.0
npm error notsup Not compatible with your version of node/npm: bahor-menyu@1.0.0
npm error notsup Required: {"node":">=25"}
npm error notsup Actual: {"node":"v24.21.0","npm":"11.19.0"}
npm error A complete log of this run can be found in: D:\npm-cache\_logs\2026-10-07T06_07_12_839Z-debug-0.logEndi error va exit 1 — o'rnatish to'xtadi. Oxirgi qatordagi log yo'li sizda boshqacha bo'ladi.
Bayroqni har safar yozmaslik uchun loyiha ildizidagi .npmrc fayliga bitta qator yoziladi — natija xuddi shu xato:
engine-strict=true.npmrc ni alohida darsda to'liq ko'ramiz. vazifalar ga u Ta'minot zanjiri darsida qo'shiladi.
Va eng muhim tuzoq — skriptlar. engines ">=25" turgan holda:
npm run salom> bahor-menyu@1.0.0 salom
> node -e "console.log('Salom', process.version)"
Salom v24.21.0Hech qanday ogohlantirish yo'q. engines faqat o'rnatish paytida tekshiriladi. npm test, npm run build uni umuman o'qimaydi. Sardorning npm test i ham shuning uchun jim yiqildi.
7.3 devEngines — yangi va qat'iyroq
npm 11 devEngines maydonini ham tushunadi. U "dasturchining muhitiga talab" va onFail bilan nima qilishni aytadi ("error", "warn" yoki "ignore"):
{
"devEngines": {
"runtime": {
"name": "node",
"version": ">=25",
"onFail": "error"
}
}
}Sinovda npm install ham, npm run salom ham to'xtadi:
npm error code EBADDEVENGINES
npm error EBADDEVENGINES The developer of this package has specified the following through devEngines
npm error EBADDEVENGINES Invalid devEngines.runtime
npm error EBADDEVENGINES Invalid semver version ">=25" does not match "v24.21.0" for "runtime"
npm error EBADDEVENGINES {
npm error EBADDEVENGINES current: { name: 'node', version: 'v24.21.0' },
npm error EBADDEVENGINES required: { name: 'node', version: '>=25', onFail: 'error' }
npm error EBADDEVENGINES }Tarjimasi: "paket muallifi devEngines orqali talab qo'ygan: >=25 versiyasi v24.21.0 ga mos kelmaydi". Farqni eslab qoling:
npm install |
npm run … |
|
|---|---|---|
engines |
ogohlantirish | tekshirilmaydi |
engines + engine-strict |
xato | tekshirilmaydi |
devEngines (onFail: error) |
xato | xato |
devEngines yangi maydon: npm 10.9 dan beri bor, boshqa paket menejerlari uni hali to'liq qo'llamaydi. vazifalar da biz keng tarqalgan engines + engine-strict juftligini ishlatamiz.
8. Corepack: paket menejerining versiyasi
Node bilan birga npm keladi. pnpm yoki Yarn esa (pnpm darsi) alohida o'rnatiladi. Corepack — Node 24 gacha Node bilan birga keladigan vosita: u package.json dagi "packageManager": "pnpm@…" maydonini o'qib, aynan shu versiyadagi pnpm yoki Yarn'ni ishga tushiradi.
Node 25 dan Corepack Node tarkibidan chiqarildi. Buni fnm o'rnatgan ikki versiya papkasida ko'rdik. Chiqish uzun — ikki ro'yxatda faqat corepack qatorini qidiring:
fnm use 24
ls "$(dirname "$(command -v node)")"
fnm use 26
ls "$(dirname "$(command -v node)")"Using Node v24.21.0
CHANGELOG.md
LICENSE
README.md
corepack
corepack.cmd
install_tools.bat
node.exe
node_modules
nodevars.bat
npm
npm.cmd
npm.ps1
npx
npx.cmd
npx.ps1
Using Node v26.10.0
CHANGELOG.md
LICENSE
README.md
install_tools.bat
node.exe
node_modules
nodevars.bat
npm
npm.cmd
npm.ps1
npx
npx.cmd
npx.ps1Nima bo'ldi? Birinchi ro'yxatda (Node 24.21.0) corepack va corepack.cmd bor (corepack --version — 0.36.0), ikkinchisida (Node 26.10.0) — yo'q. Qolgan fayllar bir xil. Endi u npm paketi sifatida alohida o'rnatiladi. vazifalar npm bilan ishlaydi, shuning uchun bizga Corepack kerak emas.
9. CI ham .nvmrc ni o'qiydi
15-qismdan beri pages.yml da Node versiyasi qo'lda yozilgan: node-version: 24. Endi versiya ikki joyda yashaydi — .nvmrc va pages.yml. Bir kun kimdir bittasini o'zgartiradi, ikkinchisini unutadi.
actions/setup-node (v7) buning uchun node-version-file parametrini beradi. Rasmiy hujjatga ko'ra u .nvmrc, .node-version, .tool-versions, mise.toml yoki package.json ni o'qiy oladi. package.json berilsa, avval volta.node, keyin devEngines.runtime, keyin engines.node ni qidiradi.
- uses: actions/setup-node@v7
with:
node-version-file: .nvmrc
cache: npmEndi versiya bitta joyda: .nvmrc. Uni o'zgartirsangiz, lokal menejer ham, CI ham yangi versiyaga o'tadi.
10. Ko'p uchraydigan xatolar
10.1 Versiya o'rnatilmagan — va siz eski versiyada qoldingiz
.nvmrc ichida 26, Node 26 esa o'rnatilmagan. Oldingi papkada 22 ishlayotgan edi:
cd ../kelajak
node -verror: Requested version v26.x.x is not currently installed
v22.23.3Tarjimasi: "so'ralgan v26.x.x versiyasi o'rnatilmagan". Xavfli tomoni — ikkinchi qator. fnm xato berdi, lekin terminal oldingi papkaning versiyasida qoldi. Xatoni o'tkazib yuborsangiz, 22 da ishlayverasiz. Tuzatish:
fnm use --install-if-missingInstalling Node v26.10.0 (x64)
Using Node v26.10.010.2 Ichki papkada .nvmrc topilmaydi
fnm sukut bo'yicha .nvmrc ni faqat joriy papkada qidiradi (nvm esa yuqoriga qarab). cd eski-loyiha/src qilsangiz:
$ fnm use
error: Can't find version in dotfiles. Please provide a version manually to the command.Tarjimasi: "versiya fayllarida versiya topilmadi — buyruqqa versiyani qo'lda bering". Yechim — fnm env ga --version-file-strategy recursive qo'shish: shunda fnm yuqori papkalardan ham qidiradi. Sinovda cd eski-loyiha/src dan keyin Using Node v22.23.3 chiqdi.
10.3 Eski o'rnatuvchidagi Node PATH'da qolgan
fnm o'rnatildi, lekin C:\Program Files\nodejs o'chirilmadi. Node 26 da (Corepack'siz) corepack --version yozdik — 0.33.0 chiqdi. Qayerdan?
which -a corepack/c/Program Files/nodejs/corepackPATH'da fnm papkasidan keyin eski Node 22.17.0 papkasi turibdi. fnm versiyasida yo'q buyruq u yerdan topildi. Natija — chalkash xatolar. Node o'rnatish darsidagi qoida shuning uchun: menejerga o'tsangiz, rasmiy o'rnatuvchidan qo'yilgan Node'ni o'chiring.
10.4 Ogohlantirishni o'qimaslik
Darsning boshidagi Sardorning xatosi. npm warn EBADENGINE — o'rnatish to'xtamadi, lekin keyin testlar yiqildi. Sariq qatorni ham o'qing. Jamoada esa engine-strict=true bilan uni qizilga aylantiring.
11. Mashqlar
1-mashq (oson): Qaysi versiya ishlaydi?
fnm --use-on-cd bilan sozlangan, default — 24, o'rnatilgan: 22 va 24. Har holatda yangi terminal oynasi loyihalar turgan papkada ochilgan. Bitta cd dan keyin node -v nima chiqaradi?
cd loyiha-a— ichida.nvmrc:22.cd loyiha-a/src—.nvmrcloyiha-ada,src/da yo'q (strategiya — sukut).cd loyiha-b—.nvmrcyo'q,package.jsonda"engines": { "node": "22.x" }.cd loyiha-c—.nvmrc:26(o'rnatilmagan).
Yechim
v22.23.3—.nvmrcdan.v24.21.0— fnmsrc/da fayl topmadi va hech narsani almashtirmadi, default qoldi. Sinovda aynan shunday chiqdi.--version-file-strategy recursivebilan —v22.23.3.v22.23.3— fnm 1.39.nvmrcbo'lmasaengines.nodeni o'qiydi. Sinovda:Using Node v22.23.3.- Avval
error: Requested version v26.x.x is not currently installed, keyinv24.21.0— oldingi versiya qoladi.
2-mashq (o'rta): Ikki loyiha
fnm o'rnatilgan bo'lsa (o'rnatish — Windows'da winget install Schniz.fnm):
- Node 22 va 24 ni o'rnating,
default— 24. kurs/mashqlar/16/02-versiya/ichidaeski/vayangi/papkalarini yarating.eski/.nvmrcga22,yangi/.nvmrcga24yozing.- Ikkala papkaga navbat bilan
cdqilib, har safarnode -vvanpm -vni tekshiring.
Ishora: .nvmrc ni VS Code'da yarating yoki Git Bash'da printf '22\n' > eski/.nvmrc. PowerShell 5.1 dagi echo 22 > fayl faylni UTF-16 da yozadi (matn kodlash darsi) — biz sinagan fnm uni o'qidi, lekin boshqa vositalar o'qimasligi mumkin.
Yechim
fnm install 22
fnm install 24
fnm default 24
cd kurs/mashqlar/16/02-versiya
mkdir eski yangi
printf '22\n' > eski/.nvmrc
printf '24\n' > yangi/.nvmrc
cd eski && node -v && npm -v
cd ../yangi && node -v && npm -vBizda (2026-10-07, haqiqiy chiqish — fnm install qatorlarisiz):
Using Node v22.23.3
v22.23.3
10.9.9
Using Node v24.21.0
v24.21.0
11.19.0Har Node o'z npm'i bilan: 22.23.3 — npm 10.9.9, 24.21.0 — npm 11.19.0. Sizda tuzatish raqamlari yangiroq bo'lishi mumkin.
3-mashq (qiyin): Versiya tekshiruvchi skript
engines skriptlarni tekshirmaydi. O'z tekshiruvchingizni yozing: kurs/mashqlar/16/02-versiya/ da
versiya.mjs— uch funksiya eksport qiladi:readWanted(text)—.nvmrcmatnidan versiyani oladi:#dan keyingisi va bo'sh qatorlar tashlanadi, boshidagivolib tashlanadi; topilmasanull.matches(wanted, current)—"24"faqat katta raqamni,"24.21"— ikkitasini,"24.21.0"— hammasini solishtiradi. Raqam bo'lmasa (lts/*) —false.checkNodeVersion(text, current)—{ ok, message }qaytaradi.
tekshir.mjs— joriy papkadagi.nvmrcni o'qiydi,process.versionbilan solishtiradi, mos kelmasaprocess.exit(1).versiya.test.mjs—node:testbilan kamida 3 ta test.
Ishoralar: process.version — "v24.21.0" ko'rinishidagi satr (Node o'rnatish darsidan). text.split(/\r?\n/) — Windows'dagi \r\n ni ham to'g'ri bo'ladi. every — massivning har elementi shartga mosmi.
Yechim
versiya.mjs:
// versiya.mjs — .nvmrc talabi va joriy Node versiyasi
// .nvmrc matnidan versiya: izoh (#) va bo'sh qatorlar tashlanadi
export function readWanted(text) {
const lines = text
.split(/\r?\n/)
.map((line) => line.replace(/#.*/, "").trim())
.filter((line) => line !== "");
return lines[0]?.replace(/^v/, "") ?? null;
}
// "24" — faqat katta raqam, "24.21" — ikkitasi, "24.21.0" — aniq
export function matches(wanted, current) {
if (!/^\d+(\.\d+){0,2}$/.test(wanted)) return false;
const want = wanted.split(".");
const have = current.replace(/^v/, "").split(".");
return want.every((part, i) => part === have[i]);
}
export function checkNodeVersion(text, current) {
const wanted = readWanted(text);
if (wanted === null) {
return { ok: false, message: ".nvmrc bo'sh" };
}
if (!/^\d+(\.\d+){0,2}$/.test(wanted)) {
return {
ok: false,
message: `"${wanted}" — raqam emas, buni tekshira olmayman`,
};
}
const ok = matches(wanted, current);
const message = ok
? `Node ${current} — .nvmrc talabi (${wanted}) bajarildi`
: `Node ${current}, .nvmrc esa ${wanted} talab qiladi`;
return { ok, message };
}matches("2", "v24.21.0") nega false: satrni "." bo'yicha bo'lib, qism-qism solishtiramiz ("2" va "24" — teng emas). "24.21.0".startsWith("2") deb yozilsa — true chiqib, xato bo'lardi.
tekshir.mjs:
// tekshir.mjs — ishlatish: node tekshir.mjs (papkada .nvmrc bo'lsin)
import { readFileSync } from "node:fs";
import { checkNodeVersion } from "./versiya.mjs";
let text;
try {
text = readFileSync(".nvmrc", "utf8");
} catch {
console.error("✖ .nvmrc topilmadi");
process.exit(1);
}
const result = checkNodeVersion(text, process.version);
if (result.ok) {
console.log(`✔ ${result.message}`);
} else {
console.error(`✖ ${result.message}`);
process.exit(1);
}Ishga tushirish (.nvmrc ichida 24; avval Node 24, keyin rasmiy o'rnatuvchidagi 22.17.0 bilan):
✔ Node v24.21.0 — .nvmrc talabi (24) bajarildi
✖ Node v22.17.0, .nvmrc esa 24 talab qiladiversiya.test.mjs:
// versiya.test.mjs — node --test versiya.test.mjs
import { test } from "node:test";
import assert from "node:assert/strict";
import {
readWanted,
matches,
checkNodeVersion,
} from "./versiya.mjs";
test(".nvmrc dan versiyani o'qish", () => {
assert.equal(readWanted("24\n"), "24");
assert.equal(readWanted("v24.21.0\r\n"), "24.21.0");
assert.equal(readWanted("# Bahor menyusi\n\n22 # eski\n"), "22");
assert.equal(readWanted("\n\n"), null);
});
test("qancha raqam yozilgan bo'lsa, shuncha solishtiriladi", () => {
assert.equal(matches("24", "v24.21.0"), true);
assert.equal(matches("24", "v22.23.3"), false);
assert.equal(matches("24.21", "v24.21.0"), true);
assert.equal(matches("24.20", "v24.21.0"), false);
assert.equal(matches("24.21.0", "v24.21.0"), true);
assert.equal(matches("2", "v24.21.0"), false);
});
test("natija va xabar", () => {
assert.deepEqual(checkNodeVersion("24\n", "v24.21.0"), {
ok: true,
message: "Node v24.21.0 — .nvmrc talabi (24) bajarildi",
});
assert.equal(checkNodeVersion("24\n", "v22.17.0").ok, false);
assert.equal(checkNodeVersion("lts/*\n", "v24.21.0").ok, false);
const empty = checkNodeVersion("", "v24.21.0");
assert.equal(empty.message, ".nvmrc bo'sh");
});ℹ tests 3
ℹ pass 3
ℹ fail 0kurs/mashqlar papkasidan:
git add 16/02-versiya
git commit -m "16/02: .nvmrc tekshiruvchi skript va testlari"4-mashq: Vazifalar qadami — .nvmrc va engines
vazifalar ning Node talabini bir joyga yozamiz: lokal menejer va CI .nvmrc dan, npm esa engines dan o'qisin.
- Branch:
chore/node-versiya - Commit:
chore: .nvmrc va engines — Node 24; CI versiyani .nvmrc dan oladi
- Ildizda
.nvmrc— bitta qator:24. package.jsonoxiriga"engines": { "node": ">=24" }. Nega 24: testlar.tsmodullarni build'siz import qiladi, bu uchun Node'ning type stripping'i kerak. Node 22 da u 22.18.0 dan bor, lekin 22 allaqachon xizmat bosqichida — biz faol LTS'ni talab qilamiz.npm install—package-lock.jsonga hamenginesyoziladi (ildiz paket yozuvi)..github/workflows/pages.yml— ikkala job'danode-version: 24→node-version-file: .nvmrc.- Sinov:
enginesni vaqtincha">=25"qilib,npm civanpm ci --engine-strictni solishtiring. Keyin">=24"ga qaytaring.
Tekshiruv: npm test, npm run build, npm run lint, npm run format:check, npm run tip — hammasi exit 0.
Yechim
.nvmrc:
24package.json (oxiri):
"web-vitals": "6.2.3"
},
"engines": {
"node": ">=24"
}
}package-lock.json — npm install dan keyin ildiz paket yozuviga ("packages": { "": { … } }) xuddi shu uch qator qo'shildi. Qo'lda tahrirlamang.
.github/workflows/pages.yml — check va deploy job'larida bir xil o'zgarish:
- uses: actions/setup-node@v7
with:
node-version-file: .nvmrc
cache: npmSinov — engines: ">=25" (Node 24.21.0, npm 11.19.0, haqiqiy chiqish):
npm cinpm warn EBADENGINE Unsupported engine {
npm warn EBADENGINE package: undefined,
npm warn EBADENGINE required: { node: '>=25' },
npm warn EBADENGINE current: { node: 'v24.21.0', npm: '11.19.0' }
npm warn EBADENGINE }
added 102 packages, and audited 103 packages in 3sFaqat ogohlantirish — paketlar o'rnatildi. package: undefined — vazifalar ning package.json ida version maydoni yo'q; npm 11.19.0 ildiz paket uchun shunday yozadi (yuqoridagi bahor-menyu da name@version chiqqan edi).
npm ci --engine-strictnpm error code EBADENGINE
npm error engine Unsupported engine
npm error engine Not compatible with your version of node/npm: undefined
npm error notsup Not compatible with your version of node/npm: undefined
npm error notsup Required: {"node":">=25"}
npm error notsup Actual: {"node":"v24.21.0","npm":"11.19.0"}To'xtadi. engine-strict ni vazifalar ga hozir yozmaymiz — u Ta'minot zanjiri darsida boshqa sozlamalar bilan birga .npmrc ga tushadi. ">=24" bilan npm ci jim o'tadi.
Natija: npm test — 143/143. 15-qismdagi 159 ta brauzer tekshiruvi (dist/, CSP ostida) — 159/159. Ilova xulqi o'zgarmadi.
Commit va PR:
git switch -c chore/node-versiya
# .nvmrc, package.json, package-lock.json, pages.yml
npm test && npm run build && npm run tip
npm run lint && npm run format:check
git add .nvmrc package.json package-lock.json
git add .github/workflows/pages.yml
git commit -m \
"chore: .nvmrc va engines — Node 24; CI versiyani .nvmrc dan oladi"
git push -u origin chore/node-versiya
gh pr create --fill
gh pr merge --mergeCommit sarlavhasi — 67 belgi (Git qoidasi bo'yicha ≤ 72). Diff: 4 fayl, +9 −2.
12. Real ishda
- Deyarli har ochiq loyihada ildizda
.nvmrcyoki.node-versionbor. Begona repoga kirganda birinchi qiladigan ishingiz — shu faylni ochish vafnm install. - CI — GitHub Actions'da
node-version-file. Ko'p loyiha testlarni bir nechta versiyada ham yuritadi (matritsa): kutubxonaenginesda nimani va'da qilsa, shuni tekshiradi. Buni CI qismida ko'ramiz. - Server va Docker — production'da ham aynan shu versiya bo'lishi kerak. Docker image nomida versiya yoziladi (
node:24) — Docker'ni 33-qismda o'rganamiz, hozir bilish shart emas. - Yangilash — LTS almashganda (har oktabr) jamoa
.nvmrcni ongli ravishda o'zgartiradi, CI'da sinaydi va bitta PR bilan o'tadi. - Intervyu savollari: "LTS nima?", "
.nvmrcvaenginesfarqi?", "enginesni qanday majburiy qilasiz?", "Nega EOL versiyada ishlash xavfli?".
Xulosa
- Node versiyasi to'rt bosqichdan o'tadi: Current → faol LTS → xizmat → EOL. 2026-yil oktabrida faol LTS — 24, 28-oktabrdan — 26; Node 20 — EOL.
- Versiya menejeri bir nechta Node'ni saqlaydi va
nodeni kerakli versiyaga yo'naltiradi: Windows'da fnm yoki nvm-windows 2, macOS/Linux'da fnm yoki nvm. Volta qo'llab-quvvatlanmaydi. .nvmrc— "qaysi versiyani yoqish kerak" (menejer va CI uchun). Ichiga katta raqam yozing:24.engines— "qaysi versiyalarda ishlaydi" (npm uchun). Sukut bo'yicha faqat o'rnatishda ogohlantiradi;engine-strictuni xatoga aylantiradi; skriptlar uni tekshirmaydi.devEngines(onFail: "error") skriptlarni ham to'xtatadi. Corepack Node 25 dan Node tarkibida yo'q.
Keyingi dars: npm buyruqlari chuqur — npm ls, outdated, view, cache va doctor: o'rnatilgan paketlarni ko'rish, tekshirish va muammoni topish.
Manbalar
- Node.js: "Node.js Releases" — nodejs.org/en/about/previous-releases; reliz jadvali — github.com/nodejs/Release (
schedule.json) - Node.js blogi: "Evolving the Node.js Release Schedule" — nodejs.org/en/blog/announcements/evolving-the-nodejs-release-schedule
- fnm — github.com/Schniz/fnm (1.39.0, 2026-03-06)
- NVM for Windows hujjatlari: "What's new in v2", "Operating Modes", "Version Resolution" — docs.nvm-windows.com
- nvm — github.com/nvm-sh/nvm (0.40.8), README: ".nvmrc"
- Volta: "Volta is unmaintained; we recommend migrating to mise" (2025-11-14) — github.com/volta-cli/volta/issues/2080
- mise: "Node" (
.nvmrcva idiomatic version files) — mise.jdx.dev/lang/node.html - npm hujjatlari: "package.json → engines, devEngines", "config → engine-strict" — docs.npmjs.com
- actions/setup-node: "Advanced usage → Node version file" — github.com/actions/setup-node
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!