TypeScript Isolated Declarations: Monorepo की गति बढ़ाएं

Monorepo बिल्ड अक्सर इसलिए धीमे हो जाते हैं क्योंकि TypeScript डिक्लेरेशन फाइलों (declaration files) को एक खास तरीके से हैंडल करता है। डिफ़ॉल्ट रूप से, TypeScript एक भी .d.ts फ़ाइल बनाने से पहले हर इम्पोर्ट चेन (import chain) का विश्लेषण करता है। इससे एक लंबी कतार बन जाती है जहाँ पैकेजों को एक-दूसरे का इंतज़ार करना पड़ता है।

आप इसे --isolatedDeclarations फ्लैग के साथ ठीक कर सकते हैं।

यह फ्लैग पैरेलल बिल्ड (parallel builds) की अनुमति देता है। डिपेंडेंसीज़ (dependencies) का इंतज़ार करने के बजाय, प्रत्येक पैकेज स्वतंत्र रूप से अपने स्वयं के डिक्लेरेशन जेनरेट करता है। टीमें बिल्ड स्पीड में 3x से 15x तक की वृद्धि देखती हैं।

समस्या:

TypeScript आमतौर पर मॉड्यूल बाउंड्रीज़ (module boundaries) के पार टाइप्स का अनुमान (infer) लगाता है। यदि Package A, Package B पर निर्भर है, तो कंपाइलर को A पर काम शुरू करने से पहले B को पूरी तरह से रिज़ॉल्व (resolve) करना होगा। एक बड़े monorepo में, जब कंपाइलर एक-एक करके काम करता है, तो अधिकांश पैकेज खाली बैठे रहते हैं।

समाधान:

--isolatedDeclarations फ्लैग नियमों को बदल देता है। यह आपसे अपेक्षा करता है कि आप जो कुछ भी एक्सपोर्ट (export) करते हैं, उसके लिए स्पष्ट टाइप एनोटेशन (explicit type annotations) लिखें।

समझौता (Tradeoff):

आपके कोड में टेक्स्ट बढ़ जाएगा। आपको फंक्शन्स में रिटर्न टाइप्स (return types) और कॉन्स्टेंट्स (constants) में टाइप्स को मैन्युअल रूप से जोड़ना होगा। आप अपने कोड से इन टाइप्स का अनुमान लगाने के लिए कंपाइलर पर निर्भर नहीं रह सकते।

परिणाम:

क्योंकि हर एक्सपोर्ट का एक स्पष्ट टाइप होता है, इसलिए कंपाइलर को उन्हें समझने के लिए अन्य पैकेजों को देखने की आवश्यकता नहीं होती है। यह एक ही समय में प्रत्येक पैकेज को प्रोसेस कर सकता है।

वास्तविक दुनिया के परिणाम:

  • 18 पैकेजों वाले एक monorepo में बिल्ड का समय 47 सेकंड से घटकर 3.2 सेकंड रह गया।
  • 32-पैकेज वाले monorepo में CI पाइपलाइनों पर 8x का लाभ देखा गया।
  • परफॉरमेंस आपके CPU कोर्स (cores) के साथ स्केल करती है। अधिक कोर्स का मतलब है कि एक साथ अधिक पैकेज बिल्ड होंगे।

माइग्रेट कैसे करें:

  1. अपने रूट tsconfig.json और प्रत्येक पैकेज कॉन्फ़िगरेशन में फ्लैग को इनेबल करें।
  2. प्रोजेक्ट रेफरेंस (project references) की अनुमति देने के लिए "composite" फ्लैग का उपयोग करें।
  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 };

यदि आप ये टाइप्स नहीं जोड़ते हैं, तो कंपाइलर एरर (errors) देगा। यह सुनिश्चित करता है कि आपके टाइप्स डिटरमिनिस्टिक (deterministic) और तेज़ हों।

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