npm Alternatifi: Yarn ve pnpm Kurulumu ve Kullanımı
Node.js projelerinde npm ile calismaya basladiginizda bir noktada su soruyu kendinize soruyorsunuz: “Neden bu kadar yavas?” Ya da buyuk bir projede ekip arkadasinizin bilgisayarinda calisip sizinkinde calismayan bagimliliklar sorunuyla karsilasiyorsunuz. Iste tam bu noktada Yarn ve pnpm devreye giriyor. Bu yazida her iki aracin ne oldugunu, nasil kurulacagini ve gercek dunya senaryolarinda nasil kullanilacagini ele alacagiz.
npm’in Sorunlari Neler?
npm’i tamamen kotulememek lazim, sonunda ekosistemi ayakta tutan resmi paket yoneticisi. Ama production ortamlarinda ve buyuk takim projelerinde ciddi sikintilara yol aciyor:
- Yavaslik: Ozellikle
node_modulesklasoru silinip yeniden kurulduqunda npm cok yavas kalabiliyor - Disk kullanimi: Her proje kendi
node_modulesdizinine sahip, ayni paket 10 farkli projede 10 kez indiriliyor - Deterministik olmayan yuklemeler:
package-lock.jsonolmadan farkli makinelerde farkli versiyonlar yuklenebiliyor - Guvenlik: Yetersiz izolasyon nedeniyle paketler baska paketlerin dosyalarina erisebiliyor
Bu sorunlarin her birine Yarn ve pnpm farkli cozumler getiriyor.
Yarn Nedir ve Neden Tercih Edilir?
Yarn, Facebook (Meta) tarafindan 2016 yilinda npm’in performans ve guvenilirlik sorunlarina cozum olarak gelistirildi. Bugun iki ana versiyonu var: Yarn Classic (v1) ve Yarn Berry (v2+). Cogu projede hala v1 kullaniliyor ama modern projelerde Berry’ye gecis hizlaniyor.
Yarn’in one cikan ozellikleri:
- Offline cache: Bir kez indirilen paketleri cache’de tutuyor, internet olmadan da yukleyebiliyorsunuz
- Workspaces: Monorepo yapilari icin mukemmel destek
- Plug’n’Play (PnP): Berry ile gelen,
node_modulesolmadan calisabilen devrimsel bir ozellik - Paralel kurulum: Paketleri paralel indirerek kurulum suresini drastik sekilde kisiyor
pnpm Nedir ve Neden Tercih Edilir?
pnpm (performant npm) adinin uzerinde, performans odakli bir paket yoneticisi. 2017’de cikti ama son yillarda ciddi ivme kazandi. Ozellikle disk kullanimi konusunda gercekten carpici rakamlar sunuyor.
pnpm’in farkli calistigi nokta su: Her paketi global bir store’da bir kez sakliyor ve projelerdeki node_modules klasorune hard link veya sembolik link ile baglıyor. Yani 50 projenizde React kullansaniz bile disk’e bir kez yaziliyor.
pnpm’in one cikan ozellikleri:
- Content-addressable storage: Ayni icerige sahip dosyalar diskte bir kez saklanir
- Strict dependency resolution: Projeler sadece
package.json‘da tanimli paketlere erisebilir, hayalet bagimliliklar olusmaz - Monorepo destegi: Workspace ozelligi cok guclu
- npm uyumlulugu: npm script’leri ve komutlariyla buyuk olcude uyumlu
Yarn Kurulumu
Yarn Classic (v1) Kurulumu
En basit yol npm uzerinden global kurulum:
npm install -g yarn
yarn --version
Linux’ta sistem genelinde kurulum icin alternatif olarak:
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install yarn
macOS’ta Homebrew ile:
brew install yarn
Yarn Berry (v2+) Kurulumu
Berry’yi kullanmak icin once Yarn Classic veya npm ile projeyi baslatin, sonra o proje icin Berry’ye geci yapin:
# Once Corepack'i etkinlestirin (Node.js 16.10+ ile geliyor)
corepack enable
# Proje klasorune gelin
mkdir yeni-projem && cd yeni-projem
# Yarn Berry'yi aktive edin
yarn set version berry
yarn --version # 4.x.x gormeli
# Projeyi baslatin
yarn init
Corepack, Node.js ile birlikte gelen ve paket yoneticilerini yonetmenizi saglayan bir arac. Production ortamlarinda bu yaklasim cok daha temiz.
Yarn Temel Kullanimi
Yeni Proje Olusturma ve Paket Kurulumu
# Yeni proje baslat
yarn init
# ya da interaktif olmayan sekilde
yarn init -y
# Paket yukle
yarn add express
# Development dependency yukle
yarn add --dev nodemon jest
# Global paket yukle
yarn global add typescript
# Belirli versiyon yukle
yarn add [email protected]
# Tum bagimliliklari yukle (package.json'dan)
yarn install
# Uretim bagimliliklarini yukle
yarn install --production
Paket Kaldirma ve Guncelleme
# Paket kaldir
yarn remove express
# Tum paketleri guncelle
yarn upgrade
# Belirli paketi guncelle
yarn upgrade lodash
# Interaktif guncelleme (hangi paketi guncellemek istedigini sec)
yarn upgrade-interactive
yarn upgrade-interactive komutu ozellikle buyuk projelerde cok ise yariyor. Hangi paketlerin outdated oldugunu renk kodlu goruyor ve secici sekilde guncelleme yapabiliyorsunuz.
Script Calistirma
# package.json'daki script'i calistir
yarn start
yarn build
yarn test
# Ozel komut calistir
yarn run lint
npm’den farklı olarak Yarn’de yarn start yazmaniz yeterli, yarn run start yazmaya gerek yok.
pnpm Kurulumu
Linux/macOS Kurulumu
# npm uzerinden
npm install -g pnpm
# curl ile direkt kurulum (onerilen)
curl -fsSL https://get.pnpm.io/install.sh | sh -
# Corepack ile (Node.js 16.10+)
corepack enable
corepack prepare pnpm@latest --activate
Kurulumdan sonra shell’inizi yeniden baslatmaniz ya da profil dosyanizi source etmeniz gerekebilir:
source ~/.bashrc # bash kullanicilari icin
source ~/.zshrc # zsh kullanicilari icin
pnpm --version
Windows Kurulumu
# PowerShell uzerinden
iwr https://get.pnpm.io/install.ps1 -useb | iex
# ya da npm ile
npm install -g pnpm
# Chocolatey ile
choco install pnpm
# Winget ile
winget install pnpm.pnpm
pnpm Temel Kullanimi
pnpm komutlari npm ile buyuk olcude uyumlu, gecis surecinde fazla kafa karistirmiyor:
# Proje baslat
pnpm init
# Paket yukle
pnpm add express
# Development dependency
pnpm add -D typescript jest
# Global paket
pnpm add -g nodemon
# Tum bagimliliklari yukle
pnpm install
# Paket kaldir
pnpm remove express
# Script calistir
pnpm start
pnpm run build
# Paketleri guncelle
pnpm update
# Outdated paketleri goster
pnpm outdated
pnpm Store Yonetimi
pnpm’in en guclu ozelligi olan global store’u yonetmek icin:
# Store konumunu goster
pnpm store path
# Store'u temizle (kullanilmayan paketleri sil)
pnpm store prune
# Store'daki paketleri verify et
pnpm store verify
Tipik bir senaryoda 5-6 adet React projesi gelistiriyorsaniz, pnpm olmadan her birinin node_modules klasoru 300-400 MB olabiliyor. pnpm ile bu rakam proje basina 30-50 MB’a kadar dusuyor cunku paylasilan paketler bir kez saklanıyor.
Monorepo Senaryosu: Workspace Kullanimi
Gercek dunya senaryolarinin en yogun oldugu alan monorepo yapilari. Bir backend API’niz, frontend uygulamaniz ve paylasilan utility paketleriniz varsa workspace olmadan cok zor yonetiyorsunuz.
pnpm Workspace Kurulumu
# Proje yapisi
mkdir monorepo-projem && cd monorepo-projem
# Ana package.json olustur
pnpm init
# pnpm-workspace.yaml dosyasi olustur
cat > pnpm-workspace.yaml << EOF
packages:
- 'packages/*'
- 'apps/*'
EOF
# Klasorleri olustur
mkdir -p packages/shared-utils
mkdir -p apps/frontend
mkdir -p apps/backend
# Her paketin package.json'ini olustur
cd packages/shared-utils && pnpm init
cd ../../apps/frontend && pnpm init
cd ../backend && pnpm init
Workspace icerisinde paketler arasi bagimlilik eklemek cok kolaylasıyor:
# Ana dizine don
cd ../../..
# Frontend uygulamasina shared-utils'i ekle
pnpm add shared-utils --filter frontend --workspace
# Tum workspace'lere ortak bagimlilik ekle
pnpm add -D eslint -w
# Sadece backend'de calistir
pnpm --filter backend run build
# Tum uygulamalarda test calistir
pnpm --filter './apps/**' run test
Yarn Workspace Kullanimi
Yarn’de workspace yapisini package.json uzerinden tanimliyorsunuz:
# package.json'a su satiri ekle:
# "workspaces": ["packages/*", "apps/*"]
# Tum workspace'leri yukle
yarn install
# Belirli workspace'de komut calistir
yarn workspace frontend add react react-dom
yarn workspace backend add express
# Tum workspace'lerde script calistir
yarn workspaces run build
CI/CD Ortaminda Kullanim
Production pipeline’larinda hiz ve tekrarlanabilirlik kritik. Her iki arac da bunun icin ozel komutlar sunuyor.
Yarn ile CI Ortami
#!/bin/bash
# CI pipeline script ornegi
# Frozen lockfile ile yukle (lockfile degisikliginde hata ver)
yarn install --frozen-lockfile
# Cache dizinini pipeline'da paylas
# .yarn/cache dizinini CI cache'ine ekleyin
# Test ve build
yarn test --ci
yarn build
--frozen-lockfile parametresi onemli: yarn.lock dosyasinda degisiklik gerektiren bir durum varsa hata veriyor ve sizi zorla commit etmeye ituyor. Bu CI ortamlarinda tutarlilik icin cok degerli.
pnpm ile CI Ortami
#!/bin/bash
# GitHub Actions veya GitLab CI icin pnpm kurulumu
# pnpm yukle
npm install -g pnpm
# Frozen lockfile ile yukle
pnpm install --frozen-lockfile
# Store cache icin PNPM_HOME ortam degiskenini ayarla
# export PNPM_HOME="$HOME/.local/share/pnpm"
# Test
pnpm test
# Build
pnpm build
GitHub Actions’ta pnpm kullanan gercek bir workflow ornegi:
# .github/workflows/build.yml icerigi (bash formatinda gostermek icin)
# pnpm/action-setup@v2 kullanin
# node-version: 20
# pnpm version: 8
# cache: 'pnpm'
# Ardindan su komutlari calistirin:
pnpm install --frozen-lockfile
pnpm run lint
pnpm run test
pnpm run build
Lockfile Farkliliklari ve Takim Calismasinda Onem
Takim projelerinde lockfile yonetimi kritik. Her paket yoneticisi kendi lockfile formatini kullaniyor:
- npm:
package-lock.json - Yarn:
yarn.lock - pnpm:
pnpm-lock.yaml
Onemli kural: Hangi paket yoneticisini secerseniz secin, lockfile’i mutlaka git’e commit edin. Bu dosya olmadan farkli makinelerde farkli versiyonlar yuklenebilir.
Projeye yeni katilan birinin yanlis paket yoneticisi kullanmasini engellemek icin package.json‘a su sekilde bir kural ekleyebilirsiniz:
# package.json'a eklenecek alan:
# "engines": { "node": ">=18.0.0" }
# "packageManager": "[email protected]"
# .npmrc dosyasi olusturarak npm kullanilmasini engelle
echo "engine-strict=true" > .npmrc
# Ya da preinstall script ile
# "preinstall": "npx only-allow pnpm"
only-allow paketi, tanimladiginiz paket yoneticisi disinda biri npm install veya yarn install yapmaya calisirsa acik bir hata mesaji vererek durduruyor. Buyuk takimlarda bu kucuk onlem cok kafa karisikligini engelliyor.
Performans Karsilastirmasi: Gercek Olcumler
Kuru bilgi yerine gercek bir Next.js projesi uzerinden olcum yaparsak:
Orta buyuklukte bir Next.js projesi (yaklasik 800 bagimlilik):
- npm install (cache yok): Ortalama 120-150 saniye
- yarn install (cache yok): Ortalama 70-90 saniye
- pnpm install (cache yok): Ortalama 40-60 saniye
- npm install (cache var): Ortalama 30-40 saniye
- yarn install (cache var): Ortalama 15-20 saniye
- pnpm install (store var): Ortalama 8-12 saniye
Disk kullanimi acisindan, ayni projeyi uc farkli klasorde npm ile kurdugunuzda yaklasik 1.2 GB yer kaplaniyor. pnpm ile ayni senaryo 450-500 MB’a geliyor.
Hangi Aracı Secmeli?
Bu sorunun kesin cevabi yok, ama karar vermeyi kolaylastiracak bazi kriterler sunabilirim:
Yarn secin eger:
- Zaten Yarn kullanan bir ekibe giriyorsaniz
- Berry’nin Plug’n’Play ozelligi sizi cekiyorsa
- Offline gelistirme ortami onemli sizin icin
- Monorepo kuruyorsanuz ve Yarn ekosistemindeki araclara asinsaniz
pnpm secin eger:
- Disk alani sizin icin kritik (bircok proje, CI/CD disk kotasi)
- Strict dependency izolasyonu istiyorsaniz (guvenlik odakli projeler)
- npm’den gecis yapiyorsaniz ve komut satiri uyumluluqu onemsiyorsaniz
- Performans birincil onceliginizse
npm’de kalin eger:
- Kucuk ve basit projeler yapiyorsaniz
- Takim uye sayisi az ve herkes npm’e aliskansa
- Ekstra bir arac ogrenme ve yonetme yukunuz yoksa
Mevcut Projeyi Tasima
npm’den pnpm’e gecis yaparken:
# package-lock.json'i pnpm formatina cevir
pnpm import
# Eski lockfile'i sil
rm package-lock.json
# node_modules'u temizle ve yeniden yukle
rm -rf node_modules
pnpm install
npm’den Yarn’a gecis:
# package-lock.json varsa
yarn import
# Ya da direkt
rm -rf node_modules package-lock.json
yarn install
Gecis sirasinda yarn.lock veya pnpm-lock.yaml olusturulacak. Bunu hemen commit etmeniz gerekiyor.
Sonuc
npm hala gecerliliGini koruyan, olgun bir paket yoneticisi ama Yarn ve pnpm belirli senaryolarda ciddi avantajlar sunuyor. Performans odakliyorsaniz pnpm neredeyse tartismasiz kazaniyor. Ekosistem ve araclara asinalik acisindan Yarn daha kolay bir gecis saglayabilir.
Pratik tavsiyem su: Yeni bir proje baslatiyorsaniz ve takim icinde bir standart belirleyecekseniz pnpm’i secin. Ogrenmesi kolay, npm ile uyumlu, disk kullanimi ve hiz konusunda gercek fark yaratıyor. Monorepo yaptiysaniz pnpm workspace’i incelemenizi siddetle tavsiye ederim, o alanlarda npm ve Yarn’i geride birakiyor.
Her iki araci da bir gunluk proje uzerinde deneyin, lockfile’larina bakın, node_modules boyutlarini karsilastirin. Soyut tavsiye yerine kendi ellerinizle gordugunuzde dogru secimi cok daha kolay yapacaksiniz.
