pnpm vs bun install Karşılaştırması

Content-addressable store, sıkı izolasyon, olgun tedarik-zinciri denetimi

VS
bun install

Rust çekirdekli, hızlı, tek-araç Bun runtime'ının kurulum bileşeni

16 dk okumaAraçlar

Hızlı Karar

Kesin bir kazanan yok; iki araç farklı önceliklere optimize ediyor. Runtime'dan bağımsız kalmak ve politikayı her lockfile-değiştiren komutta denetlemek istiyorsan pnpm'i seç. Zaten Bun'ı runtime olarak kullanıyorsan ve global virtual store'un disk/hız kazancı kritikse bun install cazip. İkisi de postinstall'ı varsayılan bloke ediyor; fark denetim noktalarının yerinde. Aynı repoda ikisini karıştırma — tek lockfile, tek doğruluk kaynağı.

pnpmbun install
Tam sonucu oku

Puan Karşılaştırması

Grafik yükleniyor...

Detaylı Puanlama

Detaylı Puanlama: pnpm ve bun install — kategori bazında 10 üzerinden puanlar
Kategoripnpmbun install
Performans
8/10
9/10
Öğrenme Kolaylığı
7/10
8/10
Ekosistem
9/10
6/10
Topluluk
8/10
7/10
İş Pazarı
7/10
6/10
Gelecek
8/10
8/10

Artıları & Eksileri

pnpm

Artıları

  • Content-addressable store sayesinde aynı paket sürümü diskte tek kopya tutulur, disk kullanımı düşer
  • Strict node_modules yapısı phantom dependency'yi varsayılan olarak, ek yapılandırma gerektirmeden engeller
  • 12.2-12.3 ile --trust-lockfile/--trust-policy artık remove ve update komutlarında da zorunlu kılınabiliyor
  • allowBuilds allowlist'i ile postinstall script'leri açık, denetlenebilir bir listeye bağlı (pnpm 10'da onlyBuiltDependencies, v11'den beri allowBuilds)
  • Turborepo, Nx ve Changesets ile yılların içinde olgunlaşmış workspace entegrasyonu
  • Node.js üzerinde çalıştığı için runtime seçiminden bağımsız, projeyi tek bir araca kilitlemiyor
  • catalog: alanı ile monorepo genelinde ortak bağımlılık sürümleri merkezi yönetiliyor
  • 12.x itibariyle çekirdek Rust'a yeniden yazıldı, workspace keşfi ve lockfile parse paralel çalışıyor

Eksileri

  • Symlink tabanlı node_modules yapısı bazı eski/naif Node araçlarıyla (strict olmayan resolution bekleyenler) uyumsuzluk çıkarabiliyor
  • allowBuilds allowlist'ini elle doldurmak, yeni bir native-build gerektiren paket eklendiğinde ek bir adım demek
  • Bun'ın yayımladığı hız ölçümleri kendi linker'larına göre yapıldı; pnpm'in bu ölçekteki konumunu görmek için kendi repo'nda ölçüm alman gerekiyor
  • Kendi runtime'ı yok — kurulum + çalıştırma + test tek araçtan gelen bütünleşik deneyim sunmuyor
  • Store'un CI cache stratejisine doğru şekilde dahil edilmesi (pnpm store path) elle bir kurulum adımı gerektiriyor

En Uygun

Node.js üretim ortamı olan, runtime'dan bağımsız kalmak isteyen ekiplerTurborepo veya Nx ile orkestre edilen büyük monorepo'larTedarik zinciri politikasını lockfile'ı değiştiren her komutta denetlemek isteyen regülasyonlu projelerDisk alanı kısıtlı CI runner'ları veya çok sayıda benzer projeye sahip organizasyonlarVar olan npm/Yarn projelerinden düşük riskli, kademeli bir geçiş arayan ekipler

bun install

Artıları

  • Bun 1.4 ile opt-in global virtual store, --linker=isolated modunda kurulumları belirgin şekilde hızlandırıyor
  • Postinstall script'leri varsayılan olarak bloklanır, trustedDependencies allowlist'i tedarik zincirini açık şekilde denetler
  • --offline ve --prefer-offline bayraklarıyla CI/air-gapped kurulum senaryoları net bir şekilde ifade edilebiliyor
  • isolated installs modu phantom dependency'yi pnpm'e benzer bir yaklaşımla mimari olarak engelliyor
  • bun.lock metin tabanlı lockfile formatı (v1.2+ varsayılan) PR review'da okunabilir diff üretiyor
  • Kurulum, runtime ve test koşucusu tek araçtan geldiği için greenfield Bun projelerinde bütünleşik bir deneyim sunuyor
  • bun install --filter ile workspace bazlı kurulum filtreleme native olarak destekleniyor

Eksileri

  • Global virtual store varsayılan kapalı ve yalnız isolated linker ile çalışıyor; kazancı görmek için bunfig.toml'da açıkça açman gerekiyor
  • Isolated linker yalnız yeni workspace/monorepo projelerinde (configVersion = 1) varsayılan; tek-paket projelerde ve v1.3.2 öncesi mevcut projelerde varsayılan hoisted kaldığı için phantom dependency riski elle kapatılmalı
  • Turborepo/Nx gibi araçlarla entegrasyon, pnpm'inkine kıyasla daha kısa bir olgunlaşma geçmişine sahip
  • Bun'ın yerleşik trustedDependencies varsayılan allowlist'i yalnızca npm kaynaklı paketleri kapsıyor; file:/link:/git:/github: bağımlılıkları elle eklenmeli
  • Kurulum aracı Bun runtime'ının bir parçası olduğu için, farklı bir JS runtime'a geçiş isteyen ekipler için araç bağımlılığı oluşturuyor
  • Eski ikili bun.lockb formatından yeni metin tabanlı bun.lock'a geçiş, mevcut projelerde ek bir migrasyon adımı gerektiriyor

En Uygun

Zaten Bun runtime'ını üretimde kullanan ekiplerKurulum hızının ve CI önbellekleme kontrolünün kritik olduğu greenfield projelerOffline/air-gapped CI ortamlarında net bayrak kontrolü isteyen takımlarTek araçtan kurulum + çalıştırma + test bekleyen küçük-orta ölçekli Bun-only projeler

Kod Karşılaştırması

pnpm
// pnpm 12.3 — allowBuilds ile denetimli kurulum ve workspace filtreleme
// package.json (kök)
{
  "name": "monorepo-root",
  "private": true,
  "packageManager": "[email protected]"
}

// pnpm-workspace.yaml — allowBuilds v10.26.0'da geldi; v11'de eski adlar (onlyBuiltDependencies vb.) kaldirildi
packages:
  - "apps/*"
  - "packages/*"

allowBuilds:
  esbuild: true
  sharp: true
  core-js: false

catalog:
  react: ^19.2.3
  typescript: ^5.7.0

// CI install adımı (GitHub Actions)
- name: Install dependencies
  run: pnpm install --frozen-lockfile --trust-policy=no-downgrade

// Paketi kaldirirken lockfile'in tamami aktif politikalara karsi yeniden dogrulanir
pnpm remove left-pad --filter ./apps/web --trust-lockfile

// Sadece degisen workspace paketlerine kurulum
pnpm install --filter "...[origin/main]"

// Store konumunu CI cache anahtarina eklemek
pnpm store path
bun install
// Bun 1.4 — isolated installs + global virtual store + offline kurulum
// bunfig.toml (kök)
[install]
linker = "isolated"
globalStore = true
exact = false

// package.json
{
  "name": "monorepo-root",
  "private": true,
  "workspaces": ["apps/*", "packages/*"],
  "trustedDependencies": [
    "esbuild",
    "sharp",
    "@prisma/client"
  ]
}

// CI install adimi (GitHub Actions) — kilitli ve offline-uyumlu
- name: Install dependencies
  run: bun install --frozen-lockfile --prefer-offline

// Bloklanan postinstall script'lerini gormek
bun pm untrusted

// Bir paketi guvenilir isaretlemek
bun pm trust sharp

// Belirli workspace paketlerine kurulum
bun install --filter "./apps/web"

// Tamamen offline kurulum (agac hic cikmaz)
bun install --offline

Sonuç

Kesin bir kazanan yok; iki araç farklı önceliklere optimize ediyor. Runtime'dan bağımsız kalmak ve politikayı her lockfile-değiştiren komutta denetlemek istiyorsan pnpm'i seç. Zaten Bun'ı runtime olarak kullanıyorsan ve global virtual store'un disk/hız kazancı kritikse bun install cazip. İkisi de postinstall'ı varsayılan bloke ediyor; fark denetim noktalarının yerinde. Aynı repoda ikisini karıştırma — tek lockfile, tek doğruluk kaynağı.

Ücretsiz Danışmanlık Al
SSS

Sıkça Sorulan Sorular

Senaryoya göre değişir. Bun'ın yayımladığı ölçüm kendi linker'ları arasında: 1.400 paketlik bir React/webpack/Babel/jest fixture'ında sıcak kurulum hoisted linker'da 823,9 ms, isolated linker + global store'da 124,8 ms (Apple Silicon macOS, hyperfine). pnpm'in content-addressable store'u da sıcak kurulumlarda diskten okumaya dayanıyor, yani ikisi de doğru koşullarda hızlı. İki araç arasındaki farkı kendi repo boyutun ve CI cache stratejinle ölçmelisin — tek bir fixture sonucunu kendi monorepo'na taşıma.

Giriş

JavaScript ekosisteminde paket kurulumu artık sadece "hızlı mı" sorusuyla değil, "güvenli mi" sorusuyla da ölçülüyor. pnpm, content-addressable store'u ve sıkı node_modules yapısıyla yıllardır phantom dependency'lere karşı duruyor; 12.2-12.3 çifti bu duruşu öteye taşıdı — pnpm remove ve pnpm update artık --trust-lockfile ve --trust-policy bayraklarını alıyor, yani lockfile bütünlüğü yalnız kurulum anında değil, her lockfile-değiştiren komutta doğrulanıyor. Bun ise 1.4 ile başka bir cepheden geldi: Zig'den Rust'a yeniden yazılan çekirdek ve opt-in global virtual store, sıcak kurulumu kendi hoisted linker'ına göre belirgin biçimde hızlandırdı. İkisi de postinstall script'lerini varsayılan olarak engelliyor — pnpm allowBuilds allowlist'iyle, Bun trustedDependencies allowlist'iyle. Seni ilgilendiren asıl soru şu: hangisini seçersen seç, tek lockfile'a ve tek doğruluk kaynağına sadık kalmalısın; ikisini karıştırmak CI'da yeniden üretilemeyen kurulumlara davetiye çıkarır.

Karşılaştırma Matrisi

Karşılaştırma Matrisi: pnpm / bun install
Özellikpnpmbun install
GitHub yıldızı36.65096.041 (Öne çıkan)
Store mimarisiContent-addressable + global virtual store (opt-in, v10.12.1+)Global virtual store (opt-in, isolated linker)
Varsayılan lockfile formatıpnpm-lock.yaml (YAML)bun.lock (metin, v1.2+ varsayılan)
Postinstall script politikasıVarsayılan kapalı, allowBuilds allowlistVarsayılan kapalı, trustedDependencies allowlist
remove/update'te trust-policy doğrulamaVar (12.2-12.3) (Öne çıkan)Trust-policy eşdeğeri yok; farklı bir kontrol olarak minimumReleaseAge var
Phantom dependency korumasıKoşulsuz varsayılan (strict node_modules) (Öne çıkan)Yeni workspace'te varsayılan (configVersion 1); tek paket + v1.3.2 öncesi projede opt-in (--linker=isolated)
Offline kurulum bayrağı--offline / --prefer-offline (açık)--offline / --prefer-offline (açık)
Runtime bağımsızlığıNode.js üzerinde, runtime-agnostic (Öne çıkan)Bun runtime'ının parçası (node_modules Node ile de çalışır)
Monorepo filtrelemepnpm --filter + catalog:bun install --filter
Turborepo/Nx/Changesets olgunluğuUzun süredir yerleşik (Öne çıkan)Destekleniyor, daha kısa geçmiş
Çekirdek implementasyon diliRust (12.0 ile yeniden yazıldı)Rust (1.4 ile Zig'den yeniden yazıldı)

Derinlemesine İnceleme

pnpm

Genel Bakış

pnpm ("performant npm"), npm ve Yarn'ın disk ve node_modules tasarımına alternatif olarak doğdu: her paket sürümünü diskte tek bir content-addressable store'da tutar, projenin node_modules'ü bu store'a hard link veya symlink ile bağlanır. Bu mimari hem disk kullanımını düşürür hem de iç içe symlink yapısı sayesinde phantom dependency'leri — bir paketin kendi bildirmediği bir alt-bağımlılığa erişmesini — varsayılan olarak engeller. pnpm 10.0.0 ile bağımlılıkların lifecycle script'leri varsayılan olarak koşulmaz hale geldi; build izni v11'den beri allowBuilds allowlist'iyle veriliyor. pnpm 12.0 çekirdeği Rust'a yeniden yazdı; Eylül 2026'daki 12.2-12.3 çifti workspace keşfini paralelleştirdi ve trust-policy denetimini remove/update komutlarına genişletti — bir paketi kaldırırken bile lockfile'ın tamamı aktif politikalara karşı yeniden doğrulanıyor.

Ekosistem

Paket yöneticisi
pnpm (kendisi)
Geliştirme ortamı
VS CodeWebStormNeovim + LSP
Popüler kütüphaneler
TurborepoNxChangesetsViteVitest
GitHub yıldızı
36,650

bun install

Genel Bakış

Bun; runtime, bundler, test koşucusu ve paket yöneticisini tek bir binary'de birleştiren bir araç olarak 2023'te tanıtıldı. bun install, npm'in package.json/node_modules sözleşmesiyle uyumlu ama kendi çözümleme ve extraction motorunu kullanır. Erken sürümlerde varsayılan davranış klasik (hoisted) kopyalamaydı; v1.3.2 ile isolated linker yeni workspace/monorepo projelerinin (configVersion = 1) varsayılanı oldu, 1.4 ise Bun'ı Zig'den Rust'a taşıdı ve opt-in bir global virtual store getirdi (globalStore, yalnız isolated linker ile) — paketler cache'e bir kez extract edilir, her projenin node_modules'ü oraya symlink'lenir. Güvenlik tarafında Bun postinstall script'lerini varsayılan olarak koşturmaz; yalnızca trustedDependencies allowlist'indeki paketler script çalıştırabilir, liste bun pm untrusted ve bun pm trust ile yönetilir. Metin tabanlı bun.lock v1.2'den beri varsayılan format. Workspace desteği native; --filter ile kurulum belirli paketlere sınırlanır.

Performans Metrikleri

Ekosistem

Paket yöneticisi
bun install (kendisi)
Geliştirme ortamı
VS Code + Bun extensionWebStormZed
Popüler kütüphaneler
TurborepoNxElysiaHono
GitHub yıldızı
96,041

Teknik Analiz

Kurulum Süresi ve Disk Kullanımı: Content-Addressable Store'a Karşı Global Virtual Store

pnpm'in mimarisi baştan beri aynı: her paket sürümü diskte tek bir content-addressable store'da tutulur, projenin node_modules'ü buraya hard link (aynı disk) veya symlink ile bağlanır. Aynı paketi 50 projede kullanıyorsan diskte bir kopya vardır, elli değil — pnpm'in sıcak kurulum avantajı büyük ölçüde buradan gelir. pnpm bunun üstüne v10.12.1'de opt-in bir global virtual store ekledi (enableGlobalVirtualStore; v11.23.0'dan beri kanonik yazımı virtualStoreType: global): açıldığında proje node_modules'ü, makine genelinde paylaşılan tek bir sanal store'a symlink'lenir. Bun tarihsel olarak kendi cache'inden node_modules'e kopyalama yapıyordu; Bun 1.4 bunu değiştirdi ve --linker=isolated + globalStore = true ile kavramsal olarak aynı modele geçti — paketler cache'e bir kez extract edilir, node_modules/.bun/<pkg>@<ver> oraya symlink'lenir. Sana pratik anlamı şu: "paylaşılan store" iki araçta da bir tercih, varsayılan değil. Bun'ın varsayılan --linker=hoisted modunda kalırsan disk avantajını görmezsin; pnpm'de global store'a geçmek ayrı bir karardır. Hangi modu seçersen CI'da da onu sabitle, aksi halde local'de hızlı olan kurulum runner'da farklı davranır.

Lockfile Formatı ve CI Determinizmi

pnpm'in pnpm-lock.yaml'ı yıllardır aynı: insan tarafından incelenebilir YAML, dependency graph'ı ve entegrite hash'lerini tutar. 12.2-12.3'te pnpm bu dosyayı daha akıllıca okumaya başladı — workspace projeleri keşfedilirken lockfile paralel parse ediliyor ve resolver artık dosyanın tamamını kopyalamadan başlıyor, yani büyük monorepo'larda pnpm install başlangıç maliyeti düşüyor. Bun tarafında hikaye daha yakın tarihli: bun.lock metin tabanlı lockfile'ı v1.1.39'da tanıtıldı ve Bun 1.2'de önceki ikili bun.lockb formatının yerini alan varsayılan oldu — artık git diff ile okunabilir, PR review'da lockfile değişikliğini görebilirsin. İki tarafta da determinizm kuralı aynı: CI'da --frozen-lockfile (pnpm) veya bun install --frozen-lockfile kullanmadan build almak, lockfile'ın sessizce güncellenmesine ve "local'de çalışıyordu" sürprizlerine kapı açar. Dikkat etmen gereken şey lockfile'ı repo'ya commit etmek kadar, hangi paket yöneticisinin lockfile'ını .gitignore'a alacağın: pnpm-lock.yaml ve bun.lock aynı repoda aynı anda var olursa hangisinin doğruluk kaynağı olduğu belirsizleşir.

Tedarik Zinciri Güvenliği: Trust Bayrakları ve Postinstall Politikası

İki aracın felsefesi burada ayrışıyor. pnpm 10.0.0'dan beri bağımlılıkların lifecycle script'leri koşulmuyor; izin vermek istediğin paketi pnpm-workspace.yaml'daki allowBuilds haritasına esbuild: true gibi eklemelisin (allowBuilds v10.26.0'da geldi; eski ad onlyBuiltDependencies v11'de kaldırıldı). 12.2-12.3 denetimi genişletti: pnpm remove ve pnpm update artık --trust-lockfile, --trust-policy, --trust-policy-exclude ve --trust-policy-ignore-after bayraklarını da alıyor; pnpm remove ise lockfile'ın TAMAMINI aktif politikalara karşı yeniden doğruluyor. Bun aynı hedefe başka yoldan gidiyor: bun install postinstall script'lerini varsayılan bloklar, yalnızca trustedDependencies allowlist'indeki paketler script koşturabilir; bloklananları bun pm untrusted ile görür, bun pm trust ile işaretlersin. Bun'da bir kontrol daha var: bunfig.toml [install] altında minimumReleaseAge, verilen saniye eşiğinden yeni yayımlanmış npm sürümlerini eliyor (varsayılan null, kapalı); minimumReleaseAgeExcludes paketleri muaf tutuyor. Pratik fark: pnpm politikayı lockfile'ı değiştiren her komutta zorunlu kılıyor, Bun'ın modeli kurulum anına ve sürüm yaşına odaklı.

Monorepo/Workspace Desteği ve Filtreleme

pnpm workspaces uzun süredir monorepo'nun referans noktalarından biri: pnpm-workspace.yaml ile proje desenleri tanımlanır, --filter ile paket adı/dizin/değişiklik-bazlı seçim yapılır, catalog: alanı ortak bağımlılık sürümlerini merkezi bir yerden yönetir. 12.2-12.3'te workspace desenleri artık eşzamanlı probe ediliyor ve bulunan package.json dosyaları paralel okunuyor — literal dizinler ve sondaki * içeren desenler için kısayol var, dependency graph çalışma başına bir kez kuruluyor (öncesinde iki kez kuruluyordu). Aynı sürümde catalog'lar workspace: protokolünü öğrendi, yani bir catalog girdisi artık workspace içi bir paketi işaret edebiliyor. Bun workspaces da native: kök package.json'da workspaces alanı tanımlanır, bun install --filter <desen> ile belirli workspace'lere kurulum sınırlanır. Fark, etraflarındaki araç ekosisteminde: pnpm workspace'leri Turborepo, Nx, Changesets gibi araçlarla yıllardır olgunlaşmış entegrasyonlara sahip; Bun'ın workspace deneyimi hızlı ve batteries-included ama görev çalıştırma (task running) tarafı bu araçlar kadar zengin değil — çoğu ekip Bun'ı kurulum motoru, Turborepo/Nx'i orkestrasyon katmanı olarak birlikte kullanıyor.

Peer-Dependency Katılığı ve Phantom Dependency Koruması

pnpm'in imzası burada: node_modules yapısı simetrik değil, iç içe symlink hiyerarşisiyle her paket yalnızca package.json'da bildirdiği bağımlılıklara erişebiliyor. Bir paket, kendi dependencies'inde olmayan ama flat node_modules'te "tesadüfen" erişilebilen bir alt-bağımlılığı (phantom dependency) import edemiyor — pnpm bunu kurulum zamanında mimari olarak engelliyor, ekstra bayrak gerekmiyor. Bun'ın klasik --linker=hoisted modu npm/Yarn'a benzer düz bir node_modules üretiyordu, phantom dependency riski oradaydı; v1.3.2/configVersion ile gelen, 1.4'te global store ile birleşen isolated installs (--linker=isolated) bu riski kapatıyor — resmi dokümantasyon bunu "pnpm'in yaklaşımına benzer sıkı bağımlılık izolasyonu" olarak tanımlıyor. Varsayılanı tarihlendirerek oku: yeni workspace/monorepo projelerinde (lockfile'da configVersion = 1) isolated zaten varsayılan; tek-paket projelerde ve v1.3.2 öncesi açılmış mevcut projelerde (configVersion = 0) varsayılan hoisted kalıyor, izolasyonu --linker bayrağıyla ya da bunfig.toml → [install] linker = "isolated" ile açıkça seçmelisin. pnpm'de bu davranış proje tipinden bağımsız varsayılan; böyle bir ayrım yapmana gerek yok.

CI Önbellekleme, Docker Layer Uyumu ve Offline Kurulum

CI'da kurulum süresi genelde iki şeye bağlı: cache hit oranı ve offline davranışı. İkisinin de açık bayrakları var, üstelik iki araçta da aynı adlarla. Bun tarafında bun install --offline ağa hiç çıkmadan yalnız cache'ten kurar, --prefer-offline ise cache'te varsa onu kullanır, yoksa ağa düşer. pnpm'de aynı ikili birebir mevcut: pnpm install --offline yalnızca store'da hazır olan paketleri kullanır ve bir paket yerelde bulunamazsa kurulum hata verir; --prefer-offline cache'lenmiş veri için tazelik kontrollerini atlar, eksik olanı sunucudan ister. Yani "ağa çıkma" garantisi bir araca özgü değil — asıl ayrım, cache/store'u CI'da nasıl geri yüklediğinde. pnpm'de store diskte kalıcı olduğu için runner'da store dizinini (örn. GitHub Actions'ta actions/cache ile) cache'lemek yaygın pratiktir; konumu pnpm store path ile öğrenip cache anahtarına eklersin. Bun tarafında aynı iş global cache dizini için yapılır. Docker katman uyumunda disiplin ikisinde de aynı: önce yalnız package.json + lockfile'ı kopyala, kurulumu çalıştır, sonra kaynak kodu kopyala — böylece kaynak değişse bile bağımlılık layer'ı cache'ten gelir.

Ekosistem Araç Uyumu: Turborepo, Nx, Changesets

Bir paket yöneticisi seçimi tek başına yaşamıyor — üzerine kurduğun task runner ve sürüm yönetimi araçlarıyla uyumu belirleyici. pnpm workspaces; Turborepo, Nx ve Changesets ile yıllar içinde olgunlaşmış, geniş kullanılan entegrasyonlara sahip — bu üç araç da pnpm workspace'lerini uzun süredir yaygın bir zemin olarak destekliyor. Bun workspaces bu araçlarla da çalışır, ama entegrasyonun olgunluk süresi pnpm'inkinden kısa, dolayısıyla köşe durumlarda (ör. karma bir monorepo'da bazı paketler pnpm bazıları Bun ile kurulmuşsa) daha az test edilmiş bir zeminde olursun. Pratik öneri: hangi paket yöneticisini seçersen seç, task runner'ını (Turborepo veya Nx) ayrı bir karar olarak değerlendir ve ikisini aynı anda değiştirme — bir değişkeni sabit tutmak, performans regresyonunun hangi araçtan geldiğini ayırt etmeni kolaylaştırır.

Hangi Senaryoda Hangisi

Ekip zaten Bun runtime'ında üretime çıkıyor

Öneri: bun install

Aynı araç zincirini korumak tek-araç sadeliği sağlar; global virtual store ve --offline bayrakları CI'da doğrudan fayda sağlar.

Node.js üretim ortamı + karma geliştirici araç tercihleri

Öneri: pnpm

Runtime'dan bağımsız kalman gerekiyor; pnpm hangi runtime'ı kullanırsan kullan aynı node_modules yapısını üretir.

Büyük monorepo, Turborepo veya Nx ile orkestre ediliyor

Öneri: pnpm

catalog: ve --filter kombinasyonu, yıllardır olgunlaşmış Turborepo/Nx/Changesets entegrasyonlarıyla daha az köşe durumu üretiyor.

Tedarik zinciri politikasını en katı şekilde denetlemek gerekiyor (finans/regülasyonlu sektör)

Öneri: pnpm

--trust-lockfile/--trust-policy artık remove ve update komutlarında da zorunlu kılınabiliyor; lockfile'ı değiştiren her adım denetleniyor.

CI'da air-gapped/offline kurulum gerekiyor

Öneri: İkisi de uygun — cache/store restore stratejine göre seç

Her iki araçta da --offline ve --prefer-offline bayrakları var; belirleyici olan CI'da Bun cache'ini mi yoksa pnpm store'unu mu güvenilir şekilde geri yüklediğin.

Greenfield, Bun-only küçük-orta ölçekli proje

Öneri: bun install

Kurulum + runtime + test koşucusu tek araçtan geliyor; workspace desteği yeterli, entegre hikaye sade.

Aynı repoda hem pnpm hem Bun lockfile'ı görülüyor

Öneri: Tek araca konsolide et

İki lockfile aynı anda doğruluk kaynağı olamaz; biri diğerini sessizce bozabilir, CI'da hangi aracın çalıştığı belirsizleşir.

Yaygın Tuzaklar

  • pnpm'de bir paketin build script'i allowBuilds'e eklenmeden 'neden derlenmiyor' diye saatlerce debug etmek

    pnpm

    Çözüm

    Kurulum sonrası 'Ignored build scripts' uyarısını oku; native modül gerektiren paketleri (esbuild, sharp, node-gyp tabanlılar) pnpm-workspace.yaml → allowBuilds haritasına <paket>: true olarak ekle.

  • Bun'da bir paketin postinstall'ı sessizce bloklanmış, uygulama runtime'da 'binary bulunamadı' hatası veriyor

    bun install

    Çözüm

    bun pm untrusted ile bloklanan script'leri listele, gerçekten güvendiğin paketi bun pm trust <paket> ile işaretle veya trustedDependencies'e ekle.

  • Aynı repoda hem pnpm-lock.yaml hem bun.lock commit edilmiş, iki geliştirici farklı araçla kurulum yapıp farklı node_modules üretiyor

    Her ikisi

    Çözüm

    Tek lockfile'a karar ver, diğerini .gitignore'a ekle ve CI'da yanlış aracın çalışmasını engelleyen bir preinstall kontrolü (örn. only-allow) kullan.

  • Bun'da hoisted varsayılanın geçerli olduğu bir projede (tek paket ya da v1.3.2 öncesi açılmış, configVersion = 0) phantom dependency'ye güvenen kod yazılıp isolated linker'a geçince production'da kırılıyor

    bun install

    Çözüm

    Projenin hangi varsayılanla koştuğunu lockfile'daki configVersion'dan doğrula; isolated değilse bunfig.toml → [install] linker = \"isolated\" ile en baştan sabitle, phantom dependency kullanan import'ları statik analizle (ör. depcheck) tara.

  • CI'da --frozen-lockfile bayrağı unutulup lockfile'ın sessizce güncellenmesi, 'local'de çalışıyordu' sürprizine yol açıyor

    Her ikisi

    Çözüm

    Bayrak her iki araçta da aynı: CI install adımını daima --frozen-lockfile ile çalıştır; lockfile diff'i PR'da göze çarpsın.

Geçiş Kılavuzu

pnpm ↔ bun install Geçişi

Tahmini süre: Küçük proje (tek paket, az bağımlılık): birkaç saat. Orta ölçekli monorepo (5-20 workspace paketi): 1-3 gün. Büyük monorepo (Turborepo/Nx + çok sayıda postinstall gerektiren paket): 1-2 hafta (allowlist denetimi ve CI doğrulaması dahil).
  1. 11. Mevcut lockfile'ı (pnpm-lock.yaml veya bun.lock) commit geçmişinde referans olarak sakla, henüz silme.
  2. 22. Lifecycle script gerektiren bağımlılıkları listele (pnpm-workspace.yaml → allowBuilds veya package.json → trustedDependencies) — hedef araca taşınacak allowlist bu.
  3. 33. Yerel bir branch'te eski lockfile'ı sil, hedef araçla (pnpm install veya bun install) sıfırdan kurulum yap ve yeni lockfile'ı üret.
  4. 44. Yeni allowlist'i (allowBuilds ↔ trustedDependencies) doldur; kurulum sırasında bloklanan script uyarılarını tek tek gözden geçir.
  5. 55. Workspace filtreleme komutlarını CI script'lerinde güncelle (pnpm --filter ↔ bun install --filter), catalog: kullanan sürüm referanslarını hedef araca uyarla.
  6. 66. CI pipeline'ını --frozen-lockfile ile çalışacak şekilde güncelle — bayrak her iki araçta da aynı; Docker layer sırasını (lockfile önce, kaynak kod sonra) koru.
  7. 77. Eski aracın lockfile'ını .gitignore'a ekle, README/CONTRIBUTING'de tek doğruluk kaynağının hangi araç olduğunu belgele.

Gelecek Öngörüsü

pnpm

pnpm'in 12.x hattı Rust'a yeniden yazılan çekirdekle performans odaklı ilerliyor; 12.2-12.3 workspace keşfini paralelleştirdi ve trust-policy denetimini remove/update komutlarına genişletti. Trend, tedarik-zinciri denetimini kurulum anından lockfile'ı değiştiren her komuta yaymak yönünde; bu katmanın nereye kadar genişleyeceğine dair resmi bir yol haritası duyurulmuş değil.

bun install

Bun'ın kurulum tarafı 1.4/1.4.1 ile pnpm'e yaklaşan bir izolasyon modeline (global virtual store, isolated linker) geçti; resmi blog bu değişimi 'daha hızlı, daha güvenli varsayılanlar' çizgisinde tanımlıyor. Isolated installs yeni workspace/monorepo projelerinde (configVersion = 1) zaten varsayılan hale geldi; tek-paket projelerde ve v1.3.2 öncesi açılmış mevcut projelerde varsayılan hâlâ hoisted ve global store'un varsayılana döneceği bir tarih resmi olarak duyurulmuş değil.

Altın Bilgi

Bu iki aracı yan yana koyunca gördüğüm şu: 2026'nın paket yöneticisi rekabeti "kim daha hızlı" sorusundan "kim güvenlik denetimini nereye yerleştiriyor" sorusuna kaydı. pnpm'in trust-policy denetimini remove ve update komutlarına kadar genişletmesi, "kurulumda bir kere kontrol et, sonra güven" modelinin yetersiz kaldığının kabulü. Bun aynı hedefe hızdan ödün vermeden gidiyor: postinstall kapalı başlar, isolated installs phantom dependency'yi mimari olarak kapatır. İkisi de aynı sonuca varıyor: "install" artık pasif bir adım değil, kod tabanına neyin gireceğine dair karar noktası. Senin gerçek sorun hangi araç değil; bu noktayı kim, ne zaman, hangi allowlist'le denetleyecek.

İlgili Blog Yazıları

Tüm Yazıları Gör

İlgili Projeler

Tüm Projeleri Gör

İlgili İçerik