Npm Komutlarını Çalıştırdığınızda Ne Olur?
Bir npm komutuna enter tuşuna basarsınız. Projeniz derlenir. Sihir gibi hissettirir.
Bu bir sihir değil. Bir dizi ağ isteği, kod ayrıştırma ve dosya optimizasyonudur.
Komutları körü körüne çalıştırmayı bırakın. Bunun yerine motoru anlayın.
İşte her gün kullandığınız 6 temel komutun arka planında gerçekleşenler.
- npm install
Bu komut package.json dosyanızı okur. Araçlarınızın doğru sürümlerini bulmak için bir bulut kayıt defteriyle (cloud registry) iletişime geçer.
- Paketleri kayıt defterinden indirir.
node_modulesklasörünü oluşturur.- Bir bağımlılık ağacı (dependency tree) oluşturur.
- Tam sürümleri kaydetmek için
package-lock.jsondosyasını günceller.
- npm run format:check
Bu bir doğrulama adımıdır. Hiçbir şeyi değiştirmeden kodunuzun stil kurallarınıza uyup uymadığını kontrol eder.
- Dosyalarınızın sanal bir düzenini oluşturur.
- Dosyalarınızı Prettier gibi kurallarla karşılaştırır.
- Boşluklandırma veya sözdizimi (syntax) hatalıysa hataları işaretler.
Bu hataları düzeltmek için npm run format komutunu çalıştırın. Bu komut, dosyalarınızı doğru stile göre yeniden yazmak için Prettier kullanır.
- npm run lint
Bunu kodunuz için bir yazım denetleyicisi gibi düşünün. ESLint, mantığınızı bozan hataları arar.
- Sözdizimi hatalarını bulur.
- Kullanılmayan değişkenleri tespit eder.
- Eksik içe aktarmaları (imports) algılar.
- Hatalı React Hook kullanımını işaretler.
- npm run build
Bu komut uygulamanızı gerçek dünya için hazırlar. Bir dist klasörü oluşturur.
- Tree shaking işlemi yapmak için bir bundler kullanır. Bu, içe aktardığınız ancak hiç kullanmadığınız kodları siler.
- Minification (küçültme) işlemi yapar. Bu, bayt tasarrufu sağlamak için boşlukları kaldırır ve değişkenleri yeniden adlandırır.
- CSS ve varlıkları (assets) işler.
- Bir sunucu için hazır, optimize edilmiş statik dosyalar üretir.
- npm run dev
Bu, yerel geliştirme sunucunuzu başlatır. Vite kullanıyorsanız, Native ES Modules kullanır.
- Dosyaları yalnızca tarayıcınız onları istediğinde derler.
- Hot Module Replacement (HMR) için WebSockets kullanır.
- Düzenlenen kodu, tam sayfa yenilemesi yapmadan anında tarayıcınızda değiştirir.
- npm run preview
Dağıtıma (deploy) geçmeden önce çalışmanızı iki kez kontrol etmek için bunu kullanın. Bu komut kaynak kodunuzu görmezden gelir; yalnızca dist klasörünüze bakar.
- Uygulamanızın Vercel veya AWS üzerinde nasıl davranacağını simüle eder.
- Production build'inizi yerel bir sunucuda sunar.
Terminal bir kara kutu değildir. Araçlarınızı anladığınızda, daha hızlı hata ayıklarsınız (debug).
Nasıl çalıştığını öğrendikten sonra iş akışınızı değiştiren komut hangisiydi? Aşağıda bana anlatın.
Terminalin Altındaki Büyü: npm Komutlarını Çalıştırdığınızda Aslında Neler Oluyor?
npm install yazdığınızda arka planda neler olup bittiğini hiç merak ettiniz mi? Sanki bir sihirmiş gibi görünüyor, ancak aslında gerçekleşen şey, karmaşık bir süreçler orkestrasyonudur.
Bu yazıda, bir npm komutu çalıştırdığınızda terminalin derinliklerinde neler yaşandığını adım adım inceleyeceğiz.
1. Kabuk (Shell) ve PATH
Her şey siz terminale bir komut yazdığınızda başlar. Yazdığınız komut (örneğin npm install), işletim sisteminizin kabuğu (shell - bash, zsh, PowerShell vb.) tarafından alınır.
Kabuk, bu komutu ne yapacağını bilmediği için sistemdeki PATH ortam değişkenine bakar. PATH, işletim sistemine belirli programların (yürütülebilir dosyaların) nerede bulunduğunu söyleyen bir listedir. Kabuk, npm adlı yürütülebilir dosyanın bu listedeki dizinlerden birinde olup olmadığını kontrol eder. Eğer bulursa, bu dosyayı çalıştırır.
2. npm CLI Motoru
npm bir Node.js uygulamasıdır. Komut çalıştırıldığında, npm'in kendi komut satırı arayüzü (CLI) devreye girer.
Bu aşamada npm şunları yapar:
- Argüman Ayrıştırma: Yazdığınız komutu (örneğin
install,update,run) ve beraberindeki bayrakları (--save-devgibi) analiz eder. package.jsonKontrolü: Mevcut dizindekipackage.jsondosyasını okur. Bu dosya, projenizin bağımlılıklarının, betiklerinin ve diğer yapılandırmalarının "kaynak kuruluşu"dur.
3. Bağımlılık Çözümleme (Dependency Resolution)
İşte işlerin gerçekten karmaşıklaştığı yer burasıdır. npm, projenizin çalışması için hangi paketlere ve bu paketlerin hangi sürümlerine ihtiyacı olduğunu belirlemek zorundadır.
Bu süreç şu adımları içerir:
- Bağımlılık Ağacı Oluşturma:
package.jsondosyasındaki bağımlılıkları inceler. Ancak her paket, kendi bağımlılıklarına (transitive dependencies) sahiptir. npm, tüm bu paketleri ve onların gereksinimlerini içeren devasa bir ağaç yapısı oluşturur. - Sürüm Çözümleme (Semver): npm,
semver(semantic versioning) kurallarını kullanarak hangi sürümlerin uyumlu olduğunu belirler. Örneğin,^1.2.3ifadesi,1.x.xaralığındaki en yeni uyumlu sürümü getirmesini söyler. - Çakışmaları Çözme: Farklı paketler aynı bağımlılığın farklı sürümlerini isteyebilir. npm, bu çakışmaları en az sayıda paket yükleyerek ve mümkün olduğunca ortak sürümleri kullanarak çözmeye çalışır.
4. Kayıt Defteri (The Registry)
Bağımlılıklar belirlendikten sonra, npm bu paketlerin nerede olduğunu bilmelidir. İşte burada npm Registry devreye girer.
npm Registry, paketlerin depolandığı devasa bir bulut tabanlı veri tabanıdır. npm istemcisi, paketlerin metadata bilgilerini (sürümler, bağımlılıklar, checksum'lar) almak için Registry ile HTTP üzerinden iletişim kurar.
5. İndirme ve node_modules
Paketlerin yerleri ve sürümleri kesinleştiğinde, npm paketleri Registry'den indirir.
- İndirme: Paketler genellikle
.tar.gzformatında sıkıştırılmış arşivler olarak indirilir. node_modulesKlasörü: İndirilen paketler açılır ve projenizin kök dizinindekinode_modulesklasörüne yerleştirilir. Bu klasör, projenizin tüm bağımlılıklarının fiziksel olarak bulunduğu yerdir.
6. Kilit Dosyası (package-lock.json)
"Ama benim bilgisayarımda çalışıyor, arkadaşımda neden çalışmıyor?" sorusunun cevabı genellikle buradadır.
package-lock.json dosyası, bağımlılık ağacının o anki tam ve kesin halini kaydeder. Hangi paketin hangi sürümünün, hangi URL'den ve hangi bütünlük kontrolü (integrity) değeriyle yüklendiğini saklar. Bu sayede, projenizi başka bir makinede veya bir CI/CD hattında kurduğunuzda, tam olarak aynı dosya yapısının kurulması garanti edilir.
Sonuç
Bir npm komutu çalıştırmak, sadece birkaç dosyanın indirilmesi değildir; kabuk yorumlamasından karmaşık sürüm çözümleme algoritmalarına, ağ üzerinden veri çekmeden dosya sistemi işlemlerine kadar uzanan devasa bir süreçtir.
Bu mekanizmanın nasıl çalıştığını anlamak, bağımlılık sorunlarını daha hızlı çözmenize ve daha sağlam projeler geliştirmenize yardımcı olur.