TypeScript Isolated Declarations: האצת מהירות ה-Monorepo
תהליכי build ב-monorepo מואטים לעיתים קרובות בגלל האופן שבו TypeScript מטפל בקובצי הצהרה (declaration files). כברירת מחדל, TypeScript מנתח כל שרשרת import לפני שהוא יוצר קובץ .d.ts בודד. זה יוצר תור ארוך שבו חבילות (packages) חייבות להמתין אחת לשנייה.
ניתן לפתור זאת באמצעות הדגל --isolatedDeclarations.
דגל זה מאפשר builds במקביל. במקום להמתין לתלויות (dependencies), כל package מייצר את ההצהרות שלו באופן עצמאי. צוותים רואים עלייה במהירות ה-build פי 3 עד פי 15.
The Problem: TypeScript בדרך כלל מסיק (infers) טיפוסים (types) מעבר לגבולות מודולים. אם Package A תלוי ב-Package B, הקומפיילר חייב לפתור (resolve) את B במלואו לפני שהוא יכול להתחיל ב-A. ב-monorepo גדול, רוב ה-packages נשארים ללא פעילות בזמן שהקומפיילר עובד עליהם אחד אחד.
The Solution:
הדגל --isolatedDeclarations משנה את הכללים. הוא מחייב אתכם לכתוב type annotations מפורשים לכל מה שאתם מייצאים (export).
The Tradeoff: הקוד שלכם יכיל יותר טקסט. עליכם להוסיף ידנית return types לפונקציות ו-types לקבועים (constants). אינכם יכולים להסתמך על הקומפיילר שינחש את הטיפוסים הללו מתוך הקוד שלכם.
The Result: מכיוון שלכל export יש type ברור, הקומפיילר אינו צריך להסתכל על packages אחרים כדי להבין אותם. הוא יכול לעבד כל package בו-זמנית.
Real World Results:
- monorepo עם 18 packages הפחית את זמני ה-build מ-47 שניות ל-3.2 שניות.
- monorepo עם 32 packages הציג שיפור של פי 8 ב-CI pipelines.
- הביצועים משתפרים בהתאם למספר ליבות ה-CPU שלכם. יותר ליבות משמעותן יותר packages שנבנים בו-זמנית.
How to Migrate:
- הפעילו את הדגל ב-
tsconfig.jsonהשורשי ובכל קובץ קונפיגורציה של package. - השתמשו בדגל
"composite"כדי לאפשר project references. - הוסיפו return types מפורשים לפונקציות שאתם מייצאים:
// Before export function add(a: number, b: number) { return a + b; }
// After export function add(a: number, b: number): number { return a + b; }
- הוסיפו types מפורשים לקבועים (constants) שאתם מייצאים:
// Before export const SETTINGS = { port: 3000 };
// After export const SETTINGS: { port: number } = { port: 3000 };
אם לא תוסיפו את הטיפוסים הללו, הקומפיילר יזרוק שגיאות. זה מבטיח שהטיפוסים שלכם הם דטרמיניסטיים ומהירים.
