IlmHamroh
JavaScript Full-stack/16-qism. Frontend asboblari: npm, bundlerlar, config2/48-dars25 daqiqa
Mundarija (39)

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. .nvmrc menejer va CI'ga qaysi versiyani yoqishni aytadi. package.json dagi engines esa npm'ga qaysi versiyalarda ishlash mumkinligini aytadi. engines sukut bo'yicha faqat ogohlantiradi — to'xtatish uchun engine-strict=true kerak.

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; .nvmrc bo'yicha avtomatik almashishni sozlaysiz.
  • nvm-windows, nvm, Volta va mise farqini va 2026-yildagi holatini bilasiz.
  • engines, engine-strict va devEngines nimani to'xtatishini, nimani to'xtatmasligini ko'rsatasiz.
  • vazifalar ga .nvmrc va engines qo'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:

bash
npm ci
text
npm 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 vulnerabilities

Sariq ogohlantirish chiqdi, lekin paketlar o'rnatildi. Sardor ogohlantirishni o'qimadi — ko'pchilik o'qimaydi. Keyin testlar:

bash
npm test
text
TypeError [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:

  1. Versiya menejeri — Sardor bir buyruq bilan kerakli Node'ga o'tadi.
  2. .nvmrc — loyiha "menga Node 24 kerak" deb o'zi aytadi; menejer ham, CI ham shu faylni o'qiydi.
  3. 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-30

Diagrammadan 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:

bash
winget install Schniz.fnm

Git Bash uchun ~/.bashrc oxiriga bitta qator:

bash
eval "$(fnm env --use-on-cd --shell bash)"

PowerShell uchun — $PROFILE fayliga (fnm README'sidagi qator, telefonga sig'ishi uchun ikkiga bo'lingan):

powershell
fnm env --use-on-cd --shell powershell |
  Out-String | Invoke-Expression

fnm 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

bash
fnm --version
fnm install 24
fnm install 22
fnm list
text
fnm 1.39.0
Installing Node v24.21.0 (x64)

Installing Node v22.23.3 (x64)

* v22.23.3
* v24.21.0 default
* system

Qatorma-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\nodejs dagi 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

bash
node -v
fnm use 22
node -v
fnm default 24
fnm current
text
v24.21.0
Using Node v22.23.3
v22.23.3
v22.23.3
  • fnm 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. default 24 bo'lsa ham, bu oynada use 22 qilganmiz — shuning uchun v22.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:

bash
cd eski-loyiha
node -v
cd ../yangi-loyiha
node -v
text
Using Node v22.23.3
v22.23.3
Using Node v24.21.0
v24.21.0

Using 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:

bash
cd vazifalar
node -v
npm -v
npm test
text
Using 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: .nvmrc ichida 24, sizda esa faqat Node 22 o'rnatilgan. cd qilsangiz 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) — node buyrug'i o'rniga kichik "vositachi" dastur turadi. U har chaqiruvda joriy papkadagi .nvmrc, .node-version yoki package.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 pin buyrug'i — versiyani .nvmrc ga yozadi.
bash
nvm install lts
nvm install 24
nvm use 24
nvm list
nvm pin 24 --file=.nvmrc

Diqqat: 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):

bash
curl -o- \
  https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.8/install.sh \
  | bash
bash
nvm install 24
nvm use
nvm alias default 24

Versiyasiz 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:

bash
volta pin node@24
json
{
  "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.0 emas — aniq versiya yozsangiz, har xavfsizlik tuzatishida faylni qo'lda yangilashingiz kerak. 24 esa 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.0 cd da lts/* 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 .nvmrc ga 24.21.0 yozdi. 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?".

json
{
  "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:

bash
npm install
text
npm 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 vulnerabilities

Tarjimasi: "qo'llanmaydigan dvigatel: talab — Node 25 yoki yangi, hozir — 24.21.0". warn — ogohlantirish. Buyruq muvaffaqiyatli tugadi (exit 0).

--engine-strict bayrog'i bilan:

bash
npm install --engine-strict
text
npm 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.log

Endi 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:

ini
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:

bash
npm run salom
text
> bahor-menyu@1.0.0 salom
> node -e "console.log('Salom', process.version)"

Salom v24.21.0

Hech 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"):

json
{
  "devEngines": {
    "runtime": {
      "name": "node",
      "version": ">=25",
      "onFail": "error"
    }
  }
}

Sinovda npm install ham, npm run salom ham to'xtadi:

text
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:

bash
fnm use 24
ls "$(dirname "$(command -v node)")"
fnm use 26
ls "$(dirname "$(command -v node)")"
text
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.ps1

Nima 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.

yaml
      - uses: actions/setup-node@v7
        with:
          node-version-file: .nvmrc
          cache: npm

Endi 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:

bash
cd ../kelajak
node -v
text
error: Requested version v26.x.x is not currently installed
v22.23.3

Tarjimasi: "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:

bash
fnm use --install-if-missing
text
Installing Node v26.10.0 (x64)

Using Node v26.10.0

10.2 Ichki papkada .nvmrc topilmaydi

fnm sukut bo'yicha .nvmrc ni faqat joriy papkada qidiradi (nvm esa yuqoriga qarab). cd eski-loyiha/src qilsangiz:

text
$ 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?

bash
which -a corepack
text
/c/Program Files/nodejs/corepack

PATH'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?

  1. cd loyiha-a — ichida .nvmrc: 22.
  2. cd loyiha-a/src — .nvmrc loyiha-a da, src/ da yo'q (strategiya — sukut).
  3. cd loyiha-b — .nvmrc yo'q, package.json da "engines": { "node": "22.x" }.
  4. cd loyiha-c — .nvmrc: 26 (o'rnatilmagan).
Yechim
  1. v22.23.3 — .nvmrc dan.
  2. v24.21.0 — fnm src/ da fayl topmadi va hech narsani almashtirmadi, default qoldi. Sinovda aynan shunday chiqdi. --version-file-strategy recursive bilan — v22.23.3.
  3. v22.23.3 — fnm 1.39 .nvmrc bo'lmasa engines.node ni o'qiydi. Sinovda: Using Node v22.23.3.
  4. Avval error: Requested version v26.x.x is not currently installed, keyin v24.21.0 — oldingi versiya qoladi.

2-mashq (o'rta): Ikki loyiha

fnm o'rnatilgan bo'lsa (o'rnatish — Windows'da winget install Schniz.fnm):

  1. Node 22 va 24 ni o'rnating, default — 24.
  2. kurs/mashqlar/16/02-versiya/ ichida eski/ va yangi/ papkalarini yarating. eski/.nvmrc ga 22, yangi/.nvmrc ga 24 yozing.
  3. Ikkala papkaga navbat bilan cd qilib, har safar node -v va npm -v ni 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
bash
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 -v

Bizda (2026-10-07, haqiqiy chiqish — fnm install qatorlarisiz):

text
Using Node v22.23.3
v22.23.3
10.9.9
Using Node v24.21.0
v24.21.0
11.19.0

Har 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) — .nvmrc matnidan versiyani oladi: # dan keyingisi va bo'sh qatorlar tashlanadi, boshidagi v olib tashlanadi; topilmasa null.
    • 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 .nvmrc ni o'qiydi, process.version bilan solishtiradi, mos kelmasa process.exit(1).
  • versiya.test.mjs — node:test bilan 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:

js
// 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:

js
// 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):

text
✔ Node v24.21.0 — .nvmrc talabi (24) bajarildi
✖ Node v22.17.0, .nvmrc esa 24 talab qiladi

versiya.test.mjs:

js
// 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");
});
text
ℹ tests 3
ℹ pass 3
ℹ fail 0

kurs/mashqlar papkasidan:

bash
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
  1. Ildizda .nvmrc — bitta qator: 24.
  2. package.json oxiriga "engines": { "node": ">=24" }. Nega 24: testlar .ts modullarni 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.
  3. npm install — package-lock.json ga ham engines yoziladi (ildiz paket yozuvi).
  4. .github/workflows/pages.yml — ikkala job'da node-version: 24 → node-version-file: .nvmrc.
  5. Sinov: engines ni vaqtincha ">=25" qilib, npm ci va npm ci --engine-strict ni 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:

text
24

package.json (oxiri):

json
    "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:

yaml
      - uses: actions/setup-node@v7
        with:
          node-version-file: .nvmrc
          cache: npm

Sinov — engines: ">=25" (Node 24.21.0, npm 11.19.0, haqiqiy chiqish):

bash
npm ci
text
npm 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 3s

Faqat 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).

bash
npm ci --engine-strict
text
npm 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:

bash
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 --merge

Commit sarlavhasi — 67 belgi (Git qoidasi bo'yicha ≤ 72). Diff: 4 fayl, +9 −2.

12. Real ishda

  • Deyarli har ochiq loyihada ildizda .nvmrc yoki .node-version bor. Begona repoga kirganda birinchi qiladigan ishingiz — shu faylni ochish va fnm install.
  • CI — GitHub Actions'da node-version-file. Ko'p loyiha testlarni bir nechta versiyada ham yuritadi (matritsa): kutubxona engines da 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 .nvmrc ni ongli ravishda o'zgartiradi, CI'da sinaydi va bitta PR bilan o'tadi.
  • Intervyu savollari: "LTS nima?", ".nvmrc va engines farqi?", "engines ni 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 node ni 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-strict uni 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" (.nvmrc va 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
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Node versiya menejerlari: nvm, fnm, Volta va .nvmrc — IlmHamroh