IlmHamroh
JavaScript Full-stack/16-qism. Frontend asboblari: npm, bundlerlar, config8/48-dars15 daqiqa
Mundarija (29)

Semver va versiya diapazonlari: ^, ~, x, 0.x tuzog'i va prerelease

Qisqacha: Semver — versiyani MAJOR.MINOR.PATCH deb yozish kelishuvi. PATCH — tuzatish, MINOR — yangi imkoniyat, MAJOR — eski kodni buzishi mumkin bo'lgan o'zgarish. package.json dagi ^1.2.3 "2.0.0 gacha hammasi", ~1.2.3 "1.3.0 gacha" degani. 0.x versiyalarda ^ torayadi (^0.2.3 — faqat 0.2.x), beta/rc versiyalar esa oddiy diapazonga umuman kirmaydi.

Bu darsda

  • Semver'ning uch raqami nimani va'da qilishini aytib bera olasiz.
  • ^, ~, x, *, >=, || va oraliq diapazonlarni o'qiysiz va npx semver bilan tekshirasiz.
  • 0.x tuzog'ini taniysiz va Vite'ning esbuild talabini tushuntirasiz.
  • beta, rc versiyalar tartibini va ular nega diapazonga kirmasligini bilasiz.
  • dist-tag, save-exact va npm version bilan ishlaysiz.

Oldin bilishingiz kerak: package.json II: bog'liqlik turlari, npm buyruqlari chuqur, Tag va relizlar.

1. Nega bu kerak?

vazifalar kanoni 2026-10-07 da Vite 8.3.3 bilan yozildi. Ikki kundan keyin Malika o'z loyihasini boshladi va package.json ga "vite": "^8.3.3" yozdi. npm install unga boshqa versiyani berdi. Nega? Registrdan so'raymiz:

bash
npm view vite@"^8.2.0" version
text
vite@8.2.0 '8.2.0'
vite@8.2.1 '8.2.1'
vite@8.2.2 '8.2.2'
vite@8.3.0 '8.3.0'
vite@8.3.1 '8.3.1'
vite@8.3.2 '8.3.2'
vite@8.3.3 '8.3.3'
vite@8.2.4 '8.2.4'
vite@8.3.4 '8.3.4'

8.3.4 — 2026-10-08 da chiqqan (npm view vite time). ^8.3.3 uni ham qabul qiladi, shuning uchun Malikada 8.3.4. Ro'yxat tartiblanmagan: 8.2.4 8.3.3 dan keyin turibdi — registr versiyalarni chiqarilgan vaqti bo'yicha beradi. 8.2.4 — eski qator uchun keyinroq chiqqan tuzatish.

Bu yomonmi? Odatda yo'q: PATCH — faqat tuzatish. Lekin "odatda" — va'da, kafolat emas. Bugun shu va'dani o'qishni o'rganamiz: ^, ~ va boshqa belgilar qaysi yangilanishni o'tkazadi va qaysi birida ehtiyot bo'lish kerak.

Maslahat: Chiqishlar 2026-10-10 da Node 24.21.0, npm 11.19.0 va semver 7.8.5 bilan olingan. Registr ro'yxatlari (versiyalar, teglar) siz o'qiyotgan kuni uzunroq bo'ladi.

2. Uch raqamning va'dasi

2.1 Qoidalar

Tag va relizlar darsida o'z relizlaringizga raqam qo'ygansiz. Endi xuddi shu qoidani boshqalar paketiga qo'llaymiz. semver.org (Semantic Versioning 2.0.0) bo'yicha:

Qism Qachon oshadi Siz uchun ma'nosi
PATCH: 1.4.2 → 1.4.3 xato tuzatildi xotirjam yangilang
MINOR: 1.4.2 → 1.5.0 yangi imkoniyat, eski kod buzilmaydi yangilang, yangilikni o'qing
MAJOR: 1.4.2 → 2.0.0 eski kod buzilishi mumkin changelog'ni o'qib, sinab

MINOR oshganda PATCH nolga tushadi, MAJOR oshganda — ikkalasi ham. "Buzadi" deganda ommaviy API nazarda tutiladi: hujjatlangan funksiyalar, parametrlar, exports eshiklari. Ichki faylni yopish ham MAJOR — kimdir unga ulangan bo'lishi mumkin.

2.2 Va'da kim tomonidan beriladi

Semver — kelishuv, uni hech qanday dastur tekshirmaydi. Muallif PATCH deb chiqargan versiya baribir sizni buzishi mumkin: u xatoni "tuzatgan", siz esa aynan o'sha xatoga tayangan bo'lishingiz mumkin. Shuning uchun semver xavfni kamaytiradi, yo'qotmaydi. Qolganini lock-fayl (Lock-fayllar va npm ci) va testlar qiladi.

npm view versiyani tekshiradi — semver bo'lmagan yozuvni registr qabul qilmaydi (pasport darsidagi Invalid version: "1.0").

3. Diapazonlar

3.1 Tekshirish asbobi: semver paketi

npm'ning o'zi diapazonlarni semver paketi bilan o'qiydi. Uni mashq loyihasiga o'rnatsak, terminalda xuddi npm kabi tekshira olamiz. kurs/mashqlar/16/08-semver/ da:

bash
npm i -D -E semver@7.8.5
text

added 1 package, and audited 2 packages in 2s

found 0 vulnerabilities

npx semver -r "<diapazon>" <versiyalar…> — ro'yxatdan diapazonga moslarini chiqaradi. Hech biri mos kelmasa — hech narsa chiqarmaydi va 1 bilan tugaydi.

3.2 ^ — "MAJOR o'zgarmasin"

bash
npx semver -r "^1.2.3" 1.2.2 1.2.3 1.2.9 1.9.0 2.0.0
text
1.2.3
1.2.9
1.9.0

^1.2.3 — 1.2.3 dan boshlab, 2.0.0 dan oldingacha. 1.2.2 — juda eski, 2.0.0 — yangi MAJOR. npm npm i da sukut bo'yicha shu belgini yozadi.

3.3 ~ — "MINOR ham o'zgarmasin"

bash
npx semver -r "~1.2.3" 1.2.3 1.2.9 1.9.0 2.0.0
text
1.2.3
1.2.9

~1.2.3 — 1.2.x qatori, 1.3.0 dan oldingacha. Ehtiyotkorroq: faqat tuzatishlar keladi.

3.4 Boshqa yozuvlar

Yozuv Ma'nosi Sinov (npx semver -r)
1.2.3 aynan shu faqat 1.2.3
1.x yoki 1 1-qator hammasi 1.0.0, 1.9.9 (2.0.0 emas)
* yoki "" har qanday 0.1.0, 9.9.9
>=1.2.0 <1.5.0 ikki chegara (bo'sh joy — "va") 1.2.0, 1.4.9
Yozuv Ma'nosi Sinov (npx semver -r)
^1.0.0 || ^2.0.0 "yoki" 1.5.0, 2.3.0 (3.0.0 emas)
1.2.3 - 1.4 oraliq, ikki uchi ham kiradi 1.2.3, 1.4.9 (1.5.0 emas)
latest, next teg (diapazon emas) «Teglar» bo'limida

Har sinov qatori npx semver ning haqiqiy chiqishi. Qiziq holat — 1.2.3 - 1.4: oxiri to'liq yozilmagan, shuning uchun 1.4.x ning hammasi kiradi.

|| ni siz bog'liqlik turlari darsida ko'rgansiz: typescript-eslint ning eslint: '^8.57.0 || ^9.0.0 || ^10.0.0' talabi. Plaginlar shunday qilib bir nechta MAJOR'ni qo'llab-quvvatlaydi.

flowchart LR
  A["1.2.3"] --> B["1.2.9<br/>PATCH"]
  B --> C["1.9.0<br/>MINOR"]
  C --> D["2.0.0<br/>MAJOR"]
  T["~1.2.3"] -.-> B
  K["^1.2.3"] -.-> C
  E["1.2.3 aniq"] -.-> A

Sxemada: har belgi qaysi yangilanishgacha yetib boradi. ~ — PATCH gacha, ^ — MINOR gacha, aniq versiya — joyida.

Tekshirib ko'ring: "prettier": "~3.9.0". Registrda 3.9.9, 3.10.0 va 4.0.0 bor. npm install (lock-faylsiz) qaysi birini o'rnatadi?

Javob

3.9.9. ~3.9.0 — 3.9.x qatori, 3.10.0 MINOR o'zgargani uchun kirmaydi. npm diapazonga mos versiyalardan eng yangisini tanlaydi — npm outdated dagi Wanted ustuni ham aynan shu (npm buyruqlari).

4. 0.x tuzog'i

4.1 Nolinchi MAJOR

0.x.y — "paket hali barqaror emas" degani. semver.org: "MAJOR nol bo'lsa, hamma narsa istalgan vaqtda o'zgarishi mumkin". npm buni hisobga oladi va ^ ni toraytiradi:

bash
npx semver -r "^0.2.3" 0.2.3 0.2.9 0.3.0 1.0.0
text
0.2.3
0.2.9
bash
npx semver -r "^0.0.3" 0.0.3 0.0.4
text
0.0.3

Qoida: ^ chapdan birinchi noldan farqli raqamni qotiradi. ^1.2.3 da — 1, ^0.2.3 da — 2, ^0.0.3 da — 3. Shuning uchun 0.x paketda ^0.2.3 amalda ~0.2.3 kabi, ^0.0.3 esa aniq versiya kabi ishlaydi.

4.2 Haqiqiy misol: Vite va esbuild

esbuild — mashhur va keng ishlatiladigan bundler, lekin uning versiyasi 2026-10 holatiga hali 0.28.2. Vite 8.3.3 ning ixtiyoriy peer talabi (bog'liqlik turlari):

text
esbuild: '^0.27.0 || ^0.28.0'

Nega ||? Chunki ^0.27.0 0.28 ni o'z ichiga olmaydi — esbuild uchun 0.27 → 0.28 MAJOR o'tishga teng. Vite jamoasi ikkala qatorni sinab, ikkalasini ham ochiq yozgan. 0.29 chiqsa, Vite uni yangi versiyada qo'shadi.

Xulosa: 0.x paket o'rnatganda package.json dagi ^0.… yozuvi "kichik yangilanishlar ham kelaveradi" degani emas. Va'dasiz paket — ehtiyot bo'ling, aniq versiya yozing.

Tekshirib ko'ring: "nanoid": "^0.2.3" deb yozilgan (o'ylab topilgan holat). Registrda 0.2.10 va 0.3.0 chiqdi. Qaysi biri o'rnatiladi?

Javob

0.2.10. MAJOR nol bo'lgani uchun ^ MINOR'ni (2) qotiradi: 0.2.x ning eng yangisi. 0.3.0 — 0.x dunyosida "buzuvchi" yangilanish. E'tibor bering: 0.2.10 > 0.2.9 — raqamlar matn emas, son sifatida solishtiriladi.

5. Prerelease: beta, rc, canary

5.1 Tartib

Prerelease (reliz oldi) versiya — - dan keyin yorliq: 2.0.0-beta.1, 7.0.1-rc. U o'sha uch raqamli relizdan oldin turadi. semver versiyalarni o'sish tartibida chiqaradi:

bash
npx semver 1.2.3-beta.1 1.2.3-beta.10 1.2.3-rc.1 1.2.3 1.2.3-alpha
text
1.2.3-alpha
1.2.3-beta.1
1.2.3-beta.10
1.2.3-rc.1
1.2.3

Uch qoida ko'rinib turibdi. Yorliqlar alifbo bo'yicha: alpha < beta < rc ("release candidate" — reliz nomzodi). Nuqtadan keyingi raqamlar son sifatida: beta.10 > beta.1. Prerelease'siz 1.2.3 — eng katta.

5.2 Diapazon prerelease'ni o'tkazmaydi

bash
npx semver -r "^8.3.0" 8.3.3 8.4.0-beta.1 9.0.0-alpha.0
text
8.3.3

8.4.0-beta.1 raqamlar bo'yicha ^8.3.0 ichida, lekin chiqmadi. Qoida: oddiy diapazon sinov versiyalarini hech qachon olmaydi. Siz npm i vite qilganingizda tasodifan beta olmasligingiz shundan. Majburlash mumkin:

bash
npx semver -r "^8.3.0" --include-prerelease 8.3.3 8.4.0-beta.1
text
8.3.3
8.4.0-beta.1

Yoki diapazonni prerelease'dan boshlash: ^8.4.0-beta.0.

bash
npx semver -r "^8.4.0-beta.0" 8.4.0-beta.1 8.4.0 8.5.0-beta.0
text
8.4.0-beta.1
8.4.0

8.4.0 ning keyingi betalari va barqaror relizlar kiradi, boshqa uch raqamning betasi (8.5.0-beta.0) — yo'q. "Shu betani sinayapman, keyin relizga o'taman" degan holat uchun.

5.3 Teglar: latest va boshqalar

npm buyruqlari darsida teglarni (dist-tag) ko'rgansiz. Katta loyihalarda ular ko'p:

bash
npm view react dist-tags
text
{
  beta: '19.0.0-beta-26f2496093-20240514',
  rc: '19.0.0-rc.1',
  next: '19.3.0-canary-d5736f09-20260507',
  backport: '19.0.8',
  latest: '19.3.0',
  experimental: '0.0.0-experimental-b618bbb4-20261007',
  canary: '19.3.0-canary-b618bbb4-20261007'
}
Teg Ma'nosi
latest npm i react beradigan versiya — barqaror
next, canary keyingi versiyaning kundalik yig'ilishi
rc, beta reliz oldi sinovi
backport eski qator uchun tuzatish (19.0.x)

canary (kanareyka) — shaxtyorlar zaharli gazni sezish uchun olib tushgan qushdan olingan nom: "birinchi bo'lib sinab ko'radi". experimental versiyasi 0.0.0-… bilan boshlanadi — ^19 kabi diapazonlarga u hech qachon tushmaydi.

Esda tuting: latest — eng katta versiya emas, muallif belgilagan barqaror versiya. Muallif eski qatorga tuzatish chiqarsa (backport), u latest ga tegmaydi. TypeScript'da ham shunday: npm view typescript dist-tags — latest: '7.0.2', next: '7.1.0-dev.20261010.1' (kundalik yig'ilish).

Tekshirib ko'ring: Bobur npm i react@next qildi. package.json ga nima yoziladi va keyingi npm install da u o'zgaradimi?

Javob

Tegning o'zi emas, uning versiyasi yoziladi: "^19.3.0-canary-…" (npm buyruqlari darsidagi nanoid@legacy misoli kabi). Prerelease'dan boshlangan ^ diapazon keyingi barqaror 19.x relizlarni ham qabul qiladi, lekin boshqa canary'larni — yo'q. Lock-fayl bor ekan, npm install hech narsani o'zgartirmaydi.

6. ^ yozilsinmi yoki aniq versiya?

6.1 -E va save-exact

npm buyruqlari darsida ko'rdingiz: npm i -E belgisiz versiya yozadi. vazifalar dagi hamma paket shunday: "vite": "8.3.3", "prettier": "3.9.9". Har safar -E yozmaslik uchun loyihaning .npmrc fayliga save-exact=true qo'yiladi — .npmrc darsida.

6.2 Qaysi biri qachon

Holat Tavsiya Nega
ilova (vazifalar, sayt) aniq versiya + lock nima o'rnatilgani package.json dan ko'rinadi
kutubxona dependencies ^ foydalanuvchida takroriy nusxalar kamayadi
peerDependencies keng ^ va || ko'proq mezbon versiyasi mos keladi
0.x paket aniq versiya ^ deyarli hech narsa bermaydi, va'da ham yo'q

Ilovada ^ yozsangiz ham, lock-fayl versiyani baribir qotiradi. Farq yangilashda: aniq versiyada package.json ning o'zi o'zgaradi va diff'da "8.3.3 → 8.3.4" ko'rinadi. ^ da esa faqat lock o'zgaradi, uni o'qish qiyinroq. Kutubxona esa aniq versiya yozsa, foydalanuvchining loyihasiga bir paketning ikki nusxasini olib kirishi mumkin (node_modules ichida).

7. O'z versiyangizni oshirish: npm version

Kutubxona yozsangiz, versiyani qo'lda o'zgartirish shart emas. Kirish nuqtalari darsidagi bahor-narx ning Git repozitoriysida (version: "1.0.0"):

bash
npm version patch
text
v1.0.1

Uchta ish bajarildi: package.json dagi version 1.0.1 bo'ldi, commit yaratildi (xabari — 1.0.1) va v1.0.1 Git tegi qo'yildi. Xabarni o'zingiz bersangiz, %s versiyaga almashadi:

bash
npm version minor -m "reliz: %s — manti narxi"
text
v1.1.0

Sinov versiyasi:

bash
npm version premajor --preid rc
text
v2.0.0-rc.0

premajor — "keyingi MAJOR ning birinchi sinovi", --preid rc — yorliq. Keyingi npm version prerelease — 2.0.0-rc.1, npm version patch esa prerelease'dan barqaror 2.0.0 ga o'tadi (sinab ko'rdik). Natijada git log --oneline:

text
f59e59d 2.0.0-rc.0
bef8910 reliz: 1.1.0 — manti narxi
fa2f0c8 1.0.1
4ade92d init

Git'dagi kuzatilayotgan fayl o'zgargan bo'lsa, npm to'xtaydi:

text
npm error Git working directory not clean.

"Git ishchi papkasi toza emas" — avval commit qiling. Reliz faqat tayyor koddan yasalsin.

Tekshirib ko'ring: bahor-narx 1.4.2 da. Sardor priceOf ning nomini getPrice ga o'zgartirdi. Qaysi buyruq?

Javob

npm version major → 2.0.0. Funksiya nomi — ommaviy API: eski priceOf ni chaqirayotgan loyihalar sinadi. Yaxshi amaliyot — bir muddat ikkalasini qoldirish (priceOf eskirgan deb belgilab), shunda o'tish MINOR'da bo'ladi va MAJOR keyinroq.

8. Ko'p uchraydigan xatolar

Belgi Sabab Davosi
hamkasbda boshqa versiya ^ + lock-fayl commit qilinmagan lock'ni commit qiling, npm ci
^0.2.3 yangilanmayapti 0.x da ^ torayadi qasddan yangi 0.y ga o'ting
beta o'rnatilmayapti diapazon prerelease'ni olmaydi aniq versiya yoki @beta
ETARGET: No matching version found for vite@^9.0.0. diapazonga mos versiya yo'q npm view vite versions
Belgi Sabab Davosi
npx semver -r jim, chiqish kodi 1 hech biri mos emas diapazonni qayta o'qing
Git working directory not clean npm version va iflos papka commit yoki git stash
latest eng yangisi emas teg qo'lda boshqariladi npm view <nom> dist-tags

9. Mashqlar

Mashqlar kurs/mashqlar/16/08-semver/ da, semver 7.8.5 o'rnatilgan.

1-mashq (oson): Diapazonni o'qing

npx semver dan oldin javob bering, keyin tekshiring:

  • ^2.4.1 — 2.4.0, 2.4.1, 2.9.0, 3.0.0 dan mosi:
  • ~2.4.1 — 2.4.9 yoki 2.5.0:
  • ^0.4.1 — 0.4.9 yoki 0.5.0:
  • ^2.4.1 — 2.5.0-beta.1 mosmi:
Yechim
bash
npx semver -r "^2.4.1" 2.4.0 2.4.1 2.9.0 3.0.0
text
2.4.1
2.9.0

~2.4.1 → 2.4.9; ^0.4.1 → 0.4.9 (0.x da ^ MINOR'ni qotiradi). Oxirgisi — hech narsa chiqmaydi, chiqish kodi 1: prerelease oddiy diapazonga kirmaydi.

2-mashq (o'rta): Plagin uchun peer diapazon

Siz Vite plagini yozyapsiz. U Vite 7 ning 7.1 dan boshlab hamma versiyasida va Vite 8 ning hammasida ishlaydi, Vite 9 da hali sinalmagan. peerDependencies dagi vite qiymatini yozing va npx semver bilan 7.0.9, 7.1.0, 7.9.3, 8.3.4, 9.0.0 da sinang.

Yechim

"vite": "^7.1.0 || ^8.0.0". Sinov:

bash
npx semver -r "^7.1.0 || ^8.0.0" 7.0.9 7.1.0 7.9.3 8.3.4 9.0.0
text
7.1.0
7.9.3
8.3.4

>=7.1.0 yozish xato bo'lardi — u Vite 9 ni ham "mos" deb aytadi, holbuki plagin u bilan sinalmagan. Peer diapazon — "men sinagan versiyalar" ro'yxati.

3-mashq (qiyin): O'z semver'ingiz

kichik-semver.mjs yozing:

  • parse(version) — "1.4.2" → { nums: [1, 4, 2], pre: null }, "2.0.0-rc.1" → pre: "rc.1", noto'g'ri yozuvda null.
  • satisfies(version, range) — range to'rt xil: aniq (1.2.3), ^, ~, >=. Prerelease versiya hech qaysi diapazonga kirmaydi.

kichik-semver.test.mjs da javoblaringizni haqiqiy semver.satisfies bilan ko'p versiyada solishtiring.

Ishoralar: diapazonni ikki chegaraga aylantiring — pastki (kiradi) va yuqori (kirmaydi). ^0.2.3 uchun yuqori chegara 0.3.0 («0.x tuzog'i»). Ikki versiyani raqamma-raqam solishtiring — matn sifatida emas.

Yechim

kichik-semver.mjs:

js
// kichik-semver.mjs — ^, ~, aniq va >= diapazonlarining nusxasi
// (prerelease diapazonlar, ||, x va oraliqlar — semver paketida)

// "1.4.2" yoki "2.0.0-beta.1" → { nums: [1, 4, 2], pre: "beta.1" }
export function parse(version) {
  const re = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/;
  const m = re.exec(version);
  if (m === null) return null;
  return { nums: [+m[1], +m[2], +m[3]], pre: m[4] ?? null };
}

// a < b → manfiy, teng → 0, a > b → musbat (faqat raqamlar)
function compareNums(a, b) {
  for (let i = 0; i < 3; i++) {
    if (a[i] !== b[i]) return a[i] - b[i];
  }
  return 0;
}

// Diapazon → [pastki (kiradi), yuqori (kirmaydi)] chegaralar
function bounds(range) {
  const op = /^[\^~]|^>=/.exec(range)?.[0] ?? "";
  const base = parse(range.slice(op.length));
  if (base === null) return null;
  const [major, minor, patch] = base.nums;
  if (op === "") return [base.nums, [major, minor, patch + 1]];
  if (op === ">=") return [base.nums, [Infinity, 0, 0]];
  if (op === "~") return [base.nums, [major, minor + 1, 0]];
  // ^ — chapdagi birinchi noldan farqli raqam o'zgarmasin
  if (major > 0) return [base.nums, [major + 1, 0, 0]];
  if (minor > 0) return [base.nums, [0, minor + 1, 0]];
  return [base.nums, [0, 0, patch + 1]];
}

export function satisfies(version, range) {
  const v = parse(version);
  const b = bounds(range);
  if (v === null || b === null) return false;
  // prerelease versiya (beta, rc) oddiy diapazonga kirmaydi
  if (v.pre !== null) return false;
  const [low, high] = b;
  const fromLow = compareNums(v.nums, low);
  return fromLow >= 0 && compareNums(v.nums, high) < 0;
}

console.log(satisfies("1.9.0", "^1.2.3")); // true
console.log(satisfies("0.3.0", "^0.2.3")); // false
console.log(satisfies("1.3.0-beta.1", "^1.2.3")); // false

Oxirgi uch qator — sinash uchun. Aniq versiya 1.2.3 ham shu sxemaga tushdi: [1.2.3, 1.2.4) — "kamida 1.2.3, 1.2.4 dan kichik".

kichik-semver.test.mjs:

js
// kichik-semver.test.mjs — natijani haqiqiy semver paketi bilan
// solishtiradi: node --test kichik-semver.test.mjs
import { test } from "node:test";
import assert from "node:assert/strict";
import semver from "semver";
import { parse, satisfies } from "./kichik-semver.mjs";

const ranges = ["^1.2.3", "~1.2.3", "^0.2.3", "^0.0.3", "1.2.3"];
const versions = [
  "1.2.2", "1.2.3", "1.2.9", "1.3.0", "1.9.9", "2.0.0",
  "0.2.3", "0.2.9", "0.3.0", "0.0.3", "0.0.4", "1.3.0-beta.1",
];

test("parse", () => {
  assert.deepEqual(parse("1.4.2"), { nums: [1, 4, 2], pre: null });
  assert.deepEqual(parse("2.0.0-rc.1").pre, "rc.1");
  assert.equal(parse("1.0"), null);
});

test("har diapazon semver paketi bilan bir xil javob beradi", () => {
  for (const range of [...ranges, ">=1.2.3"]) {
    for (const version of versions) {
      assert.equal(
        satisfies(version, range),
        semver.satisfies(version, range),
        `${version} ${range}`,
      );
    }
  }
});
text
ℹ tests 2
ℹ pass 2
ℹ fail 0

72 ta juftlik (6 diapazon × 12 versiya) haqiqiy semver bilan bir xil. Uchinchi argument — xato bo'lsa qaysi juftlik ekanini ko'rsatadi. Haqiqiy semver yana x, ||, oraliqlar va prerelease diapazonlarni biladi — uning manba kodi (ranges/, functions/satisfies.js) o'qishga arziydi (Begona kodni o'qish).

10. Real ishda

  • Yangilash qarori semver'dan boshlanadi: PATCH — avtomatik (Dependabot/Renovate PR'i), MINOR — changelog'ni ko'rib, MAJOR — alohida vazifa (Bog'liqliklarni yangilash strategiyasi).
  • Kutubxona chiqarsangiz — npm version va changelog. Yangi MAJOR'dan oldin rc versiyani next tegi bilan chiqarish odat: npm publish --tag next.
  • 0.x paketlar — loyihada ko'p (esbuild 0.28, ko'p yosh vositalar). Ularni aniq versiyada qotiring.
  • Intervyu: "^ va ~ farqi?", "^0.2.3 qaysi versiyalarni oladi?", "nega npm i beta bermaydi?".

Xulosa

  • MAJOR.MINOR.PATCH: buzuvchi o'zgarish / yangi imkoniyat / tuzatish — bu va'da, kafolat emas.
  • ^ — MAJOR qotadi, ~ — MINOR ham qotadi; x, *, >=, ||, a - b — boshqa yozuvlar; npx semver -r bilan tekshiring.
  • 0.x da ^ chapdagi birinchi noldan farqli raqamni qotiradi: ^0.2.3 = 0.2.x, ^0.0.3 = aynan 0.0.3.
  • Prerelease (-beta.1, -rc.0) reliz oldida turadi va oddiy diapazonga kirmaydi; teglar (latest, next, canary) — versiyaga yorliq.
  • Ilovada aniq versiya + lock, kutubxonada ^, peer'da keng ||.
  • npm version patch|minor|major|premajor — versiya, commit va Git tegi bitta buyruqda.

Keyingi dars: Lock-fayllar va npm ci — diapazon "qaysi versiyalar mumkin" desa, lock-fayl "aynan qaysi biri" deydi: package-lock.json ichi va CI'da nega faqat npm ci.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Semver va versiya diapazonlari: ^, ~, x, 0.x tuzog'i va prerelease — IlmHamroh