Ana içeriğe geç

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ı oku

Yarn

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ı oku

npm ve Yarn karşılaştırması

ÖzelliknpmYarn
Kökeni2010'da geliştirildi; Node.js ile birlikte gelir2016'da Facebook tarafından yayımlandı; ayrıca kurulur
Lockfilepackage-lock.jsonyarn.lock
Paket yerleşimiPaketlerin 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ırmanpm run build; yalnızca npm test gibi birkaçı run olmadan çalışıryarn build; run sözcüğü isteğe bağlı
Tek seferlik komutlarnpx create-viteyarn dlx create-vite
Monorepo'lar2020'den beri workspace'ler, --workspace bayraklarıyla2017'den beri workspace'ler; modern Yarn yarn workspaces foreach ekler
HazırlıkEk bir şey kurmak gerekmezpackageManager alanında sabitlenir, Corepack ile kurulur
En uygun olduğu durumEk araç gerektirmeyen varsayılan yolPlug'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 install ve package-lock.json varsayıyor.
  • Araçlarınız normal bir node_modules klasö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 foreach gibi 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.lock dosyasını kullanıyor.

Aynı günlük işler npm'de ve Yarn'da

npmbash
# 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
Yarnbash
# 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 once

Sı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.

Daha fazla

Ayarlar