npm vs yarn

Tugay Demirel
4 min readJun 5, 2022

--

Eğer bir geliştiricisiyseniz kuşkusuz 3.parti bir paket ile proje geliştirmişsinizdir. Eğer bir JavaScript geliştiricisiyseniz de kuşkusuz 3.parti paket yöneticisi olan npm veya yarn’dan en az birisini duymuşsunuzdur.

Peki bu paket yöneticileri hakkında ne kadar bilgiye sahibiz? Projelerimizde hangisini kullanıyoruz? Birbirlerine karşı avantajları/dezavantajları nelerdir?

Gelin birlikte bu sorulara cevap bulmaya çalışalım. Fakat bu sorulara geçmeden önce bu paket yöneticilerini tanımalıyız.

npm

GitHub ve Microsoft’un bir yan kuruluşu olan npmjs’in yönetimindeki npm Isaac Z. Schlueter tarafından geliştirilmiştir. Açılımı “Node Package Manager”dır. İsminden de anlaşılacağı üzere Node.js’in standart paket yöneticisidir. npm kullanmak için sisteminizde Node.js yüklü olmalıdır. Node.js yükledikten sonra ise npm için ekstra bir kurulum yapmaya gerek yoktur.

Aşağıdaki kodları çalıştırarak sisteminizde Node ve npm olup olmadığını ve versiyonlarını öğrenebilirsiniz.

node -v
npm -v

yarn

Facebook tarafından geliştirilen ve başta Google olmak üzere sektörün önde gelen şirketlerinden destek alan yarn, kullanımı her geçen gün artan bir paket yöneticisidir. Facebook mühendislerinin yarn’ı geliştirme sebepleri (geliştirmeye başladıkları zaman) npm’de bulunan güvenlik, tutarlılık ve performans problemleridir. Tam adı “Yet Another Resource Negotiator”dur.

Sisteminize yarn yüklemek için bir başka paket yöneticisi kullanabilirsiniz. Örneğin sisteminizde npm bulunuyorsa aşağıdaki kodu çalıştırmanız yarn’ı yüklemeniz için yeterli olacaktır.

npm install yarn --global

İster sistem seviyesi ister 3. parti paket yöneticileriyle kurabileceğiniz yarn’ı hiçbir paket yöneticisine ihtiyaç duymadan, curl aracılığı ile de kurabilirsiniz. Komut satırına aşağıdaki kodu yazmanız yeterli olacaktır.

curl -o- -L https://yarnpkg.com/install.sh | bash

Yarn kurulumu ile ilgili daha fazla bilgiyi dokümantasyonun kurulum kısmından edinebilirsiniz.

Bağımlılık (Dependency)

Bağımlılıklar paket yöneticinizin kurulum komutunu çalıştırdığınızda hangi paketlerin ve hangi versiyonların yüklenmesi gerektiğinin belirtildiği alandır. Bu paketler projeniz canlıya alınırken gereklidir. Bunun dışında devDependencies isimli bir alan daha vardır. Burada geliştirme ve test ortamında kullanılacak paketler tutulmaktadır. Bu ayrım ile birlikte, projeniz canlıya alındığında yalnızca gerekli paketler yüklenerek alan, performans gibi konularda tasarruf yapılmaktadır.

Hız ve Performans

Bu iki popüler paket yöneticisinin arasındaki en temel farklardan birisi paketleri yükleme şekilleridir. npm paketleri sırayla yüklerken yarn bu yükleme işlemini paralel olarak halleder. Bu yüzden yarn, büyük ve çoklu paket kurulumlarında npm’den daha iyi performans vermektedir.

Görselin kaynağı

Bunun dışında yarn, indirilen x.y.z versiyonlu kütüphaneleri lokalinizde de tutar. Bu sayede bir başka projede aynı kütüphaneye ihtiyaç duyduğunuzda uzak repo yerine local makinenizden bu dosyaları temin eder. npm ise her paket yüklemesinde uzak repolara uğramaktadır.

Güvenlik

Yarn’ı tanıtırken de bahsettiğimiz üzere npm’in ilk versiyonlarında bir güvenlik sıkıntısı vardı. Çünkü npm henüz kurulum aşamasındayken bile paketlerin kod çalıştırmasına izin veriyordu. Bu güvenlik problemlerinden bahsederken hep geçmiş zaman kullanmamızın sebebi ise npm’in bu sorunu çözmüş olması.

Versiyon 6'dan itibaren npm, her paket kurulumunuzda bir güvenlik denetimi çalıştırır. Bu denetim, güvenlik açıklarını engellemesinin yanı sıra bağımlılık(dependency) çakışmaları olmamasını da sağlar. Bu güvenlik denetimini ayrıca npm audit komutuyla manuel yapabilirsiniz. Eğer herhangi bir güvenlik açığı bulunursa npm audit fix yazarak bu sorunu halledebilirsiniz.

Yarn ise paketler kurulurken arka planda bir güvenlik kontrolü yapar. Bu kontrol ile kötü amaçlı kodları ve paket çakışmalarını engeller.

Tutarlılık

npm’in erken sürümlerinde bağımlılıklar isim ve sürüm aralığı olarak package.json isimli dosyada tutulmaktaydı. Sürümlerin net bir şekilde belirtilmeyip aralık verilmesi bazı problemlere yol açıyordu.

Örneğin tpackage isimli bir paketimiz olduğunu varsayalım. Kullandığım projede bu tpackage’ın 1.5.6 versiyonunun üstü ve 1.8.6 versiyonunun altı gerekli. Yani package.json dosyamda şöyle bir yapı oluşuyordu;

"dependencies": {
"tpackage": ">=1.5.6 <=1.8.6"
}

Bu şekilde belirtilen aralıklar tutarsızlığa son derece açıktı. Çünkü ben bu aralığı karşılayan 1.5.8 sürümüyle bu proje üzerinde çalışabilirdim. Fakat aynı projede çalışan diğer geliştirici 1.8.4 sürümünü tercih edebilirdi. Benim kullandığım 1.5.8 sürümünde olabilecek bir bug tüm düzeni etkileyebiliyordu.

Yarn bu tutarlılık olayına çözüm olarak yarn.lock isimli özel bir dosya kullanıyordu. Bu dosyada paketlerin tam sürümleri, nereden indirildikleri gibi bilgilerin yanı sıra az önce değindimiz güvenlik konusunu yarn tarafında halleden checksum bilgisi gibi bilgiler bulunuyordu.

npm’in bir diğer eksikliğini gideren yarn, bu çözümüyle npm’i de etkilemeyi başarmıştı. Versiyon 5'ten itibaren npm, aynı görevi gören kendi kilit dosyası package-lock.json’ı kullanmaya başladı.

npm’in de kilit dosyası kullanmaya başlamasının ardından yarn’ın bu konudaki avantajı ortadan kalktı. Günümüzde her ikisi de oldukça tutarlı diyebiliriz.

Kullanım Kolaylığı

Kullanım kolaylığına karar verirken bakmamız gereken ilk kriterlerden birisi arayüzleri olacaktır. Arayüzden beklentimiz npm install veya yarn add gibi komutları çalıştırdıktan sonra terminalin anlaşılır gözükmesidir.

npm ve yarn farklı arayüzlere sahip olsa da ikisi de son derece anlaşılabilir ve kullanıcı dostudur. Ayrıca bu iki paket yöneticisi aynı işlemler için benzer anahtar kelimeler kullanmalarının yanı sıra bazı işlemler için aynı komutları kullanırlar.

Aşağıdaki görselde aynı işleri yaparken kullandıkları farklı komutları bulabilirsiniz.

Görselin kaynağı

Ve bu görselde de kullandıkları aynı komutları görebilirsiniz.

Görselin kaynağı

Hangisi daha iyi?

Yazılım dünyasında benzer işlevleri yerine getiren her teknolojide olduğu gibi bu iki paket yöneticisi için de biri diğerinden tam anlamıyla daha iyidir diyemeyiz. İkisinin de avantajları ve dezavantajları bulunmaktadır. npm/cli GitHub üzerinde yaklaşık 6bin Star almışken yarn 41bin Star’a yaklaşmıştır. npmjs üzerinden baktığımızda ise npm haftalık 4.2milyon indirmeye sahipken yarn 2.8milyon indirilmektedir. Buradan anlaşılıyor ki her iki paket yöneticisi de oldukça büyük bir topluluk desteğine ve kullanıma sahiptir.

Ben ise önceden npm kullanıyorken son zamanlarda hızından dolayı yarn’a geçiş yaptım. Halihazırda sunduğu yüksek performansın yanı sıra yarn, “Berry” ismini verdikleri Yarn2 sürümleriyle birlikte bu performansı daha da artırmıştır.

Her ne kadar paket yükleme konusunda yarn daha performanslı olsa da günümüz itibariyle npm, başlarda eksik olduğu ve yarn’ın kendisine fark attığı pek çok konuda geliştirmeler yaparak kendini toparlamıştır.

Bu iki paket yöneticisinden hangisinin seçileceği kişisel tercihinize, performansa, kullanım kolaylığına ve topluluk desteğine bağlı olmalıdır.

Umuyorum bu yazı, yapacağınız seçimde size yardımcı olmuştur. Okuduğunuz içi teşekkür ederim.

İyi kodlamalar!

Yararlandığım kaynaklar;

--

--