IlmHamroh
JavaScript Full-stack/16-qism. Frontend asboblari: npm, bundlerlar, config17/48-dars20 daqiqa
Mundarija (32)

Bog'liqliklarni yangilash strategiyasi: npm outdated, ncu, changelog, Renovate va Dependabot

Qisqacha: Paketlarni yangilamaslik ham, hammasini birdan yangilash ham xavfli. To'g'ri yo'l — muntazam va kichik qadamlar: npm outdated yoki npx npm-check-updates bilan nima eskirganini ko'rish, PATCH va MINOR'ni guruhlab bitta PR'da, har MAJOR'ni esa changelog o'qib, testlar bilan alohida yangilash. Bu ishni GitHub'da Dependabot yoki Renovate avtomatik PR'lar bilan qiladi; sizning vazifangiz — PR'ni tekshirib, testlar yashil bo'lsa qabul qilish.

Bu darsda

  • npm outdated va npm-check-updates (ncu) chiqishidan yangilash rejasini tuzasiz.
  • CHANGELOG va release notes'dan breaking change'ni topasiz.
  • MAJOR yangilashni xavfsiz bajarasiz: avval kod, keyin versiya, keyin test.
  • Codemod nima ekanini va uning chegarasini bilasiz.
  • Dependabot va Renovate config'ini o'qiy olasiz: guruhlar, jadval, kutish muddati.

Oldin bilishingiz kerak: npm buyruqlari chuqur, Semver va versiya diapazonlari, Lock-fayllar va npm ci, Ta'minot zanjiri xavfsizligi.

1. Nega bu kerak?

Oldingi darsda ko'rdik: eski nanoid da zaiflik bor, tuzatish esa yangi versiyada. Demak, yangilamaslik — xavf. Lekin chalk hodisasi boshqa narsani ham ko'rsatdi: eng yangi versiya ham xavfli bo'lishi mumkin. Ikki xavf o'rtasida yo'l kerak.

Sardor «Bahor» uchun ikki yil oldin yozilgan menyu loyihasini oldi. Unda eslint 9.0.0, prettier 3.0.0, nanoid 3.3.20. Jasur aka: "Hammasini yangila, xavfsiz bo'lsin" dedi. Sardor npx npm-check-updates -u ni bosdi, keyin npm install — va testlar qizil. Qaysi paket buzdi? To'rttasi birdan o'zgargan, bilib bo'lmaydi.

Bu darsda Sardorning muammosini bosqichma-bosqich yechamiz. Hayotiy o'xshatish: mashinaning moyini har 10 000 km da almashtirsangiz — 15 daqiqalik ish. Besh yil almashtirmasangiz — dvigatel ta'miri. Bog'liqliklar ham shunday: haftada bir kichik yangilash arzon, ikki yilda bir katta "ko'chish" — qimmat va qo'rqinchli.

Maslahat: Darsdagi chiqishlar 2026-10-10 da Windows 11, Node 24.21.0, npm 11.19.0 va npm-check-updates 23.1.0 bilan sinov papkasida olingan. Siz o'qiyotgan kunda versiyalar boshqacha bo'ladi — buyruqlar va mantiq o'sha.

2. Nima eskirgan?

2.1 npm outdated — takror

npm buyruqlari darsidan bilasiz: npm outdated Current, Wanted va Latest ni ko'rsatadi. Sardorning loyihasida (hamma versiya -E bilan, aniq):

bash
npm outdated
text
Package     Current  Wanted   Latest  Location                 Depended by
eslint        9.0.0   9.0.0  10.12.0  node_modules/eslint      menyu
nanoid       3.3.20  3.3.20    6.0.2  node_modules/nanoid      menyu
picocolors    1.0.0   1.0.0    1.1.1  node_modules/picocolors  menyu
prettier      3.0.0   3.0.0   3.9.10  node_modules/prettier    menyu

Aniq versiyada Wanted doim Current ga teng — npm update hech narsa qilmaydi. Yangilash faqat ongli qaror bilan bo'ladi. Bu yaxshi, lekin bitta savolga javob yo'q: qaysi yangilash xavfsiz, qaysi biri xavfli?

2.2 npm-check-updates: turlarga ajratilgan ro'yxat

npm-check-updates (qisqasi ncu) — package.json dagi har paketning yangi versiyasini topib, uni semver turiga qarab guruhlaydigan vosita. O'rnatish shart emas, npx bilan:

bash
npx npm-check-updates@23.1.0
text
Checking …\menyu\package.json


Minor   Backwards-compatible features
 picocolors  1.0.0  →   1.1.1
 prettier    3.0.0  →  3.9.10

Major   Potentially breaking API changes
 eslint   9.0.0  →  10.12.0
 nanoid  3.3.20  →    6.0.2

Run npx npm-check-updates -u to upgrade package.json

Guruh nomlari tarjimasi: "Minor — orqaga mos yangi imkoniyatlar", "Major — API'ni buzishi mumkin bo'lgan o'zgarishlar". Bu semver qoidasining o'zi: MAJOR raqam o'zgarsa, muallif "eski kodingiz ishlamasligi mumkin" deb ogohlantirmoqda.

npm outdated dan farqi: ncu faqat ko'rsatmaydi, -u bilan package.json ni ham o'zgartiradi. Lekin node_modules ga tegmaydi — keyin npm install kerak.

2.3 Foydali bayroqlar

Faqat xavfsizroq yangilashlar — --target minor (MAJOR'dan oshmaydi):

bash
npx npm-check-updates@23.1.0 --target minor
text
Checking …\menyu\package.json


Minor   Backwards-compatible features
 eslint      9.0.0  →  9.39.5
 picocolors  1.0.0  →   1.1.1
 prettier    3.0.0  →  3.9.10

Run npx npm-check-updates --target minor -u to upgrade package.json

ESLint ham ro'yxatga kirdi — 9.x qatorining oxirgisi 9.39.5. Ya'ni "10 ga o'tish qo'rqinchli" bo'lsa ham, 9 ning ichida 39 ta MINOR versiya kutib turibdi.

Oldingi darsdagi "yangi versiyani kutib tur" g'oyasi ncu'da ham bor — --cooldown (kunlarda):

bash
npx npm-check-updates@23.1.0 --cooldown 7
text
Checking …\menyu\package.json


Minor   Backwards-compatible features
 picocolors  1.0.0  →  1.1.1
 prettier    3.0.0  →  3.9.9  [cooldown] 3.9.10

Major   Potentially breaking API changes
 eslint   9.0.0  →  10.12.0
 nanoid  3.3.20  →    6.0.1  [cooldown] 6.0.2

Run npx npm-check-updates --cooldown 7 -u to upgrade package.json

[cooldown] 3.9.10 — "eng yangisi 3.9.10, lekin u hali 7 kunlik emas, shuning uchun 3.9.9 taklif qilinadi". Prettier 3.9.10 shu kuni (2026-10-10) chiqqan edi.

Bayroq Nima qiladi Sukut bo'yicha (bayroqsiz)
-u package.json ni yangilaydi faqat ko'rsatadi, faylga tegmaydi
--target minor / patch MAJOR (yoki MINOR) dan oshmaydi latest — eng yangi versiya
--cooldown 7 7 kundan yangi versiyani o'tkazib yuboradi kutmaydi (0 kun)
prettier eslint (filtr) faqat shu paketlar hamma paketlar
--doctor birma-bir yangilab, har birida testni yuritadi testni yuritmaydi

Tekshirib ko'ring: npm outdated va ncu ikkalasi ham "eskirgan" deydi. Sardor CI'ga qaysi birini qo'yishi kerak — "eskirgan paket bo'lsa, to'xta" uchun?

Javob

Hech birini. Yangi versiya har kuni chiqadi: CI kod o'zgarmasa ham qizil bo'lib qoladi, bu esa deploy'ni sababsiz to'xtatadi. "Eskirgan" — xato emas, vazifa. Uni avtomatik PR'lar (Dependabot, Renovate — pastda) yoki haftalik qo'lda ko'rib chiqish hal qiladi. CI'da faqat haqiqiy xavf to'xtatadi: testlar, npm audit signatures.

3. Changelog: nima o'zgargan?

3.1 Qayerdan o'qiladi

Changelog (o'zgarishlar ro'yxati) — har versiyada nima o'zgarganini yozib boradigan fayl, odatda CHANGELOG.md. Release notes — GitHub'dagi har versiya sahifasi (Releases), mazmuni o'xshash. Manzilni npm view beradi:

bash
npm view nanoid repository.url
text
git+https://github.com/ai/nanoid.git

Repoda CHANGELOG.md bor. nanoid ning 3 dan 6 gacha bo'lgan yo'li (asl inglizcha matndan qisqa tarjima):

Versiya Sana Asosiy o'zgarish
4.0 2022-06-08 CommonJS olib tashlandi — faqat ESM; Node 10, 12 qo'llanmaydi
5.0 2023-09-12 Web Crypto API ga o'tdi; async API olib tashlandi
6.0 2026-07-12 4 marta tezroq; Node 18 va 20 qo'llanmaydi
6.0.2 2026-10-05 tuzatishlar, bundle kichraydi

Sanalar npm view nanoid time dan. Har MAJOR — breaking change (buzuvchi o'zgarish): eski kod ishlamay qolishi mumkin bo'lgan o'zgarish. Breaking change'lar changelog'da odatda "Removed", "Breaking", "Dropped support" so'zlari bilan boshlanadi.

3.2 O'z kodingiz bilan solishtirish

Changelog'ni o'qib, o'z kodingizda shu narsalarni qidirasiz. Sardorning buyurtma.js i:

js
// buyurtma.js — «Bahor» buyurtma raqami (nanoid 3 davrida)
import { customAlphabet } from "nanoid";
import { nanoid as nanoidAsync } from "nanoid/async";

const orderNumber = customAlphabet("0123456789", 6);

export async function createOrder(dish) {
  const token = await nanoidAsync(); // kuzatuv havolasi uchun
  return { number: orderNumber(), dish, token };
}

Changelog'dagi uch breaking change'ni tekshiramiz:

  1. "Faqat ESM" 4.0-bob — bizda import, "type": "module". Muammo yo'q.
  2. "async API olib tashlandi" 5.0-bob — bizda bor: nanoid/async.
  3. "Node 18, 20 qo'llanmaydi" 6.0-bob — bizda Node 24. npm view nanoid@6.0.2 engines — { node: '^22 || ^24 || >=26' }. Muammo yo'q.

Demak, bitta joyni o'zgartirish kerak. Uni versiyani ko'tarishdan oldin qilamiz.

3.3 Changelog bo'lmasa

Har paket changelog yuritmaydi. Unda: GitHub Releases sahifasi, ikki versiya orasidagi farq (https://github.com/ai/nanoid/compare/3.3.20...6.0.2 ko'rinishidagi havola), oxirgi chora — paketning package.json idagi exports va engines ni solishtirish (npm view nanoid@6.0.2 exports). Changelog'siz, testsiz va mashhur bo'lmagan paket — Paket tanlash darsidagi "qizil bayroq".

Tekshirib ko'ring: Changelog'da "Removed Node.js 18 and 20 support" yozilgan. Sardorning kodi o'zgarmasa ham, bu uni qayerda qiynashi mumkin?

Javob

Kod emas — muhit. Agar CI yoki server hali Node 20 da bo'lsa, npm ci engines ga mos kelmaydi: engine-strict bilan xato, usiz — ogohlantirish va ehtimol ishlash paytidagi xato. vazifalar da .nvmrc — 24, shuning uchun bizga ta'sir qilmaydi. Lekin har MAJOR'da "qaysi Node kerak?" ni tekshirish odat bo'lsin.

4. MAJOR yangilash: tartib bilan

4.1 Avval testsiz nima bo'lishini ko'ramiz

Sardorda bitta test bor (buyurtma.test.js, node:test bilan): raqam 6 xonali, token 21 belgi. Hozir — yashil. Kodga tegmay, versiyani ko'taramiz:

bash
npm i -E nanoid@6.0.2
npm test
text
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './async' is not defined by "exports" in …\node_modules\nanoid\package.json imported from …\buyurtma.js
…
ℹ tests 1
ℹ pass 0
ℹ fail 1

Uzun chiqishning faqat kerakli qatorlarini qoldirdik. Xato: "'./async' yo'li paketning exports ida belgilanmagan". Kirish nuqtalari darsidan bilasiz: exports — paket tashqariga nimani ochishini aytadigan maydon. 5.0 da async papkasi olib tashlangan.

Test bo'lmaganda bu xato saytda, buyurtma vaqtida chiqardi. Shuning uchun birinchi qoida: testsiz MAJOR yangilash — tavakkal.

4.2 To'g'ri tartib

flowchart TB
  A["changelog: breaking<br/>change'lar ro'yxati"] --> B["kodni moslash<br/>(eski versiyada!)"]
  B --> C["testlar yashil?"]
  C --> D["versiyani ko'tarish<br/>npm i -E paket@yangi"]
  D --> E["testlar, build, lint"]
  E -->|yashil| F["alohida PR"]
  E -->|qizil| B

Diagrammaning eng muhim joyi — ikkinchi to'rtburchak. Kodni eski versiyadayoq moslashtiramiz. Agar shunda testlar yashil bo'lsa, versiyani ko'tarish xavfsiz va har qadamni alohida qaytarish mumkin.

Sinxron nanoid() 3-versiyada ham bor. Demak tuzatish ikki versiyada ham ishlaydi:

js
// buyurtma.js — nanoid 3 da ham, 6 da ham ishlaydi
import { customAlphabet, nanoid } from "nanoid";

const orderNumber = customAlphabet("0123456789", 6);

export async function createOrder(dish) {
  const token = nanoid(); // 5.0 dan beri faqat sinxron
  return { number: orderNumber(), dish, token };
}

Avval nanoid 3.3.20 bilan npm test — pass 1. Keyin npm i -E nanoid@6.0.2 va yana npm test — pass 1. Ikki commit: "refactor: nanoid/async o'rniga sinxron nanoid" va "chore: nanoid 3.3.20 → 6.0.2". Biror narsa buzilsa, qaysi qadamda buzilgani darhol ko'rinadi.

4.3 ncu --doctor: aybdorni topish

Sardorning birinchi xatosiga qaytamiz: hammasi birdan yangilanib, testlar qizil bo'ldi. ncu'ning --doctor rejimi aynan shunday holat uchun. U avval hammasini yangilab ko'radi, yiqilsa — har paketni birma-bir sinaydi. Eski buyurtma.js (async bilan) da sinadik (chiqishdan faqat qadam qatorlari qoldirildi). Uzun chiqishda faqat ✗ va ✓ belgili qatorlarga qarang — qolgani ncu bajargan buyruqlar:

bash
npx npm-check-updates@23.1.0 --doctor -u
text
Running tests before upgrading
npm install
npm run test
Upgrading all dependencies and re-running tests
ncu -u
npm install
npm run test
Tests failed
npm install
npm install --no-save nanoid@6.0.2
npm run test
  ✗ nanoid 3.3.20 → 6.0.2
npm install --no-save picocolors@1.1.1
npm run test
  ✓ picocolors 1.0.0 → 1.1.1
npm install --no-save eslint@10.12.0
npm run test
  ✓ eslint 9.0.0 → 10.12.0
npm install --no-save prettier@3.9.10
npm run test
  ✓ prettier 3.0.0 → 3.9.10
Saving partially upgraded package.json
npm install

Nima bo'ldi? Hammasi birga yangilanganda test yiqildi. Shunda ncu har paketni yolg'iz sinadi: nanoid bilan test qizil (✗), qolgan uchtasi bilan yashil (✓). Natija: package.json da nanoid 3.3.20 qoldi, qolgan uchtasi yangilandi. Aybdor topildi.

Lekin ✓ eslint 9.0.0 → 10.12.0 ga ishonmang. Testlarimiz ESLint'ni umuman ishlatmaydi — --doctor faqat npm test ni yuritadi. ESLint 10 ning o'zi buziladimi, buni testlar bilmaydi. Keyingi bo'limda ko'ramiz: buziladi.

Diqqat: Yashil test — "testlar tekshirgan narsa ishlaydi" degani. --doctor va avtomatik PR'lar testlaringiz qanchalik to'liq bo'lsa, shunchalik foydali. vazifalar da npm run check (format, lint, tip, test) ning hammasi shuning uchun bitta buyruqda (scripts chuqur).

5. Codemod: kodni avtomatik moslash

5.1 ESLint 10 va eski config

Sardorning eski loyihasida ESLint sozlamasi .eslintrc.json faylida. ESLint 10 ni o'rnatib, ishga tushiramiz:

bash
npx eslint .
text
Oops! Something went wrong! :(

ESLint: 10.12.0

ESLint couldn't find an eslint.config.* file.

From ESLint v9.0.0, the default configuration file is now eslint.config.*.
If you are using a .eslintrc.* file, please follow the migration guide
to update your configuration file to the new format:

https://eslint.org/docs/latest/use/configure/migration-guide

"ESLint eslint.config.* faylini topa olmadi. v9.0.0 dan sukut bo'yicha config — eslint.config.*. .eslintrc.* ishlatsangiz, ko'chish qo'llanmasiga qarang". ESLint 9 eski formatni hali o'qir edi, 10 da u butunlay olib tashlangan. Yangi format — ESLint I: flat config darsida.

5.2 Codemod nima

Codemod ("kod modifikatori") — kodni yoki config'ni avtomatik qayta yozadigan dastur. Kutubxona mualliflari MAJOR versiya bilan birga ko'pincha codemod ham chiqaradi: yuzlab faylda bir xil o'zgarishni qo'lda qilish o'rniga, bitta buyruq. Ichida ular kodni AST — daraxt ko'rinishiga o'girib, kerakli tugunlarni almashtiradi.

ESLint'ning rasmiy codemod'i — @eslint/migrate-config (3.0.3):

bash
npx @eslint/migrate-config@3.0.3 .eslintrc.json
text
Migrating .eslintrc.json

Wrote new config to ./eslint.config.mjs

You will need to install the following packages to use the new config:
- globals
- @eslint/js
- @eslint/eslintrc

You can install them using the following command:

npm install globals @eslint/js @eslint/eslintrc -D

Yangi eslint.config.mjs yozildi. Uning ichiga qarasangiz, FlatCompat degan "ko'prik" — eski formatni yangisiga moslaydigan qo'shimcha qatlam va 3 ta yangi paket bor. Ishlaydi, lekin chiroyli emas: qo'lda yozilgan flat config 10 qatorga sig'ardi.

Bu codemod'ning tabiati: u boshlanish nuqtasi, yakun emas. Natijani o'qing, soddalashtiring, testlarni yuriting va diff'ni ko'zdan kechiring. Mashhur codemod'lar: @eslint/migrate-config, React 19 uchun npx codemod react/19/migration-recipe, Next.js uchun npx @next/codemod. Ularni tegishli qismlarda uchratamiz.

Tekshirib ko'ring: --doctor ESLint 10 ni ✓ dedi, lekin npx eslint . yiqildi. Sardor nima qilishi kerak edi, toki bu yangilash testda ushlansa?

Javob

npm test ichiga lint'ni ham qo'shish (yoki --doctorTest "npm run check" bilan doctor'ga to'liq tekshiruvni berish). vazifalar dagi check skripti aynan shunday: format, lint, tip va test. Yangilashni sinaydigan buyruq loyihaning hamma asbobini ishga tushirsin.

6. Avtomatik PR'lar: Dependabot va Renovate

6.1 G'oya

Har hafta ncu ni qo'lda yuritish — unutiladigan ish. GitHub'da buni robotlar qiladi. Ular registrni kuzatadi, yangi versiya chiqsa — branch ochib, package.json va lock'ni yangilab, PR yaratadi. CI testlarni yuritadi. Siz faqat ko'rib chiqasiz va qabul qilasiz.

flowchart LR
  R["registrda<br/>yangi versiya"] --> B["robot: branch<br/>+ lock yangilandi"]
  B --> P["PR: changelog<br/>havolasi bilan"]
  P --> C["CI: npm run check"]
  C -->|yashil| M["siz: ko'rib,<br/>merge"]
  C -->|qizil| X["PR ochiq qoladi"]

Ikki asosiy robot:

Dependabot Renovate
Kimniki GitHub'ning o'zi Mend kompaniyasi, ochiq kod
Sozlash .github/dependabot.yml renovate.json
Xavfsizlik PR'lari ha (alohida, avtomatik) ha
Moslashuvchanlik yetarli juda katta

6.2 Dependabot config

Dependabot sozlamasi repodagi .github/dependabot.yml faylida. GitHub hujjatlaridagi maydonlar bilan vazifalar kabi loyiha uchun namuna:

yaml
# .github/dependabot.yml — har dushanba npm paketlarini tekshir
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    # yangi versiya kamida 7 kun "yashab ko'rsin"; MAJOR — 30 kun
    cooldown:
      default-days: 7
      semver-major-days: 30
    groups:
      # dasturchi asboblarining minor va patch'lari — bitta PR
      asboblar:
        dependency-type: "development"
        update-types: ["minor", "patch"]
    open-pull-requests-limit: 5
Kalit Nima qiladi Sukut
schedule.interval qanchalik tez-tez majburiy (daily, weekly, monthly…)
cooldown yangi versiyani kutish yo'q
groups bir nechta paketni bitta PR'ga har paket — alohida PR
open-pull-requests-limit bir vaqtda ochiq PR soni 5

Guruhlash muhim. Guruhsiz 15 ta dasturchi asbobi 15 ta PR ochadi va jamoa ularni o'qimay qo'yadi. Guruh bilan — bitta "asboblar" PR'i, MAJOR'lar esa baribir alohida keladi. Xavfsizlik tuzatishlari (Dependabot security updates) bu jadvalni kutmaydi: zaiflik e'lon qilinishi bilan PR ochiladi.

6.3 Renovate config

Renovate ko'proq narsani sozlashga imkon beradi. Rasmiy hujjatlardagi kalitlar bilan namuna:

json
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": ["config:recommended"],
  "schedule": ["before 6am on monday"],
  "minimumReleaseAge": "7 days",
  "packageRules": [
    {
      "matchUpdateTypes": ["minor", "patch"],
      "matchDepTypes": ["devDependencies"],
      "groupName": "asboblar",
      "automerge": true
    }
  ]
}
  • config:recommended — tayyor yaxshi sozlamalar to'plami.
  • minimumReleaseAge — oldingi darsdagi kutish g'oyasi.
  • automerge: true — CI yashil bo'lsa, PR'ni o'zi qo'shadi. Faqat dasturchi asboblarining MINOR/PATCH'iga — va faqat testlar kuchli bo'lsa.

Renovate yana bir qulaylik beradi: Dependency Dashboard — repodagi bitta issue, unda hamma kutilayotgan yangilashlar ro'yxati.

Diqqat: automerge — qulay, lekin Ta'minot zanjiri darsini eslang: zararli versiya ham "yashil test" bilan keladi. Shuning uchun minimumReleaseAge va avtomatik qo'shish doim birga ishlatiladi, va faqat brauzerga bormaydigan asboblarga.

6.4 vazifalar va robotlar

vazifalar ga robot qo'shmaymiz. Sabab: bizning pages.yml faqat main ga push'da ishlaydi — robot PR'larini tekshiradigan CI yo'q, testsiz avtomatik PR esa xavfli. Bundan tashqari, kurs kanoni aniq versiyalarga tayanadi. Lekin bugungi holatni qo'lda tekshiramiz:

bash
npm outdated
text
Package   Current  Wanted  Latest  Location               Depended by
prettier    3.9.9   3.9.9  3.9.10  node_modules/prettier  vazifalar

Kanon 2026-10-07 da yozilgan edi, Prettier 3.9.10 esa 2026-10-10 da chiqdi. Changelog'da bitta qator: Markdown jadvallarini tahlil qilish tuzatilgan. PATCH, ESM, engines o'zgarmagan. Sinov nusxasida npm i -D prettier@3.9.10 va npm run check — All matched files use Prettier code style!, ℹ tests 143, ℹ pass 143. Ya'ni yangilash xavfsiz. Kanon esa 3.9.9 da qoladi — kurs bir xil versiyalar bilan davom etishi uchun. Sizning loyihangizda bu yangilashni qilsangiz — to'g'ri ish qilgan bo'lasiz.

7. Strategiya: bir varaqda

Yangilash turi Qanchalik tez-tez Qanday
Xavfsizlik tuzatishi darhol npm audit, robot PR'i
PATCH, MINOR (asboblar) haftada guruhlab bitta PR
PATCH, MINOR (brauzerga boradigan) haftada alohida PR, changelog'ga ko'z
MAJOR rejali, bittadan changelog → kod → versiya → test

Yana uch qoida:

  1. Bitta PR — bitta MAJOR. Ikkitasi birga bo'lsa, qaysi biri buzganini topish qiyin.
  2. Lock-fayl ham commit qilinadi. Yangilash PR'ining asosiy qismi — package-lock.json (Lock-fayllar).
  3. Bog'liq paketlar birga. Masalan, eslint va @eslint/js, yoki vite va uning plaginlari bir vaqtda yangilanadi — ular bir-birining peerDependencies ida.

8. Ko'p uchraydigan xatolar

Xato Oqibati To'g'risi
ncu -u && npm i — hammasi birdan qaysi paket buzgani noma'lum guruhlab, MAJOR alohida
changelog o'qimasdan MAJOR ishlash paytida xato breaking change ro'yxati
ncu -u dan keyin npm install unutildi package.json va node_modules farq qiladi npm install, lock commit
ikki yil yangilamaslik "katta ko'chish", zaifliklar haftalik kichik qadamlar

Uchinchi xatoni npm buyruqlari darsidagi npm ls darhol ko'rsatadi: invalid: "10.12.0" from the root project.

9. Mashqlar

Mashqlar kurs/mashqlar/16/17-yangilash/ da.

1-mashq (oson): Turini ayting

npm outdated qatorlari bo'yicha yangilash turini yozing (patch, minor yoki major):

  • picocolors 1.0.0 → 1.1.1:
  • prettier 3.9.9 → 3.9.10:
  • nanoid 3.3.20 → 6.0.2:
  • esbuild 0.27.0 → 0.28.2:
Yechim

Birinchi uchtasi semver bo'yicha: o'zgargan birinchi raqam turini belgilaydi. To'rtinchisi — tuzoq. Semver darsidan: 0.x versiyalarda MINOR raqam MAJOR kabi ishlaydi, chunki API hali barqaror emas. Shuning uchun ^0.27.0 0.28 ni olmaydi va esbuild'ning har 0.x MINOR'i — changelog o'qiladigan yangilash.

2-mashq (o'rta): Changelog tergovi

Prettier 3.0.0 dan 3.9.10 gacha yangilash rejalashtirilmoqda. npm view prettier repository.url bilan repoga o'ting, CHANGELOG.md ni oching.

  1. Bu MAJOR yangilashmi?
  2. Changelog'da "breaking" so'zi bilan belgilangan bo'lim bormi?
  3. Yangilashdan keyin npm run format:check qizil bo'lishi mumkinmi? Nega?
Yechim
  1. Yo'q — MINOR (3 → 3). Semver bo'yicha API orqaga mos.
  2. MINOR versiyalarda bo'lmasligi kerak — 3.x changelog'ida bo'limlar asosan yangi sintaksis qo'llanishi va formatlash tuzatishlari.
  3. Ha, mumkin. Prettier uchun "API" — buyruqlar va sozlamalar, ular o'zgarmaydi. Lekin formatlash qoidalarining o'zi MINOR'da biroz o'zgarishi mumkin: bir xil kod boshqacha formatlanadi. Shuning uchun Prettier yangilangach npm run format qilinadi va o'zgargan fayllar shu PR'ga qo'shiladi. Rasmiy hujjat ham Prettier'ni aniq versiyada (--save-exact) saqlashni tavsiya qiladi — vazifalar dagi kabi.

3-mashq (qiyin): Yangilash rejasi

reja.mjs yozing. U npm outdated --json chiqishini o'qib, paketlarni turlarga ajratadi va reja chiqaradi: patch va minor — bitta PR guruhida, major — alohida.

  • updateType(from, to) — "patch", "minor" yoki "major". 0.x da MINOR o'zgarishi — "major".
  • makePlan(outdated) — { patch: [...], minor: [...], major: [...] }, har element "nom eski → yangi", har ro'yxat alifbo tartibida.

npm outdated --json ning bir yozuvi:

json
{
  "nanoid": {
    "current": "3.3.20",
    "wanted": "3.3.20",
    "latest": "6.0.2",
    "dependent": "menyu",
    "location": "node_modules/nanoid"
  }
}

Ishoralar: "3.9.10".split(".").map(Number) — [3, 9, 10] (massiv metodlari). Object.entries — kalit va qiymat juftlari. Faylni ishga tushirishda import.meta.main (oldingi dars mashqidagi kabi). Windows'da npm outdated --json > eskirgan.json — npm outdated 1 bilan tugasa ham fayl yoziladi.

Yechim
js
// reja.mjs — npm outdated --json → yangilash rejasi
// "3.0.0" va "3.9.10" → "minor"; MAJOR 0 bo'lsa, minor ham buzadi
export function updateType(from, to) {
  const [a1, b1] = from.split(".").map(Number);
  const [a2, b2] = to.split(".").map(Number);
  if (a1 !== a2) return "major";
  if (b1 !== b2) return a1 === 0 ? "major" : "minor";
  return "patch";
}

export function makePlan(outdated) {
  const plan = { patch: [], minor: [], major: [] };
  for (const [name, info] of Object.entries(outdated)) {
    const type = updateType(info.current, info.latest);
    plan[type].push(`${name} ${info.current} → ${info.latest}`);
  }
  for (const list of Object.values(plan)) list.sort();
  return plan;
}

// npm outdated --json > eskirgan.json; node reja.mjs eskirgan.json
if (import.meta.main) {
  const { readFileSync } = await import("node:fs");
  const file = process.argv[2] ?? "eskirgan.json";
  const plan = makePlan(JSON.parse(readFileSync(file, "utf8")));
  console.log("1-PR (patch + minor, bitta guruh):");
  for (const line of [...plan.patch, ...plan.minor]) {
    console.log(`  ${line}`);
  }
  console.log("Alohida PR (major — changelog o'qing):");
  for (const line of plan.major) console.log(`  ${line}`);
}

Sinov uchun updateType ni tekshiring: "3.9.9"→"3.9.10" — patch, "0.27.0"→"0.28.2" — major. Ikkita test bilan node --test reja.test.mjs — ℹ tests 2, ℹ pass 2, ℹ fail 0. Sardorning loyihasida:

bash
npm outdated --json > eskirgan.json
node reja.mjs eskirgan.json
text
1-PR (patch + minor, bitta guruh):
  picocolors 1.0.0 → 1.1.1
  prettier 3.0.0 → 3.9.10
Alohida PR (major — changelog o'qing):
  eslint 9.0.0 → 10.12.0
  nanoid 3.3.20 → 6.0.2

Bu — Dependabot groups bilan qiladigan ishning kichik nusxasi. Murakkablashtirish: latest o'rniga wanted ham hisobga olinsin yoki -pre, -beta versiyalar alohida ro'yxatga tushsin.

4-mashq: Amaliy tajriba — o'z loyihangizda

O'z vazifalar loyihangizda (yoki portfolio loyihangizda):

  1. npm outdated va npx npm-check-updates@23.1.0 --cooldown 7 ni yuriting, farqini yozing.
  2. Bitta PATCH yoki MINOR yangilashni tanlang: changelog'ini o'qing, yangi branch'da npm i -E paket@versiya, npm run check.
  3. Hammasi yashil bo'lsa — commit sarlavhasi chore: <paket> <eski> → <yangi> (masalan chore: prettier 3.9.9 → 3.9.10).
Yechim

2026-10-10 holatida vazifalar da yagona eskirgan paket — Prettier (3.9.9 → 3.9.10), --cooldown 7 bilan esa ncu hech narsa taklif qilmaydi: 3.9.10 bir kunlik. Bu farqning o'zi — darsning saboqlaridan biri.

Yangilash va tekshiruv:

bash
git switch -c chore/prettier-3.9.10
npm i -D -E prettier@3.9.10
npm run check

npm run check ichida All matched files use Prettier code style! va ℹ pass 143 — yashil. Keyin git add package.json package-lock.json va commit. Agar format:check qizil bo'lsa — npm run format, o'zgargan fayllarni shu commit'ga qo'shing va commit xabarida ayting.

Bu tajriba — mashq: kurs kanoni 3.9.9 da qoladi. Kursning keyingi darslarida chiqishlar bilan solishtirsangiz, versiya farqini hisobga oling.

10. Real ishda

  • Ko'p kompaniyada dushanba kuni Renovate yoki Dependabot PR'lari keladi va jamoadan bittasi ularni "navbatchi" sifatida ko'rib chiqadi.
  • MAJOR migratsiya — alohida vazifa (ticket): React 18 → 19, ESLint 8 → 9 kabi o'tishlar bir necha kun olishi mumkin, codemod va qo'llanma bilan.
  • Intervyu savollari: "Paketlarni qanday yangilaysiz?", "Breaking change'ni qanday aniqlaysiz?", "Dependabot va Renovate farqi?", "Nega hamma paketni birdan yangilamaslik kerak?".

Xulosa

  • Yangilamaslik ham, hammasini birdan yangilash ham xavfli — kichik, muntazam qadamlar arzon.
  • npm outdated — ma'lumot; npx npm-check-updates — semver turiga ajratadi, --target minor, --cooldown, --doctor bilan.
  • MAJOR: changelog'dan breaking change'lar → kodni eski versiyada moslash → versiyani ko'tarish → npm run check → alohida PR.
  • Codemod (@eslint/migrate-config) — boshlanish nuqtasi, natija o'qiladi va soddalashtiriladi.
  • Dependabot (dependabot.yml) va Renovate (renovate.json) — avtomatik PR'lar: guruhlar, jadval, cooldown/minimumReleaseAge; automerge — faqat kuchli testlar bilan.

Keyingi dars: Begona paketni tuzatish: patch-package, overrides va link — kutubxonada xato bor, tuzatish esa hali chiqmagan: uni fork qilmasdan vaqtincha qanday yamash mumkin.

Manbalar

  • npm-check-updates — github.com/raineorshine/npm-check-updates (README: --target, --cooldown, --doctor)
  • GitHub Docs: "Dependabot options reference" (groups, cooldown, schedule, open-pull-requests-limit) — docs.github.com/code-security/dependabot
  • Renovate Docs: "Configuration options" (extends, schedule, minimumReleaseAge, packageRules, automerge), "Dependency Dashboard" — docs.renovatebot.com
  • nanoid CHANGELOG — github.com/ai/nanoid/blob/main/CHANGELOG.md
  • ESLint: "Configuration Migration Guide", @eslint/migrate-config — eslint.org/docs/latest/use/configure/migration-guide
  • Prettier: "Install" (--save-exact tavsiyasi) — prettier.io/docs/install
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Bog'liqliklarni yangilash strategiyasi: npm outdated, ncu, changelog, Renovate va Dependabot — IlmHamroh