pnpm npm va yarn'dan nimasi bilan farq qiladi?
Savol
npm, yarn va pnpm o'rtasidagi farq nimada va nega pnpm diskda joy tejaydi?
Qisqa javob
npm va yarn (klassik rejimda) har bir loyiha uchun har bir paketning nusxasini yassi node_modules ichiga joylashtiradi, bir xil versiyalarni diskda takrorlaydi. pnpm esa har bir paketni global content-addressable ombor(store)da bir marta saqlaydi va uni loyihalarga simlink/hardlink orqali ulaydi — bu joy tejaydi va node_modules tuzilishini qat'iy qiladi, "fantom" bog'liqliklarsiz.
Batafsil javob
npm va yarn (classic) yassi node_modulesdan foydalanadi: bog'liqliklar va ularning pastki daraxti dublikatsiya va chuqur ichma-ichlikdan qochish uchun yuqori darajaga ko'tariladi (hoisting). Bunga yon ta'sir — fantom bog'liqliklar: A paketi B paketini import qilishi mumkin, aslida u A ning package.json'ida e'lon qilinmagan, shunchaki C paketi uni o'rnatgani sababli yuqori darajada yonma-yon topilib qolgan. Kod ishlaydi, lekin bog'liqliklar daraxtidagi har qanday o'zgarishda buziladi.
pnpm buni boshqacha hal qiladi:
- Barcha paketlarning barcha versiyalari global content-addressable storeda (odatda
~/.pnpm-store) fizik jihatdan bir marta saqlanadi, kontent xeshi bo'yicha manzillanadi. - Har bir loyihaning
node_modulesida pnpm fayllarni nusxalash o'rniga shu store'ga simlink/hardlink yaratadi. node_modules/.pnpmtuzilishi yassi emas: har bir paket simlinklar orqali faqat o'ziningpackage.json'ida haqiqatan e'lon qilingan bog'liqliklarini ko'radi. Bu qat'iy izolyatsiya beradi: agar kod e'lon qilinmagan paketni import qilsa, u shunchaki topilmaydi — xato darhol ko'rinadi, keyinroq prodda yoki boshqa dasturchida emas.- Bitta fizik fayl nusxasiga hardlink qilish tufayli joy tejash ayniqsa monorepolarda va bir xil bog'liqliklarga ega ko'p sonli loyihalarda seziladi —
reactning bitta versiyasi diskda fizik jihatdan bir marta yotadi, uni qancha loyiha ishlatmasin.
Yarn Berry (2+) ham hoisting muammosini Plug'n'Play rejimi orqali (umuman node_modulessiz, resolving .pnp.cjs orqali) hal qilishga urinadi, lekin bu ekotizim bilan kamroq moslashadi, shu sababli ko'pchilik node-modules linkerida qolmoqda.
Buyruq API nuqtai nazaridan bugungi kunda barcha uchta menejer o'xshash (install, add, run), farqlar esa lock-fayllarda (package-lock.json, yarn.lock, pnpm-lock.yaml) va resolving tezligi/intizomida.
Misol
# npm / yarn classic — yassi node_modules, fantom bog'liqliklar mumkin
npm install lodash
# pnpm — paket fizik jihatdan store'da bir marta, loyihada — simlinklar
pnpm add lodash
# store haqiqatda qayerda yotganini ko'rish
pnpm store path
# C:\Users\User\AppData\Local\pnpm\store\v3
# agar kod o'z modulining package.json'ida e'lon qilinmagan
# paketni import qilsa, pnpm bu muammoni darhol ko'rsatadi —
# u qat'iy simlinklar orqali shunchaki mavjud bo'lmaydi
// package.json — buyruqlar menejerdan qat'i nazar bir xil
{
"scripts": {
"dev": "vite",
"build": "vite build"
}
}
Qo'shimcha savollar
- Workspaces (monorepolar) nima va npm, yarn, pnpm ularni qanday qo'llab-quvvatlaydi?
- Nega lock-fayl albatta repozitoriyga commit qilinishi kerak?
- Hardlinklar Linux/macOS'dan farqli ishlaydigan Windows'da pnpm aynan qanday qilib joy tejaydi?