Ana içeriğe geç

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ı oku

pnpm

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ı oku

npm ve pnpm karşılaştırması

Özelliknpmpnpm
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şimiDüz: bağımlılıklar en üst düzeye taşınırSı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
Lockfilepackage-lock.jsonpnpm-lock.yaml
Tekrarlanan kurulumlarHer paketi önbelleğinden yeniden açıp kopyalarDepoda zaten bulunan dosyaları bağlar; genellikle daha hızlı
Kurulum script'leriBağımlılıkların script'leri varsayılan olarak çalışırSürüm 10'dan beri siz onaylayana kadar engellenir
Monorepo'lar--workspace bayraklarıyla workspace'ler--filter ile birlikte pnpm-workspace.yaml
HazırlıkNode.js ile birlikte gelirAyrı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.json dosyasını varsayıyor.
  • Projedeki eski araçlar düz bir node_modules klasö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 --filter ile 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

npmbash
# 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')"
pnpmbash
# 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.

Daha fazla

Ayarlar