TypeScript Isolated Declarations: Przyspiesz budowanie monorepo
Budowanie monorepo często zwalnia ze względu na sposób, w jaki TypeScript obsługuje pliki deklaracji. Domyślnie TypeScript analizuje każdy łańcuch importów, zanim utworzy choćby jeden plik .d.ts. Tworzy to długą kolejkę, w której pakiety muszą na siebie czekać.
Możesz to naprawić za pomocą flagi --isolatedDeclarations.
Flaga ta umożliwia równoległe budowanie. Zamiast czekać na zależności, każdy pakiet generuje własne deklaracje niezależnie. Zespoły odnotowują wzrost prędkości budowania od 3 do nawet 15 razy.
The Problem: TypeScript zazwyczaj wnioskuje typy na granicach modułów. Jeśli Pakiet A zależy od Pakietu B, kompilator musi w pełni rozwiązać Pakiet B, zanim rozpocznie pracę nad Pakietem A. W dużym monorepo większość pakietów pozostaje bezczynna, podczas gdy kompilator pracuje nad nimi jeden po drugim.
The Solution:
Flaga --isolatedDeclarations zmienia zasady. Wymaga ona pisania jawnych adnotacji typów dla wszystkiego, co eksportujesz.
The Tradeoff: Twój kod będzie zawierał więcej tekstu. Musisz ręcznie dodawać typy zwracane do funkcji oraz typy do stałych. Nie możesz polegać na tym, że kompilator zgadnie te typy na podstawie Twojego kodu.
The Result: Ponieważ każdy eksport ma jasny typ, kompilator nie musi zaglądać do innych pakietów, aby je zrozumieć. Może przetwarzać każdy pakiet jednocześnie.
Real World Results:
- Monorepo z 18 pakietami skróciło czas budowania z 47 sekund do 3,2 sekundy.
- Monorepo z 32 pakietami odnotowało 8-krotny wzrost wydajności w potokach CI.
- Wydajność skaluje się wraz z liczbą rdzeni procesora. Więcej rdzeni oznacza, że więcej pakietów może być budowanych jednocześnie.
How to Migrate:
- Włącz flagę w głównym pliku
tsconfig.jsonoraz w konfiguracji każdego pakietu. - Użyj flagi
"composite", aby umożliwić odwołania do projektów (project references). - Dodaj jawne typy zwracane do eksportowanych funkcji:
// Before export function add(a: number, b: number) { return a + b; }
// After export function add(a: number, b: number): number { return a + b; }
- Dodaj jawne typy do eksportowanych stałych:
// Before export const SETTINGS = { port: 3000 };
// After export const SETTINGS: { port: number } = { port: 3000 };
Jeśli nie dodasz tych typów, kompilator zgłosi błędy. Zapewnia to deterministyczne i szybkie typowanie.
