node_modules silinir mi? Mac'te bul ve temizle
Her JavaScript projesi bağımlılıklarının kendi kopyasını node_modules içinde tutar ve sen projeyi bıraksan da o klasör diskte kalır. Nasıl geri kuracağını biliyorsan silmek güvenli.
Güncelleme:
node_modules nedir, neden bu kadar yer tutar
npm install, pnpm install ya da yarn çalıştırdığında paket yöneticisi package.json içindeki her bağımlılığı, onların bağımlılıklarıyla birlikte, hemen yanındaki node_modules klasörüne indirir. İçindekilerin hiçbirini sen yazmadın: npm kayıt deposundaki kodun yerel ve yeniden üretilebilir bir kopyası.
Tek bir modern ön yüz projesi rahatlıkla yüzlerce megabayt bağımlılık çeker. Bunu Mac'indeki her eğitim projesi, deneme, müşteri işi ve klonladığın depo ile çarpınca toplam çoğu zaman onlarca gigabayta varır; büyük kısmı da aylardır açmadığın projelerde durur.
Tüm node_modules klasörlerini bul
find komutunu kodlarını tuttuğun klasöre yönelt. -prune bulduğu bir node_modules klasörünün içine inmesini engeller; böylece paketlerin içindeki iç içe klasörler ayrı ayrı listelenmez.
# ~/code altındaki her node_modules, boyutuyla, küçükten büyüğe
find ~/code -type d -name node_modules -prune -exec du -sh {} + 2>/dev/null | sort -h
# hepsinin toplamı
find ~/code -type d -name node_modules -prune -print0 | xargs -0 du -sch | tail -1node_modules silmek güvenli mi?
Sıradan bir proje için evet. node_modules içindeki her şey yeniden indirilebilir. Aynı bağımlılıkları geri alıp almayacağını ise package.json yanındaki lockfile belirler:
- npm için
package-lock.json, pnpm içinpnpm-lock.yaml, Yarn içinyarn.lock. - Lockfile varsa yeniden kurulum, projenin en son çalıştığı sürümlerin aynısını getirir.
- Yoksa paket yöneticisi
package.jsoniçindeki aralıkların izin verdiği en yeni sürümleri seçer. Eski bir proje bu durumda farklı sürümlerle kurulur ve bazen artık derlenmez.
Yani silmeden önce projede lockfile olduğuna ve git'e işlendiğine bak. Lockfile'da ne yazıyorsa birebir onu kurmak için paket yöneticinin katı kurulum komutunu kullan:
npm ci
pnpm install --frozen-lockfile
yarn install --frozen-lockfile # Yarn 1
yarn install --immutable # Yarn 2 ve sonrasınpm ci, package-lock.json yoksa ya da package.json ile uyuşmuyorsa çalışmayı reddeder ve kurmadan önce mevcut node_modules klasörünü kendisi siler. Bu yüzden iyi bir sınamadır: npm ci sorunsuz geçiyorsa proje baştan kurulabilir durumda.
node_modules silindiğinde kaybolanlar: içine elle yaptığın değişiklikler (bir bağımlılığa attığın hızlı yama gibi) ve yeniden kurulumun süresi. Yamalı bağımlılığa ihtiyacın varsa patch-package gibi bir araçla yamayı projenin içinde tut.
Elle silmek
Tek proje için klasörü proje kökünden sil:
cd ~/code/eski-proje
rm -rf node_modulesÇok sayıda proje için önce listeyi bir dosyaya yaz, oku, tutmak istediklerinin satırını çıkar, sonra kalanları sil:
find ~/code -type d -name node_modules -prune > ~/node_modules-listesi.txt
open -e ~/node_modules-listesi.txt # listeyi gözden geçir ve düzenle
while IFS= read -r dir; do rm -rf "$dir"; done < ~/node_modules-listesi.txt
rm ~/node_modules-listesi.txtMonorepo ve workspace yapıları
npm, Yarn ya da pnpm workspace kullanan bir monorepo'da kökte bir node_modules olur, çoğu zaman her paketin içinde de birer tane daha. Bunlar birbirine bağlıdır. Yukarıdaki find komutu hepsini listeler; hepsini birlikte sil ve tek bir paketin içinden değil, deponun kökünden bir kez kur.
pnpm, npm'den farklı çalışır: pnpm node_modules içindeki dosyalar ortak bir depoya hard link'tir. Bu yüzden bir pnpm projesinin node_modules klasörünü silmek, du o klasör için ne gösteriyorsa ondan daha az yer açar; dosyalar başka bir proje kullandıkça depoda kalır.
~/.npm içindeki npm ve npx önbelleği
Proje klasörlerinin dışında npm, ~/.npm altında ortak bir önbellek tutar. ~/.npm/_cacache indirilen paket arşivlerini saklar; silinen bir node_modules klasörünün ilk kuruluma göre daha hızlı geri gelmesinin sebebi budur. ~/.npm/_npx ise npx ile bir kerelik çalıştırdığın komutların (proje oluşturucular gibi) paketlerini tutar.
du -sh ~/.npm ~/.npm/_cacache ~/.npm/_npx
# önbelleği denetle, gereksiz veriyi topla
npm cache verify
# önbelleğin tamamını boşalt (npm --force ister)
npm cache clean --force
# yeni npm sürümleri npx kayıtlarını listeleyip silebilir
npm cache npx ls
npm cache npx rmÖnbelleği temizlemek güvenli. Bedeli, sonraki kurulumların her şeyi yeniden indirmesi ve önbellek dolana kadar --prefer-offline ile kurulumun işe yaramaması. pnpm ve Yarn'ın kendi depoları var: pnpm store path pnpm deposunun yerini gösterir, pnpm store prune hiçbir projenin kullanmadığı paketleri siler; yarn cache clean Yarn önbelleğini boşaltır.
Flutter ya da Xcode ile de çalışıyorsan onlar da benzer, yeniden üretilebilir klasörler bırakır: Flutter projelerinde disk alanı açma ve Xcode DerivedData temizleme rehberlerine bak.
CleanDev ile
CleanDev seçtiğin proje klasörlerini tarar ve package.json yanında duran her node_modules klasörünü boyutuyla listeler. Lockfile'ı olmayan projeler kendiliğinden seçilmez; gerekçesiyle birlikte incelemene sunulur, kararı sen verirsin. Tam sürüm npm ve npx önbelleklerini de temizler. Mac App Store'da ücretsiz olan CleanDev Lite proje klasörlerini kapsar.
Sorular
node_modules silersem proje bozulur mu?
Proje yeniden kurulabiliyorsa bozulmaz. npm ci (ya da paket yöneticinin kurulum komutu) klasörü geri getirir. Lockfile varsa öncekiyle aynı sürümleri alırsın.
node_modules git'e eklenir mi?
Hayır. Onun yerine package.json ve lockfile'ı işle; node_modules bunlardan üretilir. Yeri .gitignore dosyası.
node_modules neden bu kadar büyük?
Her bağımlılığın her bağımlılığını içerir; derleme araçları, tip tanımları ve yerel ikili dosyalar da buna dahil. Tek proje için birkaç yüz megabayt normaldir.
~/.npm klasörünü silmek güvenli mi?
Evet, npm'in paket kurdukça yeniden doldurduğu bir önbellek. Tercih edilen yol npm cache clean --force; ~/.npmrc içindeki ayarlarına dokunmadan önbelleği boşaltır.
npm install ile npm ci arasındaki fark ne?
npm install, package.json ile uyum için lockfile'ı güncelleyebilir. npm ci lockfile'da ne yazıyorsa onu kurar, uyuşmazlıkta hata verir ve boş bir node_modules ile başlar.