TypeScript Isolated Declarations: Monorepo-এর গতি বৃদ্ধি করুন

Monorepo বিল্ড প্রায়শই ধীর হয়ে যায় কারণ TypeScript যেভাবে ডিক্লারেশন ফাইলগুলো (declaration files) হ্যান্ডেল করে। ডিফল্টভাবে, TypeScript একটি মাত্র .d.ts ফাইল তৈরি করার আগে প্রতিটি ইমপোর্ট চেইন (import chain) বিশ্লেষণ করে। এর ফলে একটি দীর্ঘ অপেক্ষার সারি তৈরি হয় যেখানে প্যাকেজগুলোকে একে অপরের জন্য অপেক্ষা করতে হয়।

আপনি --isolatedDeclarations ফ্ল্যাগ ব্যবহার করে এটি সমাধান করতে পারেন।

এই ফ্ল্যাগটি প্যারালাল বিল্ড (parallel builds) করার সুবিধা দেয়। ডিপেন্ডেন্সির (dependencies) জন্য অপেক্ষা করার পরিবর্তে, প্রতিটি প্যাকেজ স্বাধীনভাবে তার নিজস্ব ডিক্লারেশন তৈরি করে। এর ফলে টিমগুলো বিল্ড স্পিড ৩ গুণ থেকে ১৫ গুণ পর্যন্ত বৃদ্ধি পেতে দেখে।

সমস্যা: TypeScript সাধারণত মডিউল বাউন্ডারির (module boundaries) বাইরে টাইপ ইনফার (infer) করে। যদি Package A, Package B-এর ওপর নির্ভর করে, তবে কম্পাইলারকে A-তে কাজ শুরু করার আগে B-কে পুরোপুরি রিজলভ (resolve) করতে হয়। একটি বড় Monorepo-তে, কম্পাইলার যখন একে একে কাজ করে, তখন বেশিরভাগ প্যাকেজ অলস বসে থাকে।

সমাধান: --isolatedDeclarations ফ্ল্যাগটি নিয়ম বদলে দেয়। এটি আপনাকে এক্সপোর্ট করা প্রতিটি জিনিসের জন্য স্পষ্ট টাইপ অ্যানোটেশন (explicit type annotations) লিখতে বাধ্য করে।

ট্রেডঅফ (Tradeoff): আপনার কোডে টেক্সট বা লেখার পরিমাণ বাড়বে। আপনাকে ম্যানুয়ালি ফাংশনে রিটার্ন টাইপ (return types) এবং কনস্ট্যান্টে টাইপ (types) যোগ করতে হবে। কোড দেখে টাইপ অনুমান করার জন্য আপনি কম্পাইলারের ওপর নির্ভর করতে পারবেন না।

ফলাফল: যেহেতু প্রতিটি এক্সপোর্টের একটি স্পষ্ট টাইপ থাকে, তাই কম্পাইলারকে সেগুলো বোঝার জন্য অন্য প্যাকেজগুলোর দিকে তাকাতে হয় না। এটি একই সাথে প্রতিটি প্যাকেজ প্রসেস করতে পারে।

বাস্তব জগতের ফলাফল:

  • ১৮টি প্যাকেজ বিশিষ্ট একটি monorepo-তে বিল্ড টাইম ৪৭ সেকেন্ড থেকে কমে ৩.২ সেকেন্ডে নেমে এসেছে।
  • ৩২টি প্যাকেজ বিশিষ্ট একটি monorepo-তে CI পাইপলাইনে ৮ গুণ উন্নতি দেখা গেছে।
  • পারফরম্যান্স আপনার CPU কোর-এর সাথে সামঞ্জস্যপূর্ণ। বেশি কোর মানে একসাথে বেশি প্যাকেজ বিল্ড হওয়া।

কীভাবে মাইগ্রেট করবেন:

  1. আপনার রুট tsconfig.json এবং প্রতিটি প্যাকেজ কনফিগারেশনে ফ্ল্যাগটি এনাবল (enable) করুন।
  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 };

আপনি যদি এই টাইপগুলো যোগ না করেন, তবে কম্পাইলার এরর (error) দেখাবে। এটি নিশ্চিত করে যে আপনার টাইপগুলো ডিটারমিনিস্টিক (deterministic) এবং দ্রুত।

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