TypeScript Isolated Declarations: Monorepo ವೇಗವನ್ನು ಹೆಚ್ಚಿಸಿ
TypeScript ಡिक्ಲರೇಶನ್ ಫೈಲ್ಗಳನ್ನು (declaration files) ನಿರ್ವಹಿಸುವ ರೀತಿಯಿಂದಾಗಿ Monorepo ಬಿಲ್ಡ್ಗಳು ಹೆಚ್ಚಾಗಿ ನಿಧಾನವಾಗುತ್ತವೆ. ಡಿಫಾಲ್ಟ್ ಆಗಿ, TypeScript ಒಂದೇ ಒಂದು .d.ts ಫೈಲ್ ಅನ್ನು ರಚಿಸುವ ಮೊದಲು ಪ್ರತಿಯೊಂದು ಇಂಪೋರ್ಟ್ ಚೈನ್ ಅನ್ನು ವಿಶ್ಲೇಷಿಸುತ್ತದೆ. ಇದು ಪ್ಯಾಕೇಜ್ಗಳು ಒಂದಕ್ಕೊಂದು ಕಾಯಬೇಕಾದಂತಹ ದೀರ್ಘ ಸಾಲವನ್ನು ಸೃಷ್ಟಿಸುತ್ತದೆ.
ನೀವು ಇದನ್ನು --isolatedDeclarations ಫ್ಲಾಗ್ ಬಳಸಿ ಸರಿಪಡಿಸಬಹುದು.
ಈ ಫ್ಲಾಗ್ ಸಮಾಂತರ ಬಿಲ್ಡ್ಗಳಿಗೆ (parallel builds) ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಡಿಪೆಂಡೆನ್ಸಿಗಳಿಗಾಗಿ ಕಾಯುವ ಬದಲು, ಪ್ರತಿ ಪ್ಯಾಕೇಜ್ ತನ್ನದೇ ಆದ ಡिक्ಲರೇಶನ್ಗಳನ್ನು ಸ್ವತಂತ್ರವಾಗಿ ರಚಿಸುತ್ತದೆ. ಇದರಿಂದ ಬಿಲ್ಡ್ ವೇಗವು 3x ರಿಂದ 15x ವರೆಗೆ ಹೆಚ್ಚಾಗುವುದನ್ನು ತಂಡಗಳು ಕಾಣಬಹುದು.
ಸಮಸ್ಯೆ: TypeScript ಸಾಮಾನ್ಯವಾಗಿ ಮಾಡ್ಯೂಲ್ ಗಡಿಗಳಾದ್ಯವೆಯೂ (module boundaries) ಟೈಪ್ಗಳನ್ನು ಅಂದಾಜಿಸುತ್ತದೆ (infers). ಪ್ಯಾಕೇಜ್ A ಎಂಬುದು ಪ್ಯಾಕೇಜ್ B ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿದ್ದರೆ, ಕಂಪೈಲರ್ A ಅನ್ನು ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು B ಅನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಪರಿಹರಿಸಲೇಬೇಕು. ದೊಡ್ಡ monorepo ನಲ್ಲಿ, ಕಂಪೈಲರ್ ಒಂದೊಂದಾಗಿ ಕೆಲಸ ಮಾಡುವಾಗ ಹೆಚ್ಚಿನ ಪ್ಯಾಕೇಜ್ಗಳು ನಿಷ್ಕ್ರಿಯವಾಗಿರುತ್ತವೆ.
ಪರಿಹಾರ:
--isolatedDeclarations ಫ್ಲಾಗ್ ನಿಯಮಗಳನ್ನು ಬದಲಾಯಿಸುತ್ತದೆ. ನೀವು ಎಕ್ಸ್ಪೋರ್ಟ್ ಮಾಡುವ ಪ್ರತಿಯೊಂದಕ್ಕೂ ಸ್ಪಷ್ಟವಾದ ಟೈಪ್ ಅ𝗻ೋಟೇಶನ್ಗಳನ್ನು (type annotations) ಬರೆಯಬೇಕೆಂದು ಇದು ಬಯಸುತ್ತದೆ.
ವಿನಿಮಯ (Tradeoff): ನಿಮ್ಮ ಕೋಡ್ನಲ್ಲಿ ಹೆಚ್ಚಿನ ಪಠ್ಯವಿರುತ್ತದೆ. ನೀವು ಫಂಕ್ಷನ್ಗಳಿಗೆ ರಿಟರ್ನ್ ಟೈಪ್ಗಳನ್ನು (return types) ಮತ್ತು ಕಾನ್ಸ್ಟೆಂಟ್ಗಳಿಗೆ (constants) ಟೈಪ್ಗಳನ್ನು ಮ್ಯಾನುಯಲ್ ಆಗಿ ಸೇರಿಸಬೇಕು. ನಿಮ್ಮ ಕೋಡ್ನಿಂದ ಈ ಟೈಪ್ಗಳನ್ನು ಅಂದಾಜಿಸಲು ನೀವು ಕಂಪೈಲರ್ ಮೇಲೆ ಅವಲಂಬಿತರಾಗಲು ಸಾಧ್ಯವಿಲ್ಲ.
ಫಲಿತಾಂಶ: ಪ್ರತಿಯೊಂದು ಎಕ್ಸ್ಪೋರ್ಟ್ ಕೂಡ ಸ್ಪಷ್ಟವಾದ ಟೈಪ್ ಅನ್ನು ಹೊಂದಿರುವುದರಿಂದ, ಅವುಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಕಂಪೈಲರ್ ಇತರ ಪ್ಯಾಕೇಜ್ಗಳನ್ನು ನೋಡುವ ಅಗತ್ಯವಿಲ್ಲ. ಇದು ಪ್ರತಿಯೊಂದು ಪ್ಯಾಕೇಜ್ ಅನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಪ್ರೊಸೆಸ್ ಮಾಡಬಲ್ಲದು.
ನೈಜ ಪ್ರಪಂಚದ ಫಲಿತಾಂಶಗಳು:
- 18 ಪ್ಯಾಕೇಜ್ಗಳನ್ನು ಹೊಂದಿರುವ monorepo ನಲ್ಲಿ ಬಿಲ್ಡ್ ಸಮಯವು 47 ಸೆಕೆಂಡುಗಳಿಂದ 3.2 ಸೆಕೆಂಡುಗಳಿಗೆ ಇಳಿಕೆಯಾಯಿತು.
- 32 ಪ್ಯಾಕೇಜ್ಗಳ monorepo ನಲ್ಲಿ CI ಪೈಪ್ಲೈನ್ಗಳಲ್ಲಿ 8x ಲಾಭ ಕಂಡುಬಂದಿತು.
- ಕಾರ್ಯಕ್ಷಮತೆಯು ನಿಮ್ಮ CPU ಕೋರ್ಗಳೊಂದಿಗೆ ಹೆಚ್ಚಾಗುತ್ತದೆ. ಹೆಚ್ಚು ಕೋರ್ಗಳೆಂದರೆ ಏಕಕಾಲದಲ್ಲಿ ಹೆಚ್ಚು ಪ್ಯಾಕೇಜ್ಗಳು ಬಿಲ್ಡ್ ಆಗುತ್ತವೆ ಎಂದರ್ಥ.
ಹೇಗೆ ಮೈಗ್ರೇಟ್ ಮಾಡುವುದು:
- ನಿಮ್ಮ ರೂಟ್
tsconfig.jsonಮತ್ತು ಪ್ರತಿ ಪ್ಯಾಕೇಜ್ ಕಾನ್ಫಿಗರೇಶನ್ನಲ್ಲಿ ಫ್ಲಾಗ್ ಅನ್ನು ಎನೇಬಲ್ ಮಾಡಿ. - ಪ್ರಾಜೆಕ್ಟ್ ರೆಫರೆನ್ಸ್ಗಳನ್ನು ಅನುಮತಿಸಲು "composite" ಫ್ಲಾಗ್ ಬಳಸಿ.
- ಎಕ್ಸ್ಪೋರ್ಟ್ ಮಾಡಿದ ಫಂಕ್ಷನ್ಗಳಿಗೆ ಸ್ಪಷ್ಟವಾದ ರಿಟರ್ನ್ ಟೈಪ್ಗಳನ್ನು ಸೇರಿಸಿ:
// Before export function add(a: number, b: number) { return a + b; }
// After export function add(a: number, b: number): number { return a + b; }
- ಎಕ್ಸ್ಪೋರ್ಟ್ ಮಾಡಿದ ಕಾನ್ಸ್ಟೆಂಟ್ಗಳಿಗೆ ಸ್ಪಷ್ಟವಾದ ಟೈಪ್ಗಳನ್ನು ಸೇರಿಸಿ:
// Before export const SETTINGS = { port: 3000 };
// After export const SETTINGS: { port: number } = { port: 3000 };
ನೀವು ಈ ಟೈಪ್ಗಳನ್ನು ಸೇರಿಸದಿದ್ದರೆ, ಕಂಪೈಲರ್ ದೋಷಗಳನ್ನು (errors) ತೋರಿಸುತ್ತದೆ. ಇದು ನಿಮ್ಮ ಟೈಪ್ಗಳು ನಿರ್ಣಾಯಕ (deterministic) ಮತ್ತು ವೇಗವಾಗಿರುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.
