TypeScript Isolated Declarations: Monorepo வேகத்தை அதிகரிக்கவும்

Monorepo build-கள் பெரும்பாலும் TypeScript declaration கோப்புகளைக் கையாளும் விதம் காரணமாக மெதுவாகின்றன. இயல்பாகவே (By default), TypeScript ஒரு .d.ts கோப்பை உருவாக்குவதற்கு முன்பாகவே ஒவ்வொரு import சங்கிலியையும் (import chain) ஆய்வு செய்கிறது. இது தொகுப்புகள் (packages) ஒன்றையொன்று எதிர்பார்த்து காத்திருக்க வேண்டிய ஒரு நீண்ட வரிசையை உருவாக்குகிறது.

இதை --isolatedDeclarations flag மூலம் சரிசெய்யலாம்.

இந்த flag இணையான build-களை (parallel builds) அனுமதிக்கிறது. சார்ந்திருப்பவற்றுக்காக (dependencies) காத்திருப்பதற்குப் பதிலாக, ஒவ்வொரு தொகுப்பும் தனது சொந்த declaration-களைத் தனித்தனியாக உருவாக்குகிறது. இதனால் build வேகம் 3x முதல் 15x வரை அதிகரிப்பதைக் குழுக்கள் காண முடியும்.

The Problem: TypeScript பொதுவாக module எல்லைகளுக்கு அப்பால் வகைகளை (types) ஊகிக்கும் (infers). Package A ஆனது Package B-யைச் சார்ந்து இருந்தால், compiler A-வை தொடங்குவதற்கு முன்பாக B-யை முழுமையாகத் தீர்க்க (resolve) வேண்டும். ஒரு பெரிய monorepo-வில், compiler ஒவ்வொன்றாக வேலை செய்யும் போது பெரும்பாலான தொகுப்புகள் பயன்படுத்தப்படாமல் அப்படியே இருக்கும்.

The Solution: --isolatedDeclarations flag விதிகளையே மாற்றுகிறது. நீங்கள் எதை export செய்கிறீர்களோ, எல்லாவற்றிற்கும் தெளிவான type annotations-களை எழுத இது உங்களைக் கோருகிறது.

The Tradeoff: உங்கள் குறியீடு (code) அதிக வரிகளைக் கொண்டிருக்கும். functions-களுக்கு return types-களையும், constants-களுக்கு types-களையும் நீங்கள் கைமுறையாக (manually) சேர்க்க வேண்டும். உங்கள் குறியீட்டிலிருந்து இந்த வகைகளை ஊகிப்பதற்கு compiler-ஐ நீங்கள் நம்பியிருக்க முடியாது.

The Result: ஒவ்வொரு export-க்கும் தெளிவான type இருப்பதால், அவற்றை புரிந்துகொள்ள compiler மற்ற தொகுப்புகளைப் பார்க்க வேண்டிய அவசியமில்லை. இது ஒவ்வொரு தொகுப்பையும் ஒரே நேரத்தில் செயலாக்க முடியும்.

Real World Results:

  • 18 தொகுப்புகளைக் கொண்ட ஒரு monorepo-வில், build நேரம் 47 வினாடிகளிலிருந்து 3.2 வினாடிகளாகக் குறைந்தது.
  • 32 தொகுப்புகளைக் கொண்ட ஒரு monorepo-வில், CI pipelines-களில் 8x முன்னேற்றம் காணப்பட்டது.
  • செயல்திறன் உங்கள் CPU cores-ஐப் பொறுத்து அமையும். அதிக cores இருந்தால், அதிக தொகுப்புகள் ஒரே நேரத்தில் build ஆகும்.

How to Migrate:

  1. உங்கள் root tsconfig.json மற்றும் ஒவ்வொரு package config-லும் இந்த flag-ஐச் செயல்படுத்தவும்.
  2. project references-களை அனுமதிக்க "composite" flag-ஐப் பயன்படுத்தவும்.
  3. export செய்யப்படும் functions-களுக்குத் தெளிவான 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; }

  1. export செய்யப்படும் constants-களுக்குத் தெளிவான types-களைச் சேர்க்கவும்:

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

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

நீங்கள் இந்த வகைகளைச் சேர்க்கவில்லை என்றால், compiler பிழைகளை (errors) ஏற்படுத்தும். இது உங்கள் வகைகள் (types) நிலையானதாகவும் (deterministic) வேகமாகவும் இருப்பதை உறுதி செய்கிறது.

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