TypeScript İzole Bildirimleri (Isolated Declarations): Monorepo Hızını Artırın

Monorepo derlemeleri, TypeScript'in bildirim dosyalarını (declaration files) işleme biçimi nedeniyle genellikle yavaşlar. Varsayılan olarak TypeScript, tek bir .d.ts dosyası oluşturmadan önce her bir içe aktarma (import) zincirini analiz eder. Bu durum, paketlerin birbirini beklemek zorunda kaldığı uzun bir kuyruk oluşturur.

Bunu --isolatedDeclarations bayrağı ile düzeltebilirsiniz.

Bu bayrak paralel derlemelere olanak tanır. Bağımlılıkları beklemek yerine, her paket kendi bildirimlerini bağımsız olarak oluşturur. Ekipler, derleme hızlarında 3 ila 15 kat artış görürler.

Sorun:

TypeScript genellikle modül sınırları arasında türleri çıkarım yoluyla (infer) belirler. Eğer A Paketi B Paketine bağımlıysa, derleyici A üzerinde çalışmaya başlamadan önce B'yi tamamen çözümlemek zorundadır. Büyük bir monorepo'da, derleyici paketleri tek tek işlerken çoğu paket boşta bekler.

Çözüm:

--isolatedDeclarations bayrağı kuralları değiştirir. Dışa aktardığınız (export) her şey için açık tür bildirimleri (explicit type annotations) yazmanızı gerektirir.

Dezavantajı:

Kodunuz daha fazla metin içerecektir. Fonksiyonlara manuel olarak dönüş türleri (return types) ve sabitlere (constants) türler eklemeniz gerekir. Bu türleri kodunuzdan tahmin etmesi için derleyiciye güvenemezsiniz.

Sonuç:

Her dışa aktarımın net bir türü olduğu için, derleyicinin bunları anlamak için diğer paketlere bakmasına gerek kalmaz. Her paketi aynı anda işleyebilir.

Gerçek Dünya Sonuçları:

  • 18 paketli bir monorepo'da derleme süreleri 47 saniyeden 3,2 saniyeye düştü.
  • 32 paketli bir monorepo, CI süreçlerinde 8 kat artış gördü.
  • Performans, CPU çekirdeklerinizle ölçeklenir. Daha fazla çekirdek, aynı anda daha fazla paketin derlenmesi anlamına gelir.

Nasıl Geçiş Yapılır:

  1. Kök tsconfig.json dosyanızda ve her bir paket yapılandırmasında bayrağı etkinleştirin.
  2. Proje referanslarına (project references) izin vermek için composite bayrağını kullanın.
  3. Dışa aktarılan fonksiyonlara açık dönüş türleri ekleyin:
// Önce
export function add(a: number, b: number) {
  return a + b;
}

// Sonra
export function add(a: number, b: number): number {
  return a + b;
}
  1. Dışa aktarılan sabitlere açık türler ekleyin:
// Önce
export const SETTINGS = { port: 3000 };

// Sonra
export const SETTINGS: { port: number } = { port: 3000 };

Bu türleri eklemezseniz, derleyici hata verecektir. Bu, türlerinizin deterministik ve hızlı olmasını sağlar.

Kaynak: https://dev.to/jsmanifest/typescript-isolated-declarations-real-world-performance-gains-in-monorepo-build-times-25g3