TypeScript Isolated Declarations: прискорення збірки монорепозиторіїв

Збірки монорепозиторіїв часто сповільнюються через те, як TypeScript обробляє файли декларацій. За замовчуванням TypeScript аналізує кожен ланцюжок імпортів, перш ніж створити хоча б один файл .d.ts. Це створює чергу, де пакети змушені чекати один на одного.

Ви можете виправити це за допомогою прапорця --isolatedDeclarations.

Цей прапорець дозволяє виконувати збірки паралельно. Замість очікування залежностей, кожен пакет генерує власні декларації незалежно. Команди спостерігають прискорення збірки від 3 до 15 разів.

The Problem: Зазвичай TypeScript виводить типи через межі модулів. Якщо Пакет A залежить від Пакета B, компілятор має повністю розібратися з B, перш ніж розпочати роботу над A. У великому монорепозиторії більшість пакетів простоюють, поки компілятор обробляє їх один за одним.

The Solution: Прапорець --isolatedDeclarations змінює правила. Він вимагає від вас писати явні анотації типів для всього, що ви експортуєте.

The Tradeoff: Ваш код стане довшим. Вам доведеться вручну додавати типи повернення для функцій та типи для констант. Ви не зможете покладатися на те, що компілятор сам вгадає ці типи на основі вашого коду.

The Result: Оскільки кожен експорт має чіткий тип, компілятору не потрібно переглядати інші пакети, щоб зрозуміти їх. Він може обробляти кожен пакет одночасно.

Real World Results:

  • Монорепозиторій із 18 пакетами скоротив час збірки з 47 секунд до 3,2 секунди.
  • Монорепозиторій із 32 пакетами показав 8-кратне прискорення в CI-конвеєрах.
  • Продуктивність масштабується відповідно до кількості ядер вашого процесора. Більше ядер означає, що більше пакетів збиратиметься одночасно.

How to Migrate:

  1. Увімкніть прапорець у вашому кореневому tsconfig.json та в конфігурації кожного пакета.
  2. Використовуйте прапорець "composite", щоб дозволити посилання на проєкти (project references).
  3. Додайте явні типи повернення для експортованих функцій:

// Before export function add(a: number, b: number) { return a + b; }

// After export function add(a: number, b: number): number { return a + b; }

  1. Додайте явні типи для експортованих констант:

// Before export const SETTINGS = { port: 3000 };

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

Якщо ви не додасте ці типи, компілятор видасть помилки. Це гарантує, що ваші типи будуть детермінованими та швидкими.

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