Mundarija (27)
- Bu darsda
- 1. Nega bu kerak?
- 2. Lock-fayl ichida nima bor
- 2.1 Umumiy ko'rinish
- 2.2 Bitta yozuv
- 2.3 Ildiz yozuvi va 122 ta yozuv
- 2.4 lockfileVersion
- 3. Lock-fayl bo'lmasa
- 4. npm ci va npm install
- 4.1 Farqlar
- 4.2 EUSAGE: fayllar mos emas
- 4.3 Lock-fayl yo'q
- 4.4 O'lchov: qaysi biri tez
- 5. integrity: soxta arxivni ushlash
- 6. Lock-faylda Git konflikti
- 6.1 Qanday paydo bo'ladi
- 6.2 To'g'ri yo'l
- 7. Boshqa menejerlarning lock-fayllari
- 8. Ko'p uchraydigan xatolar
- 9. Mashqlar
- 1-mashq (oson): Lock yozuvini o'qing
- 2-mashq (o'rta): Kelishmagan fayllar
- 3-mashq (o'rta): Konfliktni hal qiling
- 4-mashq (qiyin): Lock diff'ini o'qiydigan skript
- 10. Real ishda
- Xulosa
- Manbalar
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 cifaqat lock-fayldan o'rnatadi:node_modulesni o'chirib, noldan quradi vapackage.jsonbilan nomuvofiqlik bo'lsaEUSAGEbilan to'xtaydi. Lock-fayl doim commit qilinadi, CI'da esa faqatnpm ciishlatiladi.
Bu darsda
package-lock.jsonyozuvini o'qiysiz:version,resolved,integrity,dev.- Lock-fayl bo'lmasa nima bo'lishini o'z ko'zingiz bilan ko'rasiz.
npm civanpm installfarqini bilasiz va ularni o'lchaysiz.EUSAGEvaEINTEGRITYxatolarini 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):
node -p "Object.keys(require('./package-lock.json'))"[ '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:
node -p "require('./package-lock.json')\
.packages['node_modules/web-vitals']"{
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:
node -p "require('./package-lock.json')\
.packages['node_modules/debug'].dependencies"{ 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:
npm ci
npm ls
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):
npm install
npm ls
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:
npm cinpm 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
npm cinpm 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:
- 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):
npm ci --cache .bosh-keshnpm 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:
git merge feature/msAuto-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:
"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
package.jsonni qo'lda hal qiling — u inson uchun yozilgan. Bizda ikkala qator ham kerak:dayjsham,msham. Belgilarni (Conflictlarni yechish darsidagi<<<<<<<,=======,>>>>>>>) o'chiramiz.- Lock'ni qo'lda tahrirlamang.
npm installni ishga tushiring:
npm install
npm ls
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.
- 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
.gitignorega 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:devqiymati:msni kim so'ragan (npm ls ms)?resolvedqaysi domenga ishora qiladi?
Yechim
node -p "require('./package-lock.json').packages['node_modules/ms']"{
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):
npm pkg set dependencies.nanoid=^5.0.0vanpm ci. Xato kodi:- Xabardagi tavsiyani bajaring va
npm cini takrorlang. npm ls—nanoidversiyasi:
Yechim
2-qadam — npm install:
changed 1 package, and audited 3 packages in 1s
1 package is looking for funding
run `npm fund` for detailsLock 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
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:
// 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:
// 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:
+ dayjs@1.11.23
+ ms@2.1.3
Jami: +2 -0 ~0Testlar (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 cibilan ishlatiladi. Ko'p jamoalar PR shablonida "lock-fayl o'zgardimi — nega?" deb so'raydi. - Docker image'larda ham
npm ci(ko'pincha--omit=devbilan — bog'liqlik turlari). - Dependabot va Renovate — bog'liqliklarni yangilovchi botlar — aynan lock-faylni o'zgartiradigan PR'lar ochadi (Bog'liqliklarni yangilash strategiyasi).
- Intervyu: "
npm civanpm installfarqi?", "lock-faylni commit qilish kerakmi?", "integritymaydoni nima uchun?".
Xulosa
package.json— ruxsat etilgan diapazonlar,package-lock.json— aynan o'rnatilgan daraxt: versiya,resolved,integrity,dev,os/cpu.- Lock'siz
npm installbir xilpackage.jsondan turlinode_modulesyasaydi. npm ci— faqat lock'dan, noldan, o'zgartirmasdan; nomuvofiqlikdaEUSAGE, buzilgan arxivdaEINTEGRITY.- Lokalda
npm installtezroq (up to date), CI'danpm ci— tez va ishonchli. - Lock konflikti:
package.jsonqo'lda, lock —npm installbilan; 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
- npm Docs (v11): package-lock.json, npm ci, npm-shrinkwrap.json
- npm Docs: "Resolving lockfile conflicts" — npm install
- W3C: Subresource Integrity —
integrityformati (sha512-…)
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!