Merhaba arkadaşlar, bugün sizlere projelerimizin olmazsa olmazı, bazen de başımızın belası olan paket yöneticilerinden bahsedeceğim. Özellikle büyük ölçekli bir React + Node.js projesine geçtiğimde, `npm install`'ın çözümleme süresi ve `node_modules`'in kapladığı devasa alan beni ciddi anlamda düşündürmeye başlamıştı. "Acaba daha hızlı ve daha az yer kaplayan bir yol var mı?" diye araştırırken, Yarn ve PNPM ile tanıştım. İşte bu üçlü arasında yaptığım performans ve disk kullanımı karşılaştırması ve nihai tercihim.
Neden Bu Karşılaştırmayı Yapma İhtiyacı Hissettim?
Şöyle bir senaryo düşünün: Takım arkadaşınız yeni bir branch oluşturdu ve siz projeyi çekip `npm install` çalıştırdınız. Kahvenizi alıp geldiğinizde hala çözümleme devam ediyor... Ya da bilgisayarınızda onlarca proje var ve her birinin `node_modules`'i 300-400 MB yer kaplıyor. SSD'niz feryat figan ediyor. İşte tam da bu noktada, paket yöneticisi seçiminin sadece bir komut olmadığını, geliştirici deneyimini ve sistem kaynaklarını doğrudan etkilediğini fark ettim.
Test Ortamım ve Metodoloji
Karşılaştırmayı adil yapabilmek için orta ölçekli bir Next.js projesi (yaklaşık 150 dependency) seçtim. Her test öncesi cache'leri temizledim ve `package-lock.json`, `yarn.lock`, `pnpm-lock.yaml` dosyalarını sıfırdan oluşturdum. Ölçtüğüm iki ana metrik vardı: 1) `install` komutunun toplam süresi, 2) Kurulum sonrası `node_modules` klasörünün diskte kapladığı alan.
Hız Testi Sonuçları: NPM, Yarn ve PNPM
İlk sırada, geleneksel olan NPM vardı. Cache temizlendikten sonraki ilk kurulum inanılmaz derecede yavaştı. Her dependency için ağ bağlantısı ve çözümleme süreci gözle görülür şekilde uzun sürüyordu.
Ardından Yarn (Classic v1) denedim. Paralel indirme ve daha akıllı caching mekanizması sayesinde NPM'e göre belirgin bir hız farkı hissettim. Özellikle takım içinde aynı versiyonun kullanılması için `yarn.lock` dosyasının tutarlılığı çok değerli.
Ve son olarak PNPM... Arkasındaki "content-addressable storage" mantığını ilk duyduğumda kafam karışmıştı ama sonuçlar konuşuyordu. Aynı paketi farklı projeler arasında paylaşarak ve hardlink'ler kullanarak inanılmaz bir hız ve disk tasarrufu sağlıyordu.
Gördüğünüz gibi, PNPM açık ara öndeydi.
Disk Kullanımı: En Büyük Sürpriz Burada!
Hız önemli ama beni asıl şaşırtan disk kullanımı oldu. Aynı proje için:
- NPM `node_modules`: ~450 MB
- Yarn `node_modules`: ~430 MB
- PNPM `node_modules`: ~180 MB
Evet, yanlış okumadınız! PNPM, diğerlerinin neredeyse yarısından daha az alan kapladı. Bunun sebebi, global bir depoda (genellikle `~/.pnpm-store`) paketleri saklayıp, projelerinize sembolik link (hardlink) ile bağlaması. Aynı pakete sahip 10 projeniz varsa, diskte sadece 1 kopyası duruyor. Bu özellikle CI/CD ortamlarında ve geliştirici makinalarında devrim niteliğinde.
Benim Nihai Tercihim ve Geçiş Süreci
Hız ve disk tasarrufu benim için çok kritik olduğu için tercihim PNPM'den yana oldu. Geçiş süreci de oldukça basitti:
1. Global olarak PNPM'yi kurmak: `npm install -g pnpm`
2. Mevcut projede `package-lock.json` veya `yarn.lock` dosyasını silmek.
3. `pnpm import` komutu ile mevcut lock dosyasından dependency'leri almak (ya da direkt `pnpm install`).
4. Script'leri `package.json`'da `pnpm` komutuna göre güncellemek. Örneğin: `"dev": "pnpm dev"`
Önemli Uyarı: Bazı eski paketler veya `postinstall` script'leri PNPM'in katı modül yapısıyla (non-flat node_modules) sorun çıkarabilir. Ancak son dönemdeki paketlerin neredeyse hepsi uyumlu. Ayrıca, `shamefully-hoist = true` ayarını `.npmrc` dosyasına ekleyerek, bazı sorunları çözebilirsiniz.
Sonuç olarak, PNPM bana hem zaman hem de disk alanı kazandırdı. Özellikle monorepo yapılarında ve çoklu proje geliştirilen ortamlarda kesinlikle denenmeye değer.
Peki ya siz? Hangi paket yöneticisini kullanıyorsunuz ve performans deneyimleriniz neler? Yarn 2/3 (Berry) ile deneyiminiz oldu mu? Yorumlarda buluşalım!
Şöyle bir senaryo düşünün: Takım arkadaşınız yeni bir branch oluşturdu ve siz projeyi çekip `npm install` çalıştırdınız. Kahvenizi alıp geldiğinizde hala çözümleme devam ediyor... Ya da bilgisayarınızda onlarca proje var ve her birinin `node_modules`'i 300-400 MB yer kaplıyor. SSD'niz feryat figan ediyor. İşte tam da bu noktada, paket yöneticisi seçiminin sadece bir komut olmadığını, geliştirici deneyimini ve sistem kaynaklarını doğrudan etkilediğini fark ettim.
Karşılaştırmayı adil yapabilmek için orta ölçekli bir Next.js projesi (yaklaşık 150 dependency) seçtim. Her test öncesi cache'leri temizledim ve `package-lock.json`, `yarn.lock`, `pnpm-lock.yaml` dosyalarını sıfırdan oluşturdum. Ölçtüğüm iki ana metrik vardı: 1) `install` komutunun toplam süresi, 2) Kurulum sonrası `node_modules` klasörünün diskte kapladığı alan.
İlk sırada, geleneksel olan NPM vardı. Cache temizlendikten sonraki ilk kurulum inanılmaz derecede yavaştı. Her dependency için ağ bağlantısı ve çözümleme süreci gözle görülür şekilde uzun sürüyordu.
Bash:
# NPM ile temiz kurulum zamanı (örnek)
$ time npm ci
real 1m45.23s
user 0m32.11s
sys 0m5.89s
Ardından Yarn (Classic v1) denedim. Paralel indirme ve daha akıllı caching mekanizması sayesinde NPM'e göre belirgin bir hız farkı hissettim. Özellikle takım içinde aynı versiyonun kullanılması için `yarn.lock` dosyasının tutarlılığı çok değerli.
Bash:
# Yarn ile temiz kurulum zamanı
$ time yarn install --frozen-lockfile
real 1m12.45s
user 0m28.45s
sys 0m4.12s
Ve son olarak PNPM... Arkasındaki "content-addressable storage" mantığını ilk duyduğumda kafam karışmıştı ama sonuçlar konuşuyordu. Aynı paketi farklı projeler arasında paylaşarak ve hardlink'ler kullanarak inanılmaz bir hız ve disk tasarrufu sağlıyordu.
Bash:
# PNPM ile temiz kurulum zamanı
$ time pnpm install --frozen-lockfile
real 0m45.67s
user 0m20.12s
sys 0m3.45s
Gördüğünüz gibi, PNPM açık ara öndeydi.
Hız önemli ama beni asıl şaşırtan disk kullanımı oldu. Aynı proje için:
- NPM `node_modules`: ~450 MB
- Yarn `node_modules`: ~430 MB
- PNPM `node_modules`: ~180 MB
Evet, yanlış okumadınız! PNPM, diğerlerinin neredeyse yarısından daha az alan kapladı. Bunun sebebi, global bir depoda (genellikle `~/.pnpm-store`) paketleri saklayıp, projelerinize sembolik link (hardlink) ile bağlaması. Aynı pakete sahip 10 projeniz varsa, diskte sadece 1 kopyası duruyor. Bu özellikle CI/CD ortamlarında ve geliştirici makinalarında devrim niteliğinde.
Hız ve disk tasarrufu benim için çok kritik olduğu için tercihim PNPM'den yana oldu. Geçiş süreci de oldukça basitti:
1. Global olarak PNPM'yi kurmak: `npm install -g pnpm`
2. Mevcut projede `package-lock.json` veya `yarn.lock` dosyasını silmek.
3. `pnpm import` komutu ile mevcut lock dosyasından dependency'leri almak (ya da direkt `pnpm install`).
4. Script'leri `package.json`'da `pnpm` komutuna göre güncellemek. Örneğin: `"dev": "pnpm dev"`
Önemli Uyarı: Bazı eski paketler veya `postinstall` script'leri PNPM'in katı modül yapısıyla (non-flat node_modules) sorun çıkarabilir. Ancak son dönemdeki paketlerin neredeyse hepsi uyumlu. Ayrıca, `shamefully-hoist = true` ayarını `.npmrc` dosyasına ekleyerek, bazı sorunları çözebilirsiniz.
Sonuç olarak, PNPM bana hem zaman hem de disk alanı kazandırdı. Özellikle monorepo yapılarında ve çoklu proje geliştirilen ortamlarda kesinlikle denenmeye değer.
Peki ya siz? Hangi paket yöneticisini kullanıyorsunuz ve performans deneyimleriniz neler? Yarn 2/3 (Berry) ile deneyiminiz oldu mu? Yorumlarda buluşalım!