Yan yana
npmvspnpm
npm ile pnpm arasındaki fark nedir?
Güncellendi 2 dk okuma8 fark
Kısaca
npm her paketi her projenin düz node_modules klasörüne kopyalar; pnpm tek kopyayı ortak bir depoda tutup bağlar ve tanımlanmamış import'ları engeller.
npm
Node Package Manager
npm, Node.js'in varsayılan paket yöneticisi ve dünyanın en büyük yazılım deposudur; bir projenin bağımlılıklarını indirir ve sürümlerini takip eder.
npm sayfasını okupnpm
Performant npm
pnpm, her paket sürümünün tek kopyasını ortak bir depoda tutup projelere bağlayan, hızlı ve disk dostu bir JavaScript paket yöneticisidir.
pnpm sayfasını okunpm ve pnpm karşılaştırması
| Özellik | npm | pnpm |
|---|---|---|
| Disk kullanımı | Her projede her paketin tam bir kopyası | Ortak depoda sürüm başına tek kopya; projelere hard link ile bağlanır |
| Klasör yerleşimi | Düz: bağımlılıklar en üst düzeye taşınır | Sıkı: en üstte yalnızca doğrudan bağımlılıklar, .pnpm içine bağlanır |
| Tanımlanmamış import'lar | Çoğu zaman tesadüfen çalışır (hayalet bağımlılıklar) | Hemen hata verir |
| Lockfile | package-lock.json | pnpm-lock.yaml |
| Tekrarlanan kurulumlar | Her paketi önbelleğinden yeniden açıp kopyalar | Depoda zaten bulunan dosyaları bağlar; genellikle daha hızlı |
| Kurulum script'leri | Bağımlılıkların script'leri varsayılan olarak çalışır | Sürüm 10'dan beri siz onaylayana kadar engellenir |
| Monorepo'lar | --workspace bayraklarıyla workspace'ler | --filter ile birlikte pnpm-workspace.yaml |
| Hazırlık | Node.js ile birlikte gelir | Ayrıca kurulur; çoğu zaman Corepack ya da npm install -g pnpm ile |
Fark, açıklamalı
npm ve pnpm, aynı package.json dosyasını okuyan ve paketleri aynı npm deposundan kuran iki JavaScript paket yöneticisidir. npm varsayılan olandır ve her Node.js kurulumuyla birlikte gelir. Adı "performant npm" ifadesinin kısaltması olan pnpm ise disk alanından tasarruf etmek, kurulumları hızlandırmak ve bağımlılıkları sıkı tutmak için geliştirilmiş ayrı bir araçtır; npm'e yayımlanan her şey onunla da kurulur.
Fark, dosyaların nereye gittiğindedir. npm her bağımlılığı her projenin node_modules klasörüne kopyalar ve hepsini tek, düz bir klasörde en üste taşır (hoisting); bu yüzden React kullanan on proje React'in on kopyasını tutar ve kodunuz, hiç tanımlamadığınız bir paketi sırf bir bağımlılık onu getirdiği için import edebilir: buna hayalet bağımlılık (phantom dependency) denir. pnpm ise her dosyayı içerik adresli ortak bir depoya (store) bir kez kaydeder ve projelere hard link olarak ekler; node_modules klasöründe de yalnızca doğrudan bağımlılıklarınız, node_modules/.pnpm klasörüne işaret eden sembolik bağlar olarak durur. Böylece tanımlanmamış import'lar hemen hata verir.
Komutlar birbirine yakındır: npm install react yerine pnpm add react, npx yerine pnpm dlx; pnpm import da var olan bir package-lock.json dosyasını pnpm-lock.yaml dosyasına dönüştürür. pnpm, bir pnpm-workspace.yaml dosyası ve komutları yalnızca bazı paketlerde çalıştıran --filter bayrağıyla monorepo'larda popülerdir. Güvenlik konusunda da daha sıkıdır: sürüm 10'dan beri siz onaylamadıkça bağımlılıkların kurulum script'lerini çalıştırmaz; npm ise --ignore-scripts vermediğiniz sürece onları varsayılan olarak çalıştırır.
Sık yapılan bir yanlış, pnpm'in npm'in bir fork'u ya da ayrı bir paket deposu olduğu düşüncesidir; ikisi de değildir, yalnızca paketleri diske farklı biçimde yerleştirir. Katılığı bazen hoisting'e güvenen eski paketleri bozar; bu, pnpm'deki değil o paketlerdeki gizli bir hatadır ve pnpm'in bu durumlar için yerleşimi gevşeten hoisting ayarları vardır. Her paket yöneticisinde olduğu gibi, bir proje tek bir araç kullanmalı ve yalnızca onun lockfile'ını commit etmelidir.
Hangisini kullanmalısınız?
npm şu durumlarda doğru seçim:
- Node.js ile gelen, başka hiçbir şey kurmayı gerektirmeyen varsayılan aracı istiyorsunuz.
- Barındırma ortamınız, CI imajlarınız ya da eğitimler npm'i ve
package-lock.jsondosyasını varsayıyor. - Projedeki eski araçlar düz bir
node_modulesklasörü bekliyor.
pnpm şu durumlarda doğru seçim:
- Pek çok projede ya da CI'da disk alanı veya kurulum süresi önemli.
- Tanımlanmamış import'ların tesadüfen çalışmak yerine hata vermesini istiyorsunuz.
- Bir monorepo yönetiyorsunuz ve
--filterile workspace bağlantılarını istiyorsunuz. - Bağımlılıkların kurulum script'lerinin siz onaylayana kadar engellenmesini istiyorsunuz.
Express'i kurmak, ardından hiç tanımlanmamış bir paketi import etmek
# npm: dependencies are hoisted into one flat folder
npm install express
ls node_modules
# accepts body-parser ... debug ... express ...
# debug is not in package.json, but this works
node -e "require('debug')"# pnpm: only declared dependencies sit at the top
pnpm add express
ls node_modules
# express (a link into node_modules/.pnpm)
# debug was never declared, so this fails
node -e "require('debug')"
# Error: Cannot find module 'debug'Sık sorulan sorular
pnpm, npm'den hızlı mı?
Tekrarlanan kurulumlarda genellikle evet: depoda zaten bulunan dosyalar yeniden açılıp kopyalanmak yerine bağlanır. Fark projeye ve deponun önceden dolu olup olmadığına bağlıdır; temiz bir makinedeki ilk kurulumlarda ikisi birbirine daha yakındır.
pnpm her npm paketiyle çalışır mı?
Aynı depodan kurduğu için neredeyse hepsiyle çalışır. Birkaç eski paket, hiç tanımlamadığı bağımlılıkları import eder ve pnpm'in sıkı yerleşiminde bozulur; pnpm'in hoisting ayarları bu paketler için yerleşimi gevşetir.
Bir projeyi npm'den pnpm'e nasıl geçiririm?
package-lock.json dosyasından pnpm-lock.yaml oluşturmak için pnpm import çalıştırın, eski lockfile'ı ve node_modules klasörünü silin, ardından pnpm install çalıştırın. Herkesin aynı aracı kullanması için pnpm'i packageManager alanına yazın.