Yan yana
npmvsYarn
npm ile Yarn arasındaki fark nedir?
Güncellendi 3 dk okuma8 fark
Kısaca
npm, Node.js ile gelir ve paketleri node_modules içine kurar; Yarn ise aynı depoyu kullanan, kendi lockfile'ı ve Plug'n'Play kurulumu olan ayrı bir istemcidir.
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ı okuYarn
Yarn, npm'e alternatif bir JavaScript paket yöneticisidir; bağımlılıkları npm deposundan kurar, lockfile, workspace ve Plug'n'Play desteği sunar.
Yarn sayfasını okunpm ve Yarn karşılaştırması
| Özellik | npm | Yarn |
|---|---|---|
| Kökeni | 2010'da geliştirildi; Node.js ile birlikte gelir | 2016'da Facebook tarafından yayımlandı; ayrıca kurulur |
| Lockfile | package-lock.json | yarn.lock |
| Paket yerleşimi | Paketlerin en üst düzeye taşındığı (hoisting) bir node_modules klasörü | Modern Yarn'da varsayılan olarak Plug'n'Play; node_modules isteğe bağlı |
| Script çalıştırma | npm run build; yalnızca npm test gibi birkaçı run olmadan çalışır | yarn build; run sözcüğü isteğe bağlı |
| Tek seferlik komutlar | npx create-vite | yarn dlx create-vite |
| Monorepo'lar | 2020'den beri workspace'ler, --workspace bayraklarıyla | 2017'den beri workspace'ler; modern Yarn yarn workspaces foreach ekler |
| Hazırlık | Ek bir şey kurmak gerekmez | packageManager alanında sabitlenir, Corepack ile kurulur |
| En uygun olduğu durum | Ek araç gerektirmeyen varsayılan yol | Plug'n'Play, zero-install ya da Yarn'ın monorepo araçlarını isteyen ekipler |
Fark, açıklamalı
npm ve Yarn, JavaScript için iki paket yöneticisidir: bir projenin package.json dosyasını okur, bağımlılıklarını aynı npm deposundan indirir ve tam sürümlerini sabitlerler. npm varsayılan olandır; 2010'da geliştirildi ve her Node.js kurulumuyla birlikte gelir. Yarn ise 2016'da Facebook tarafından daha hızlı ve daha öngörülebilir bir alternatif olarak yayımlandı; yani ayrı bir ekosistem değil, aynı paketler için farklı bir istemcidir.
Yarn'ın ilk dönemdeki üstünlüğü, npm'in sonradan benimsediği fikirlerden geliyordu: her sürümü sabitleyen bir lockfile (yarn.lock), çevrimdışı bir önbellek ve tek depoda birden çok paketi yönetmek için workspace'ler. npm, 2017'de package-lock.json dosyasını, 2020'de de workspace'leri ekledi; bu yüzden npm ve Yarn Classic (sürüm 1) bugün birbirine çok benzer çalışır. Bugünkü asıl fark, sürüm 2 ve sonrası olan modern Yarn'dadır: varsayılan Plug'n'Play modu node_modules klasörünü atlar ve her paketin Yarn'ın önbelleğinde nerede durduğunu Node.js'e söyleyen tek bir .pnp.cjs dosyası yazar; bu da kurulumları hafifletir ve tanımlanmamış import'ların hata vermesini sağlar.
Günlük kullanımda komutlar birbirine yakındır: npm install react yerine yarn add react, npm run build yerine de yarn build; Yarn run sözcüğüne ihtiyaç duymaz. npm hiçbir hazırlık gerektirmez; modern Yarn ise her projede package.json içindeki packageManager alanıyla sabitlenir ve genellikle Corepack ile kurulur. Corepack, sürüm 25'e kadar Node.js ile birlikte geliyordu ve artık npm install -g corepack ile ayrıca kuruluyor. Gerçek bir node_modules klasörü bekleyen araçlar, .yarnrc.yml içindeki nodeLinker: node-modules ayarıyla Yarn altında da çalışmaya devam eder.
Sık yapılan bir hata, ikisini aynı projede karıştırmaktır. Her biri kendi lockfile'ını yazdığı için kurulumlar zamanla birbirinden ayrışır; birini seçin, diğerinin lockfile'ını silin ve tercihinizi packageManager alanına yazın. Bir başka yanlış da Yarn'ın her zaman çok daha hızlı olduğu düşüncesidir: npm ilk dönemdeki farkın büyük kısmını kapattı; bu yüzden bugün seçim çoğunlukla çalışma alışkanlığına, paketlerin diske yerleşimine ve ekibin tercih ettiği monorepo araçlarına bağlıdır.
Hangisini kullanmalısınız?
npm şu durumlarda doğru seçim:
- Node.js ile birlikte gelen ve hiçbir hazırlık gerektirmeyen varsayılanı istiyorsunuz.
- Barındırma ortamınız, CI imajlarınız ya da izlediğiniz eğitimler
npm installvepackage-lock.jsonvarsayıyor. - Araçlarınız normal bir
node_modulesklasörü bekliyor.
Yarn şu durumlarda doğru seçim:
- Plug'n'Play'in sıkı bağımlılık denetimlerini ve daha hafif kurulumlarını istiyorsunuz.
- Bir monorepo yönetiyorsunuz ve
yarn workspaces foreachgibi komutlar istiyorsunuz. - Zero-install istiyorsunuz: Yarn'ın önbelleğini commit ederek yeni bir klonun kurulum yapmadan çalışmasını sağlamak.
- Proje zaten Yarn'ı ve onun
yarn.lockdosyasını kullanıyor.
Aynı günlük işler npm'de ve Yarn'da
# npm: comes with Node.js
npm install # install from package-lock.json
npm install react # add a dependency
npm install -D vitest # add a dev dependency
npm uninstall lodash # remove a dependency
npm run build # run a package.json script
npx create-vite # run a package once# Yarn: pinned in package.json's packageManager field
yarn # install from yarn.lock
yarn add react # add a dependency
yarn add -D vitest # add a dev dependency
yarn remove lodash # remove a dependency
yarn build # run a script, no "run" needed
yarn dlx create-vite # run a package onceSık sorulan sorular
Yarn, npm'den daha mı hızlı?
2016'da ortaya çıktığında açıkça daha hızlıydı; npm o zamandan beri bu farkın büyük kısmını kapattı. Plug'n'Play kullanan modern Yarn, çok daha az dosya yazdığı için büyük projeleri hâlâ daha hızlı kurabilir; ama sonuç projeye ve önbelleğe bağlıdır.
Yarn Classic mi, modern Yarn mı kullanmalıyım?
Yeni projeler için modern Yarn: Yarn Classic (sürüm 1) yalnızca ara sıra düzeltme alıyor. Plug'n'Play bir araçla sorun çıkarırsa nodeLinker: node-modules ayarını yapın ve modern Yarn'ın geri kalanını kullanmaya devam edin.
Bir projeyi npm'den Yarn'a nasıl geçiririm?
Yarn'ı Corepack ile kurun, package-lock.json dosyasını ve node_modules klasörünü silin, ardından bağımlılıkları package.json dosyasından çözüp yarn.lock dosyasını yazması için yarn komutunu çalıştırın. Yeni lockfile'ı commit edin ve testleri çalıştırın, çünkü bazı sürümler değişebilir.