TypeScript Isolated Declarations: Monorepo ਦੀ ਰਫ਼ਤਾਰ ਵਧਾਓ
Monorepo ਬਿਲਡ ਅਕਸਰ ਇਸ ਕਰਕੇ ਹੌਲੀ ਹੋ ਜਾਂਦੇ ਹਨ ਕਿਉਂਕਿ TypeScript ਡਿਕਲੇਰੇਸ਼ਨ ਫਾਈਲਾਂ (declaration files) ਨੂੰ ਸੰਭਾਲਣ ਦਾ ਤਰੀਕਾ ਵੱਖਰਾ ਹੈ। ਡਿਫੌਲਟ ਰੂਪ ਵਿੱਚ, TypeScript ਇੱਕ .d.ts ਫਾਈਲ ਬਣਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਹਰ ਇੰਪੋਰਟ ਚੇਨ (import chain) ਦਾ ਵਿਸ਼ਲੇਸ਼ਣ ਕਰਦਾ ਹੈ। ਇਸ ਨਾਲ ਇੱਕ ਲੰਬੀ ਲਾਈਨ ਬਣ ਜਾਂਦੀ ਹੈ ਜਿੱਥੇ ਪੈਕੇਜਾਂ ਨੂੰ ਇੱਕ ਦੂਜੇ ਦੀ ਉਡੀਕ ਕਰਨੀ ਪੈਂਦੀ ਹੈ।
ਤੁਸੀਂ ਇਸ ਨੂੰ --isolatedDeclarations ਫਲੈਗ (flag) ਨਾਲ ਠੀਕ ਕਰ ਸਕਦੇ ਹੋ।
ਇਹ ਫਲੈਗ ਪੈਰਲਲ ਬਿਲਡਸ (parallel builds) ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ। ਡਿਪੈਂਡੈਂਸੀਆਂ (dependencies) ਦੀ ਉਡੀਕ ਕਰਨ ਦੀ ਬਜਾਏ, ਹਰ ਪੈਕੇਜ ਆਪਣੀਆਂ ਡਿਕਲੇਰੇਸ਼ਨਾਂ ਸੁਤੰਤਰ ਰੂਪ ਵਿੱਚ ਤਿਆਰ ਕਰਦਾ ਹੈ। ਟੀਮਾਂ ਬਿਲਡ ਸਪੀਡ ਵਿੱਚ 3x ਤੋਂ 15x ਤੱਕ ਦਾ ਵਾਧਾ ਦੇਖਦੀਆਂ ਹਨ।
ਸਮੱਸਿਆ: TypeScript ਆਮ ਤੌਰ 'ਤੇ ਮੋਡਿਊਲ ਦੀਆਂ ਸੀਮਾਵਾਂ (module boundaries) ਦੇ ਪਾਰ ਟਾਈਪਸ ਦਾ ਅੰਦਾਜ਼ਾ ਲਗਾਉਂਦਾ ਹੈ। ਜੇਕਰ ਪੈਕੇਜ A, ਪੈਕੇਜ B 'ਤੇ ਨਿਰਭਰ ਹੈ, ਤਾਂ ਕੰਪਾਈਲਰ ਨੂੰ A 'ਤੇ ਕੰਮ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ B ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਹੱਲ ਕਰਨਾ ਪੈਂਦਾ ਹੈ। ਇੱਕ ਵੱਡੇ monorepo ਵਿੱਚ, ਜਦੋਂ ਕੰਪਾਈਲਰ ਇੱਕ-ਇੱਕ ਕਰਕੇ ਕੰਮ ਕਰਦਾ ਹੈ, ਤਾਂ ਜ਼ਿਆਦਾਤਰ ਪੈਕੇਜ ਵਿਹਲੇ ਬੈਠੇ ਰਹਿੰਦੇ ਹਨ।
ਹੱਲ:
--isolatedDeclarations ਫਲੈਗ ਨਿਯਮਾਂ ਨੂੰ ਬਦਲ ਦਿੰਦਾ ਹੈ। ਇਹ ਤੁਹਾਨੂੰ ਉਹਨਾਂ ਸਾਰੀਆਂ ਚੀਜ਼ਾਂ ਲਈ ਸਪੱਸ਼ਟ ਟਾਈਪ ਐਨੋਟੇਸ਼ਨਾਂ (type annotations) ਲਿਖਣ ਦੀ ਲੋੜ ਪਾਉਂਦਾ ਹੈ ਜੋ ਤੁਸੀਂ ਐਕਸਪੋਰਟ (export) ਕਰਦੇ ਹੋ।
ਸਮਝੌਤਾ (Tradeoff): ਤੁਹਾਡੇ ਕੋਡ ਵਿੱਚ ਟੈਕਸਟ ਜ਼ਿਆਦਾ ਹੋਵੇਗਾ। ਤੁਹਾਨੂੰ ਫੰਕਸ਼ਨਾਂ ਲਈ ਰਿਟਰਨ ਟਾਈਪਸ (return types) ਅਤੇ ਕੰਸਟੈਂਟਸ (constants) ਲਈ ਟਾਈਪਸ ਮੈਨੂਅਲੀ ਜੋੜਨੇ ਪੈਣਗੇ। ਤੁਸੀਂ ਇਹਨਾਂ ਟਾਈਪਸ ਦਾ ਅੰਦਾਜ਼ਾ ਲਗਾਉਣ ਲਈ ਕੰਪਾਈਲਰ 'ਤੇ ਭਰੋਸਾ ਨਹੀਂ ਕਰ ਸਕਦੇ।
ਨਤੀਜਾ: ਕਿਉਂਕਿ ਹਰ ਐਕਸਪੋਰਟ ਦਾ ਇੱਕ ਸਪੱਸ਼ਟ ਟਾਈਪ ਹੁੰਦਾ ਹੈ, ਇਸ ਲਈ ਕੰਪਾਈਲਰ ਨੂੰ ਉਹਨਾਂ ਨੂੰ ਸਮਝਣ ਲਈ ਦੂਜੇ ਪੈਕੇਜਾਂ ਨੂੰ ਦੇਖਣ ਦੀ ਲੋੜ ਨਹੀਂ ਹੁੰਦੀ। ਇਹ ਹਰ ਪੈਕੇਜ ਨੂੰ ਇੱਕੋ ਸਮੇਂ ਪ੍ਰੋਸੈਸ ਕਰ ਸਕਦਾ ਹੈ।
ਅਸਲ ਦੁਨੀਆ ਦੇ ਨਤੀਜੇ:
- 18 ਪੈਕੇਜਾਂ ਵਾਲੇ ਇੱਕ monorepo ਵਿੱਚ ਬਿਲਡ ਦਾ ਸਮਾਂ 47 ਸੈਕਿੰਡ ਤੋਂ ਘਟ ਕੇ 3.2 ਸੈਕਿੰਡ ਰਹਿ ਗਿਆ।
- 32-ਪੈਕੇਜ ਵਾਲੇ monorepo ਵਿੱਚ CI ਪਾਈਪਲਾਈਨਾਂ 'ਤੇ 8x ਦਾ ਫਾਇਦਾ ਦੇਖਿਆ ਗਿਆ।
- ਪਰਫਾਰਮੈਂਸ ਤੁਹਾਡੇ CPU ਕੋਰਸ (cores) ਦੇ ਅਨੁਸਾਰ ਵਧਦੀ ਹੈ। ਵਧੇਰੇ ਕੋਰਸ ਦਾ ਮਤਲਬ ਹੈ ਕਿ ਇੱਕੋ ਸਮੇਂ ਵਧੇਰੇ ਪੈਕੇਜ ਬਿਲਡ ਹੋ ਸਕਦੇ ਹਨ।
ਕਿਵੇਂ ਮਾਈਗ੍ਰੇਟ ਕਰੀਏ:
- ਆਪਣੇ ਰੂਟ
tsconfig.jsonਅਤੇ ਹਰ ਪੈਕੇਜ ਕਨਫਿਗ ਵਿੱਚ ਫਲੈਗ ਨੂੰ ਇਨੇਬਲ (enable) ਕਰੋ। - ਪ੍ਰੋਜੈਕਟ ਰੈਫਰੈਂਸਾਂ (project references) ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ "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) ਅਤੇ ਤੇਜ਼ ਹਨ।
