pnpm
Performant npm
- Okunuşu
- pi en pi em
Kısaca
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 nedir?
Adı "performant npm" ifadesinin kısaltması olan pnpm, JavaScript paketlerini npm ile aynı depodan kurar ve aynı package.json dosyasını okur. Değiştirdiği şey dosyaların nereye gittiğidir. npm her bağımlılığı her projenin node_modules klasörüne kopyalar; React kullanan on proje, React'in on kopyasını tutar. pnpm ise her dosyayı bir kez, içerik adresli bir depoya, yani dosyaların içeriklerinin hash'iyle saklandığı bir klasöre kaydeder ve ona ihtiyaç duyan her projeye hard link olarak, yani diskteki aynı dosyanın ikinci bir adı olarak ekler. Böylece fazladan kopyalar neredeyse hiç yer kaplamaz ve tekrarlanan kurulumlar hızlı olur.
node_modules klasörü de farklı kurulur. npm ve Yarn Classic bütün paketleri node_modules klasörünün en üst düzeyine taşır (hoisting); bu yüzden 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 en üste yalnızca doğrudan bağımlılıklarınızı, gizli bir node_modules/.pnpm klasörüne işaret eden sembolik bağlar olarak koyar; böylece tanımlanmamış bir paketi import etmek daha sonra sorun çıkarmak yerine hemen hata verir.
pnpm lockfile'ını pnpm-lock.yaml dosyasına yazar ve monorepo'lar için güçlü yerleşik destek sunar: pnpm-workspace.yaml dosyası paketleri listeler, --filter ise bir komutu yalnızca bazı paketlerde çalıştırır. Sürüm 10'dan beri pnpm, siz izin vermedikçe bağımlılıkların kurulum script'lerini çalıştırmaz; bu da tedarik zinciri saldırılarının sık kullandığı bir yolu kapatır.
pnpm bazen npm'in bir fork'u ya da ayrı bir paket deposu sanılır, ama ikisi de değildir: npm'e yayımlanan her şey pnpm ile kurulur ve komutlar birbirine çok yakındır (pnpm add, pnpm install, pnpm run). Fark, paketlerin diske yerleşimindedir. Bu katılık, hoisting'e güvenen eski paketlerdeki gizli hataları ortaya çıkarabilir; bu durumlar için pnpm'in yerleşimi gevşeten ayarları vardır.
Önemli noktalar
- pnpm paketleri npm deposundan kurar, ama her paket sürümünü bir kez saklar ve projelere bağlar.
- Disk alanından tasarruf sağlar ve tekrarlanan kurulumları hızlandırır.
- Yalnızca tanımlanmış bağımlılıklara erişilebilir; bu da hayalet bağımlılıkları önler.
- Workspace'ler ve
--filteronu monorepo'larda popüler yapar. - Sürüm 10'dan beri bağımlılıkların kurulum script'leri yalnızca siz izin verirseniz çalışır.
Örnek
pnpm install # install from pnpm-lock.yaml (npm install)
pnpm add react # add a dependency (npm install react)
pnpm add -D typescript # add a dev dependency
pnpm dlx create-vite # run a package once (npx create-vite)
pnpm --filter web build # in a monorepo, run "build" only in the "web" package
pnpm approve-builds # choose which dependencies may run install scripts
pnpm store path # show where the shared store is on diskSık sorulan sorular
pnpm, npm'den hızlı mı?
Tekrarlanan kurulumlarda genellikle evet: depoda zaten bulunan dosyalar yeniden indirilip kopyalanmak yerine bağlanır. Ne kadar hızlı olduğu projeye ve deponun önceden dolu olup olmadığına bağlıdır.
Hayalet bağımlılık (phantom dependency) nedir?
Kodunuzun package.json içinde listelemeden import ettiği bir pakettir. Yalnızca başka bir bağımlılık onu kurduğu ve paket yöneticisi onu node_modules klasörünün en üstüne taşıdığı için çalışır; o bağımlılık değişince bozulur. pnpm'in yerleşimi bu tür import'ların hemen hata vermesini sağlar.
Var olan bir npm projesini pnpm'e geçirebilir miyim?
Evet. pnpm import, var olan bir package-lock.json ya da yarn.lock dosyasından pnpm-lock.yaml oluşturur; gerisini pnpm install halleder. Düz bir node_modules bekleyen birkaç eski araç, pnpm'in hoisting ayarlarına ihtiyaç duyabilir.
İlgili sayfalar
- npmWeb Geliştirme, s. 39npm, 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.
- YarnWeb Geliştirme, s. 72Yarn, npm'e alternatif bir JavaScript paket yöneticisidir; bağımlılıkları npm deposundan kurar, lockfile, workspace ve Plug'n'Play desteği sunar.
- Paket YöneticisiProgramlamanın Temelleri, s. 48Paket yöneticisi, yazılım paketlerini ve onların bağımlılıklarını kuran, güncelleyen ve kaldıran, sürümleri otomatik olarak çözen bir araçtır.
- MonorepoSürüm Kontrolü, s. 31Monorepo, uygulamalar, servisler ve paylaşılan kütüphaneler gibi birçok projenin kodunu birlikte yönetilen tek bir sürüm kontrol deposunda tutma yaklaşımıdır.
- Node.jsBackend ve API'ler, s. 33Node.js, JavaScript'i tarayıcı dışında çalıştıran, en çok web sunucuları, API'ler ve komut satırı araçları için kullanılan açık kaynaklı çalışma ortamıdır.
- Tedarik Zinciri SaldırısıGüvenlik, s. 50Tedarik zinciri saldırısı, uygulamanın kendisini değil, açık kaynak paketi, derleme aracı veya güncelleme sunucusu gibi dayandığı bir bileşeni ele geçirir.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin