TypeScript Isolated Declarations: Monorepo ની ઝડપ વધારો
TypeScript ડિક્લેરેશન ફાઇલોને કેવી રીતે હેન્ડલ કરે છે તેના કારણે Monorepo બિલ્ડ્સ ઘણીવાર ધીમા પડી જાય છે. ડિફોલ્ટ રીતે, TypeScript એક પણ .d.ts ફાઇલ બનાવતા પહેલા દરેક ઇમ્પોર્ટ ચેઇનનું વિશ્લેષણ કરે છે. આનાથી એક લાંબી લાઇન (queue) બની જાય છે જ્યાં પેકેજોએ એકબીજાની રાહ જોવી પડે છે.
તમે --isolatedDeclarations ફ્લેગ સાથે આ સમસ્યાનું નિરાકરણ લાવી શકો છો.
આ ફ્લેગ પેરેલલ (parallel) બિલ્ડ્સની મંજૂરી આપે છે. ડિપેન્ડન્સીઝની રાહ જોવાને બદલે, દરેક પેકેજ તેના પોતાના ડિક્લેરેશન સ્વતંત્ર રીતે જનરેટ કરે છે. ટીમો બિલ્ડ સ્પીડમાં 3x થી 15x સુધીનો વધારો જોઈ શકે છે.
The Problem: TypeScript સામાન્ય રીતે મોડ્યુલ બાઉન્ડ્રીઝમાં પ્રકારો (types) ઇન્ફર (infer) કરે છે. જો પેકેજ A, પેકેજ B પર નિર્ભર હોય, તો કમ્પાઇલર A પર કામ શરૂ કરતા પહેલા B ને સંપૂર્ણ રીતે રિઝોલ્વ કરવું પડે છે. મોટા monorepo માં, જ્યારે કમ્પાઇલર એક પછી એક કામ કરે છે, ત્યારે મોટાભાગના પેકેજો નિષ્ક્રિય (idle) રહે છે.
The Solution:
--isolatedDeclarations ફ્લેગ નિયમો બદલી નાખે છે. તે તમને તમે જે કંઈ પણ એક્સપોર્ટ કરો છો તેના માટે સ્પષ્ટ (explicit) ટાઇપ એનોટેશન લખવાની જરૂરિયાત રાખે છે.
The Tradeoff: તમારા કોડમાં વધુ ટેક્સ્ટ હશે. તમારે ફંક્શન્સમાં રિટર્ન ટાઇપ્સ અને કોન્સ્ટન્ટ્સમાં ટાઇપ્સ મેન્યુઅલી ઉમેરવા પડશે. તમે તમારા કોડ પરથી આ પ્રકારોનો અંદાજ લગાવવા માટે કમ્પાઇલર પર આધાર રાખી શકતા નથી.
The Result: કારણ કે દરેક એક્સપોર્ટ પાસે સ્પષ્ટ ટાઇપ હોય છે, તેથી કમ્પાઇલરને તેમને સમજવા માટે અન્ય પેકેજો જોવાની જરૂર પડતી નથી. તે દરેક પેકેજને એકસાથે પ્રોસેસ કરી શકે છે.
Real World Results:
- 18 પેકેજો ધરાવતા monorepo માં બિલ્ડ સમય 47 સેકન્ડથી ઘટીને 3.2 સેકન્ડ થઈ ગયો.
- 32-પેકેજ ધરાવતા monorepo માં CI પાઇપલાઇન્સ પર 8x નો ફાયદો જોવા મળ્યો.
- પરફોર્મન્સ તમારા CPU કોર્સ સાથે વધે છે. વધુ કોર્સ એટલે એકસાથે વધુ પેકેજોનું બિલ્ડ થવું.
How to Migrate:
- તમારા રૂટ
tsconfig.jsonઅને દરેક પેકેજ કોન્ફિગમાં ફ્લેગ ઇનેબલ કરો. - પ્રોજેક્ટ રેફરન્સની મંજૂરી આપવા માટે "composite" ફ્લેગનો ઉપયોગ કરો.
- એક્સપોર્ટ કરેલા ફંક્શન્સમાં સ્પષ્ટ રિટર્ન ટાઇપ્સ ઉમેરો:
// પહેલા export function add(a: number, b: number) { return a + b; }
// પછી export function add(a: number, b: number): number { return a + b; }
- એક્સપોર્ટ કરેલા કોન્સ્ટન્ટ્સમાં સ્પષ્ટ ટાઇપ્સ ઉમેરો:
// પહેલા export const SETTINGS = { port: 3000 };
// પછી export const SETTINGS: { port: number } = { port: 3000 };
જો તમે આ ટાઇપ્સ ઉમેરશો નહીં, તો કમ્પાઇલર એરર (errors) આપશે. આ સુનિશ્ચિત કરે છે કે તમારા ટાઇપ્સ ડિટરમિનિસ્ટિક (deterministic) અને ઝડપી છે.
