IlmHamroh
JavaScript Full-stack/16-qism. Frontend asboblari: npm, bundlerlar, config9/48-dars16 daqiqa
Mundarija (27)

Lock-fayllar va npm ci: package-lock.json ichi, lockfileVersion va konfliktlar

Qisqacha: package.json "qaysi versiyalar mumkin" deydi, lock-fayl (package-lock.json) esa "aynan qaysi biri o'rnatildi" deydi. Unda har paketning versiyasi, manzili va barmoq izi (integrity) yozilgan. npm ci faqat lock-fayldan o'rnatadi: node_modules ni o'chirib, noldan quradi va package.json bilan nomuvofiqlik bo'lsa EUSAGE bilan to'xtaydi. Lock-fayl doim commit qilinadi, CI'da esa faqat npm ci ishlatiladi.

Bu darsda

  • package-lock.json yozuvini o'qiysiz: version, resolved, integrity, dev.
  • Lock-fayl bo'lmasa nima bo'lishini o'z ko'zingiz bilan ko'rasiz.
  • npm ci va npm install farqini bilasiz va ularni o'lchaysiz.
  • EUSAGE va EINTEGRITY xatolarini tushunasiz.
  • Lock-fayldagi Git konfliktini to'g'ri hal qilasiz va boshqa menejerlarning lock-fayllarini taniysiz.

Oldin bilishingiz kerak: Semver va versiya diapazonlari, npm buyruqlari chuqur, Conflictlarni yechish amaliyoti.

1. Nega bu kerak?

O'tgan darsda ko'rdik: "vite": "^8.3.3" bugun 8.3.3 ni, ikki kundan keyin 8.3.4 ni beradi. Endi tasavvur qiling: Sardor dushanba kuni loyihani yozdi, Malika chorshanba kuni yuklab oldi. Ikkalasida package.json bir xil, lekin node_modules — boshqa-boshqa. Malikada test yiqildi, Sardorda — yo'q. "Mening kompyuterimda ishlaydi" — dasturchilarning eng mashhur gapi.

npm'ga birinchi qadam darsida javobni bir gap bilan aytgan edik: package-lock.json — "aniq versiyalar muhri". Asboblar zanjiri darsida esa "node_modules ni ko'chirmang, npm ci qiling" dedik. Bugun shu ikki va'dani ochamiz.

Maslahat: Chiqishlar 2026-10-10 da Windows 11, Node 24.21.0 va npm 11.19.0 bilan olingan. Yo'l boshi … bilan qisqartirilgan.

2. Lock-fayl ichida nima bor

2.1 Umumiy ko'rinish

kurs/vazifalar da (version maydonisiz yozuvlar ko'p, shuning uchun Node bilan o'qiymiz):

bash
node -p "Object.keys(require('./package-lock.json'))"
text
[ 'name', 'lockfileVersion', 'requires', 'packages' ]
Kalit vazifalar da Ma'nosi
name "vazifalar" loyiha nomi
lockfileVersion 3 fayl formati versiyasi
requires true yozuvlarda bog'liqliklar bor
packages 122 ta yozuv har paket — bitta yozuv

package-lock.json — 1 769 qator, 64 KB. Uni qo'lda tahrirlamaysiz. Lekin o'qiy olishingiz kerak — PR'da u o'zgarganda nima o'zgarganini tushunish uchun.

2.2 Bitta yozuv

packages ning kalitlari — diskdagi yo'llar. web-vitals yozuvi:

bash
node -p "require('./package-lock.json')\
.packages['node_modules/web-vitals']"
text
{
  version: '6.2.3',
  resolved: 'https://registry.npmjs.org/web-vitals/-/web-vitals-6.2.3.tgz',
  integrity: 'sha512-Dmy+vdO1UPMqXiAtZSNayhl4f794Bxfd94W4HIj2HlYtczEQfEOon969memlcpcHrTuOKLa5baFjX7WbgmOq+A==',
  dev: true,
  license: 'Apache-2.0'
}
Maydon Ma'nosi
version aynan o'rnatilgan versiya — diapazon emas
resolved arxiv qayerdan yuklangan
integrity arxivning barmoq izi (SHA-512)
dev faqat devDependencies orqali kelgan
license litsenziya (pasport darsi)

Integrity (butunlik) — arxiv mazmunidan hisoblangan hash (asboblar zanjiri darsidagi "barmoq izi"): fayldagi bitta bayt o'zgarsa, butunlay boshqa qator chiqadi. Bu xuddi pasportdagi barmoq izi kabi: ism bir xil odam bo'lishi mumkin, barmoq izi — yo'q. npm yuklagan arxivning hash'ini hisoblaydi va lock'dagi bilan solishtiradi.

Boshqa paketga bog'liq paketda yana bir maydon bor — uning o'z talablari:

bash
node -p "require('./package-lock.json')\
.packages['node_modules/debug'].dependencies"
text
{ ms: '^2.1.3' }

Ya'ni lock butun daraxtni saqlaydi: kim kimni qaysi diapazon bilan so'ragan va natijada aynan nima qo'yilgan.

2.3 Ildiz yozuvi va 122 ta yozuv

Kalit "" (bo'sh qator) — loyihaning o'zi: package.json dagi bog'liqliklar va engines nusxasi. npm shu nusxani haqiqiy package.json bilan solishtirib, "lock eskirganmi?" degan savolga javob beradi.

122 ta yozuv: 1 ta ildiz, 102 ta o'rnatilgan paket (npm buyruqlari darsidagi raqam) va 19 ta boshqa tizim uchun TypeScript 7 binari. Ular optional va os/cpu bilan belgilangan: Linux'dagi CI ham shu lock bilan o'ziga mos binarni oladi. Lock bitta kompyuter uchun emas, hamma tizimlar uchun yoziladi.

2.4 lockfileVersion

Versiya npm Xususiyati
1 5 va 6 eski format (dependencies daraxti)
2 7 va 8 yangi packages + eski bo'lim (ikkala npm o'qiydi)
3 9 dan sukut faqat packages — ixchamroq

Eski loyihada lockfileVersion: 1 ni ko'rsangiz, birinchi npm install faylni yangi formatga o'tkazadi va katta diff beradi. Bu xato emas, lekin uni alohida commit qiling — boshqa o'zgarishlar bilan aralashmasin.

Tekshirib ko'ring: Lock'da "node_modules/debug/node_modules/ms" yozuvi bor. Bu nimani bildiradi?

Javob

ms ning alohida nusxasi debug papkasi ichida turibdi — ildizdagi node_modules/ms dan boshqa versiya. Bog'liqlik turlari darsidagi override tajribasida aynan shunday bo'lgan edi. Kalit — diskdagi yo'l, shuning uchun bir paketning bir nechta nusxasi turli kalitlarda turadi (node_modules ichida).

3. Lock-fayl bo'lmasa

kurs/mashqlar/16/09-lock/ da npm buyruqlari darsidagidek eski versiyalar: npm i nanoid@3.3.4 picocolors@1.0.0, Git'ga commit. package.json da ^3.3.4 va ^1.0.0, lock'da — aniq 3.3.4 va 1.0.0.

node_modules ni o'chirib, npm ci:

bash
npm ci
npm ls
text

added 2 packages, and audited 3 packages in 1s

1 high severity vulnerability

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
09-lock@1.0.0 …\kurs\mashqlar\16\09-lock
+-- nanoid@3.3.4
`-- picocolors@1.0.0

Lock aytgani — aynan o'sha. Endi lock-faylni ham o'chiramiz (go'yo Sardor uni commit qilmagan):

bash
npm install
npm ls
text

added 2 packages, and audited 3 packages in 1s

1 package is looking for funding
  run `npm fund` for details

found 0 vulnerabilities
09-lock@1.0.0 …\kurs\mashqlar\16\09-lock
+-- nanoid@3.3.20
`-- picocolors@1.1.1

Bir xil package.json — boshqa node_modules. Diapazon ichidagi eng yangilari tushdi va zaiflik ham "yo'qoldi". Bu safar omadimiz keldi: yangi versiyalar yaxshiroq. Lekin xuddi shu yo'l bilan yangi, xatoli PATCH ham kelishi mumkin edi. git diff --stat — package-lock.json | 18 ++++++++++++------. Lock'ni git checkout bilan qaytaramiz.

flowchart LR
  P["package.json<br/>^3.3.4"] --> I["npm install"]
  L["package-lock.json<br/>3.3.4"] --> I
  L --> C["npm ci"]
  I --> N1["node_modules<br/>(lock yangilanishi mumkin)"]
  C --> N2["node_modules<br/>aynan lock'dagidek"]

Sxemaga qarang: npm install ikkala faylni o'qiydi va kerak bo'lsa lock'ni o'zgartiradi. npm ci esa faqat lock'ga ishonadi va hech narsani yozmaydi.

4. npm ci va npm install

4.1 Farqlar

ci — "clean install" (toza o'rnatish).

npm install npm ci
lock-fayl o'qiydi va yangilaydi faqat o'qiydi
lock yo'q bo'lsa yaratadi xato
package.json lock'ga mos emas lock'ni tuzatadi xato (EUSAGE)
node_modules bor narsani to'ldiradi o'chirib, noldan quradi

npm ci bir paket qo'shmaydi ham (npm ci nanoid — yo'q), faqat butun loyihani o'rnatadi.

4.2 EUSAGE: fayllar mos emas

package.json da nanoid ni ^5.0.0 ga o'zgartirdik, npm install qilmadik:

bash
npm ci
text
npm error code EUSAGE
npm error
npm error `npm ci` can only install packages when your package.json and package-lock.json or npm-shrinkwrap.json are in sync. Please update your lock file with `npm install` before continuing.
npm error
npm error Invalid: lock file's nanoid@3.3.4 does not satisfy nanoid@5.1.16
npm error
npm error Clean install a project
…

Tarjima: "npm ci faqat package.json va lock-fayl mos bo'lganda o'rnata oladi. Davom etishdan oldin lock-faylni npm install bilan yangilang. Yaroqsiz: lock-fayldagi nanoid 3.3.4 nanoid 5.1.16 ga mos emas". Undan keyin npm buyruqning to'liq qo'llanmasini chiqaradi (~70 qator) — biz kesdik, haqiqiy xato birinchi bloklarda.

Davosi xabarning o'zida: npm install (lock yangilanadi: changed 1 package), keyin ikkala faylni birga commit qilish. vazifalar kanonida ham xuddi shu xato sinalgan — package.json da prettier 3.9.8, lock'da 3.9.9: Invalid: lock file's prettier@3.9.9 does not satisfy prettier@3.9.8.

Bu xato — yaxshi xato. CI'da npm install bo'lganda, u jimgina lock'ni o'zgartirib, siz sinamagan versiyalarni o'rnatardi. npm ci esa "fayllaringiz kelishmagan" deb to'xtaydi.

4.3 Lock-fayl yo'q

bash
npm ci
text
npm error code EUSAGE
npm error
npm error The `npm ci` command can only install with an existing package-lock.json or
npm error npm-shrinkwrap.json with lockfileVersion >= 1. Run an install with npm@5 or
npm error later to generate a package-lock.json file, then try again.
…

"npm ci faqat mavjud lock-fayl bilan ishlaydi". npm-shrinkwrap.json — lock'ning egizagi: u nashr qilinadigan paket ichida ham boradi va paketni o'rnatganlarga aniq daraxtni majburlaydi. Ilovalarda deyarli ishlatilmaydi. Oddiy package-lock.json esa paket nashr qilinganda arxivga tushmaydi.

4.4 O'lchov: qaysi biri tez

vazifalar da (102 paket, npm keshi to'la), har buyruq 5 marta:

vazifalar: o'rnatish vaqti (5 o'lchov medianasi)
  • npm install, node_modules bor2,1 s
  • npm ci (har safar noldan)6,4 s
  • npm install, node_modules yo'q9,7 s

Manba: O'lchov: Windows 11, Intel Core i5-12500H, 16 GB, Node 24.21.0, npm 11.19.0, issiq kesh, 2026-10-10

Xom raqamlar (ms): npm ci — 6614, 6263, 6447, 7174, 5880; npm install (node_modules bor) — 2094, 2138, 2033, 2215, 2168; npm install (node_modules yo'q) — 4637, 9678, 11605, 10369, 3806. Oxirgisi juda sochilgan: o'lchov paytida kompyuterda boshqa ishlar ham bor edi. Sizda raqamlar boshqacha bo'ladi.

Xulosa ikkita. Hammasi joyida bo'lsa, npm install tez — u faqat tekshiradi (up to date). npm ci esa har safar noldan quradi: lokal ishda sekinroq, lekin natija kafolatlangan. CI'da node_modules baribir yo'q — u yerda npm ci bir vaqtning o'zida tez va ishonchli. vazifalar ning pages.yml i 15-qismdan beri shunday.

Tekshirib ko'ring: Sardor branch almashtirdi, yangi branch'da Prettier boshqa versiyada. Qaysi buyruqni yozadi?

Javob

npm ci. Lock-fayl branch bilan birga almashdi, node_modules esa eskisicha qoldi. npm ci uni lock'ga aynan moslab qayta quradi. npm install ham ishlaydi. Lekin package.json va lock o'rtasida farq bo'lsa, u lock'ni o'zgartirib yuborishi mumkin — branch'da kutilmagan diff paydo bo'ladi.

5. integrity: soxta arxivni ushlash

Lock'dagi picocolors hash'ining bir harfini o'zgartirdik — go'yo kimdir yo'lda arxivni almashtirgan. Toza kesh bilan (--cache .bosh-kesh, eski arxiv keshdan olinmasin):

bash
npm ci --cache .bosh-kesh
text
npm warn tarball tarball data for picocolors@https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz (sha512-A1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkj==) seems to be corrupted. Trying again.
…
npm error code EINTEGRITY
npm error sha512-A1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkj== integrity checksum failed when using sha512: wanted sha512-A1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkj== but got sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==. (2411 bytes)

"Arxiv buzilganga o'xshaydi, qayta urinaman". Ikki urinishdan keyin: "butunlik tekshiruvi muvaffaqiyatsiz: kutilgan … , olingan …". npm paketni o'rnatmadi. Bu lock'ning xavfsizlik vazifasi: registrdagi arxiv yoki tarmoqdagi javob o'zgarsa, o'rnatish to'xtaydi.

Haqiqiy hayotda EINTEGRITY ko'pincha hujum emas, buzilgan kesh yoki proksi tufayli chiqadi. Avval npm cache verify (npm buyruqlari). Lock'dagi integrity ni qo'lda "tuzatish" yoki o'chirish — xavfsizlik himoyasini o'chirish demak. Ta'minot zanjiri hujumlari — keyingi darslarning biri.

6. Lock-faylda Git konflikti

6.1 Qanday paydo bo'ladi

Ikki branch, har birida boshqa paket. feature/ms da npm i -E ms@2.1.3, main da npm i -E dayjs@1.11.23. Birlashtiramiz:

bash
git merge feature/ms
text
Auto-merging package-lock.json
CONFLICT (content): Merge conflict in package-lock.json
Auto-merging package.json
CONFLICT (content): Merge conflict in package.json
Automatic merge failed; fix conflicts and then commit the result.

Ikkala faylda konflikt. package.json dagi:

text
  "dependencies": {
<<<<<<< HEAD
    "dayjs": "1.11.23",
=======
    "ms": "2.1.3",
>>>>>>> feature/ms
    "nanoid": "^3.3.4",
    "picocolors": "^1.0.0"
  }

Lock'da esa ikkita shunday blok — ildiz yozuvi va paket yozuvlari.

6.2 To'g'ri yo'l

  1. package.json ni qo'lda hal qiling — u inson uchun yozilgan. Bizda ikkala qator ham kerak: dayjs ham, ms ham. Belgilarni (Conflictlarni yechish darsidagi <<<<<<<, =======, >>>>>>>) o'chiramiz.
  2. Lock'ni qo'lda tahrirlamang. npm install ni ishga tushiring:
bash
npm install
npm ls
text

added 1 package, and audited 5 packages in 1s

1 high severity vulnerability

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
09-lock@1.0.0 …\kurs\mashqlar\16\09-lock
+-- dayjs@1.11.23
+-- ms@2.1.3
+-- nanoid@3.3.4
`-- picocolors@1.0.0

npm lock'dagi konflikt belgilarini o'zi tanidi va hal qildi: grep -c "<<<<<<<" package-lock.json — 0. Ikkala paket ham o'rnatildi, eski versiyalar (nanoid 3.3.4) o'zgarmadi.

  1. Ikkala faylni commit qiling: git add package.json package-lock.json, git commit.

Agar konflikt juda chalkash bo'lsa — zaxira yo'l: lock'ni bir tomondan oling (git checkout --theirs package-lock.json), keyin npm install. Lekin hech qachon lock'ni o'chirib, noldan yaratmang: hamma paket diapazon ichidagi eng yangisiga sakraydi va PR'ga yuzlab begona o'zgarish kiradi.

Tekshirib ko'ring: Malika: "Lock-fayl doim konflikt beradi, uni .gitignore ga qo'shaylik". Siz nima deysiz?

Javob

Yo'q. Lock bo'lmasa, «Lock-fayl bo'lmasa» bo'limidagi holat qaytadi: har kompyuterda boshqa versiyalar, CI'da npm ci umuman ishlamaydi. Konflikt — ikki branch bog'liqliklarni o'zgartirganining belgisi, va uning yechimi bitta buyruq: npm install.

7. Boshqa menejerlarning lock-fayllari

Menejer Lock-fayl Format "ci" buyrug'i
npm package-lock.json JSON npm ci
pnpm pnpm-lock.yaml YAML pnpm install --frozen-lockfile
Yarn yarn.lock o'z formati (berry'da YAML'ga yaqin) yarn install --immutable
Bun bun.lock (eskisi — bun.lockb) JSON'ga yaqin matn bun install --frozen-lockfile

G'oya hamma joyda bir xil: aniq versiyalar va hash'lar, CI'da "lock'ni o'zgartirma" rejimi. pnpm va boshqa menejerlarni pnpm va Yarn va Bun darslarida o'rnatib ko'ramiz.

Bitta qoida: loyihada bitta lock-fayl. package-lock.json va yarn.lock ikkalasi tursa, kimdir npm bilan, kimdir Yarn bilan o'rnatadi — va lock'lar bir-biridan uzoqlashadi.

8. Ko'p uchraydigan xatolar

Xabar Sabab Davosi
EUSAGE … are in sync package.json o'zgargan, lock — yo'q npm install, ikkalasini commit
EUSAGE … existing package-lock.json lock yo'q npm install bilan yarating
EINTEGRITY arxiv hash'i lock'ga mos emas npm cache verify; lock'ni tahrirlamang
CONFLICT … package-lock.json ikki branch paket o'zgartirgan package.json qo'lda, keyin npm install
Belgi Sabab Davosi
hamkasbda boshqa versiyalar lock commit qilinmagan lock'ni commit qiling
PR'da 2 000 qatorli lock diff lock o'chirib qayta yaratilgan eski lock'ni qaytaring
lockfileVersion o'zgardi eski npm'dan o'tildi alohida commit
ikki lock-fayl ikki menejer bittasini tanlang

9. Mashqlar

Mashqlar kurs/mashqlar/16/09-lock/ da.

1-mashq (oson): Lock yozuvini o'qing

kurs/vazifalar ning lock-faylida node_modules/ms yozuvini toping (node -p bilan, «Bitta yozuv» bo'limidagidek):

  • version:
  • dev qiymati:
  • ms ni kim so'ragan (npm ls ms)?
  • resolved qaysi domenga ishora qiladi?
Yechim
bash
node -p "require('./package-lock.json').packages['node_modules/ms']"
text
{
  version: '2.1.3',
  resolved: 'https://registry.npmjs.org/ms/-/ms-2.1.3.tgz',
  integrity: 'sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==',
  dev: true,
  license: 'MIT'
}

dev: true — ms faqat dasturchi asboblari (eslint → debug) orqali kelgan. npm ls ms zanjirni ko'rsatadi: eslint → debug → ms (npm buyruqlari).

2-mashq (o'rta): Kelishmagan fayllar

Mashq loyihasida (nanoid 3.3.4 lock'da):

  1. npm pkg set dependencies.nanoid=^5.0.0 va npm ci. Xato kodi:
  2. Xabardagi tavsiyani bajaring va npm ci ni takrorlang.
  3. npm ls — nanoid versiyasi:
Yechim

2-qadam — npm install:

text

changed 1 package, and audited 3 packages in 1s

1 package is looking for funding
  run `npm fund` for details

Lock yangilandi. Endi npm ci o'tadi (added 2 packages) va npm ls — nanoid@5.1.16 (2026-10 holatiga ^5 ning eng yangisi; sizda yangiroq bo'lishi mumkin). Oxirida ikkala faylni commit qiling — bittasini unutish CI'dagi EUSAGE ning eng ko'p uchraydigan sababi.

3-mashq (o'rta): Konfliktni hal qiling

«Lock-faylda Git konflikti» bo'limidagi tajribani takrorlang: ikki branch, ikki paket (ms@2.1.3 va dayjs@1.11.23), git merge. Konfliktni hal qilib, merge commit qiling. Oxirida npm ls da to'rtta paket bo'lsin.

Yechim
bash
git switch -c feature/ms
npm i -E ms@2.1.3
git commit -am "feat: ms"
git switch main
npm i -E dayjs@1.11.23
git commit -am "feat: dayjs"
git merge feature/ms
# package.json: belgilarni o'chirib, ikkala qatorni qoldiring
npm install
git add package.json package-lock.json
git commit -m "merge: feature/ms"

npm ls — dayjs@1.11.23, ms@2.1.3, nanoid@3.3.4, picocolors@1.0.0. Lock'ni qo'lda tahrirlamadik — npm install belgilarni o'zi tozaladi.

4-mashq (qiyin): Lock diff'ini o'qiydigan skript

PR'da lock-fayl yuzlab qator o'zgaradi va uni ko'z bilan o'qish qiyin. lock-farq.mjs yozing: diffLocks(before, after) ikki lock obyektini oladi va { added, removed, changed } qaytaradi — "dayjs@1.11.23" va "nanoid: 3.3.4 → 3.3.20" ko'rinishidagi qatorlar. Ichma-ich yo'lda (node_modules/debug/node_modules/ms) nom — oxirgi node_modules/ dan keyingisi. tekshir.mjs — ikki faylni o'qib, natijani chiqaradi.

Ishoralar: Map — yo'l → versiya. Eski lock'ni Git'dan olish: git show HEAD~1:package-lock.json > eski.json.

Yechim

lock-farq.mjs:

js
// lock-farq.mjs — ikki package-lock.json orasidagi farq:
// qaysi paket qo'shildi, o'chdi yoki versiyasi o'zgardi

// "node_modules/a/node_modules/b" → "b" (ichma-ich yo'l ham)
function nameOf(path) {
  return path.slice(path.lastIndexOf("node_modules/") + 13);
}

// lock obyekti → Map(yo'l → versiya), ildiz ("") yozuvisiz
function versions(lock) {
  const map = new Map();
  for (const [path, info] of Object.entries(lock.packages ?? {})) {
    if (path !== "") map.set(path, info.version);
  }
  return map;
}

export function diffLocks(before, after) {
  const a = versions(before);
  const b = versions(after);
  const result = { added: [], removed: [], changed: [] };
  for (const [path, version] of b) {
    const name = nameOf(path);
    if (!a.has(path)) result.added.push(`${name}@${version}`);
    else if (a.get(path) !== version) {
      result.changed.push(`${name}: ${a.get(path)} → ${version}`);
    }
  }
  for (const [path, version] of a) {
    if (!b.has(path)) {
      result.removed.push(`${nameOf(path)}@${version}`);
    }
  }
  return result;
}

const a = { packages: { "node_modules/ms": { version: "2.1.2" } } };
const b = { packages: { "node_modules/ms": { version: "2.1.3" } } };
console.log(diffLocks(a, b).changed); // [ 'ms: 2.1.2 → 2.1.3' ]

Oxirgi uch qator — sinash uchun. 13 — "node_modules/" qatorining uzunligi.

tekshir.mjs:

js
// tekshir.mjs — ishlatish: node tekshir.mjs <eski> <yangi>
// Git bilan: git show HEAD~1:package-lock.json > eski.json
import { readFileSync } from "node:fs";
import { diffLocks } from "./lock-farq.mjs";

const [oldFile, newFile] = process.argv.slice(2);
const read = (file) => JSON.parse(readFileSync(file, "utf8"));
const diff = diffLocks(read(oldFile), read(newFile));

for (const line of diff.added) console.log(`+ ${line}`);
for (const line of diff.removed) console.log(`- ${line}`);
for (const line of diff.changed) console.log(`~ ${line}`);
const { added, removed, changed } = diff;
console.log(
  `Jami: +${added.length} -${removed.length} ~${changed.length}`,
);

3-mashqdagi merge'dan oldingi va keyingi lock:

text
+ dayjs@1.11.23
+ ms@2.1.3
Jami: +2 -0 ~0

Testlar (lock-farq.test.mjs, node:test) — qo'shilgan, o'chgan, o'zgargan va ichma-ich yo'l holatlari: ℹ pass 2. Qiziqarli sinov: vazifalar ning hozirgi lock'ini 16-qism oxiridagi lock bilan solishtirsak — Jami: +185 -0 ~0. Vite, husky, knip va boshqa asboblar 185 ta paket olib keladi — bu raqamni qism davomida bosqichma-bosqich ko'ramiz.

10. Real ishda

  • Lock-fayl — kod: u commit qilinadi, PR'da ko'rib chiqiladi va CI'da npm ci bilan ishlatiladi. Ko'p jamoalar PR shablonida "lock-fayl o'zgardimi — nega?" deb so'raydi.
  • Docker image'larda ham npm ci (ko'pincha --omit=dev bilan — bog'liqlik turlari).
  • Dependabot va Renovate — bog'liqliklarni yangilovchi botlar — aynan lock-faylni o'zgartiradigan PR'lar ochadi (Bog'liqliklarni yangilash strategiyasi).
  • Intervyu: "npm ci va npm install farqi?", "lock-faylni commit qilish kerakmi?", "integrity maydoni nima uchun?".

Xulosa

  • package.json — ruxsat etilgan diapazonlar, package-lock.json — aynan o'rnatilgan daraxt: versiya, resolved, integrity, dev, os/cpu.
  • Lock'siz npm install bir xil package.json dan turli node_modules yasaydi.
  • npm ci — faqat lock'dan, noldan, o'zgartirmasdan; nomuvofiqlikda EUSAGE, buzilgan arxivda EINTEGRITY.
  • Lokalda npm install tezroq (up to date), CI'da npm ci — tez va ishonchli.
  • Lock konflikti: package.json qo'lda, lock — npm install bilan; lock'ni hech qachon o'chirib qayta yaratmang.
  • Bitta loyiha — bitta menejer — bitta lock-fayl.

Keyingi dars: node_modules ichida — Node va bundler paketni qanday topadi, hoisting, dublikatlar va ERESOLVE peer xatosi.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Lock-fayllar va npm ci: package-lock.json ichi, lockfileVersion va konfliktlar — IlmHamroh