pnpm monorepo'ya neden geçtim
· 1 dk okuma
- pnpm
- monorepo
- araclar
Tek bir uygulamayla başlayabilecekken neden baştan bir çalışma alanı (workspace) kurduğumu soralım.
Paylaşılan sınırlar
İçerik şeması (content-schema), paylaşılan bileşenler (ui) ve
yapılandırma (config) ayrı paketler olarak duruyor. Bunun kolaylaştırdığı
şey şu: bir şemayı değiştirdiğimde onu kullanan her yer aynı paketten okuyor,
kopyala-yapıştır sürümü diye bir şey yok.
| Klasör adı | İçeriği | Kim kullanıyor |
| ------------------------- | --------------------------------- | -------------------- |
| apps/web | Next.js sitesi | Son kullanıcı |
| packages/content-schema | Zod şemaları, doğrulama betiği | apps/web, betikler |
| packages/ui | Paylaşılan bileşenler | apps/web |
| packages/config | tsconfig, ESLint, jeton kuralları | Tüm paketler |
pnpm neden, npm/yarn değil
İki somut gerekçe: sabit bağımlılık yönetimi (aynı paketin iki farklı sürümü sessizce karışmıyor) ve disk alanı verimliliği (paketler bir kere indirilip sembolik bağlantıyla paylaşılıyor, her paket kendi kopyasını tutmuyor).
Tek uygulama
- Bağımlılık paylaşımı: yok
- Sürümleme: tek `package.json`
- Yeni paket eklemek: yeniden yapılandırma
Monorepo
- Bağımlılık paylaşımı: `workspace:*` ile doğrudan
- Sürümleme: paket başına bağımsız
- Yeni paket eklemek: klasör açmak kadar ucuz
Bugün aşırı mühendislik gibi görünse de
Bu yapı tek bir Next.js uygulaması için gereğinden fazla görünebilir — ve bu
gözlem doğru. Ama ileride bir API eklendiğinde apps/api açmak bir klasör
açmaktan ibaret olacak, yeniden yazım gerekmeyecek. Bugünkü maliyeti
neredeyse sıfır: birkaç yapılandırma dosyası.
Kapanış
Monorepo kararını "büyüyeceğiz" varsayımıyla değil, "büyürsek pahalı olmasın" tedbiriyle verdim. İkisi farklı gerekçeler; birincisi tahmin, ikincisi sigorta.
Abdullah Balat
Kurucu ve geliştirici
Bu siteyi kuran, tasarlayan ve içeriğini yazan kişiyim. Hakkımda daha fazlası →
Yorumlar
YakındaYorum alanı henüz aktif değil; GitHub Discussions tabanlı bir sistem hazırlanıyor.
Bülten
YakındaYeni yazı ve ders yayınlandığında haber vermek için bir bülten hazırlıyorum. Kayıt formu şu an pasif; aktif olduğunda burada duyurulacak.