Metro Bundler হল Meta-এর তৈরি একটি বিশেষায়িত JavaScript বান্ডলার, যা শুধুমাত্র React Native-এর জন্য তৈরি এবং ফ্রেমওয়ার্কের কোরে অন্তর্ভুক্ত। অফিসিয়াল React Native 0.76 ডকুমেন্টেশন (2025) অনুযায়ী, Metro Fast Refresh-সহ ইনক্রিমেন্টাল বিল্ড এবং প্ল্যাটফর্ম-নির্দিষ্ট এক্সটেনশন .native.js, .ios.js এবং .android.js-সহ মডিউল রেজল্যুশন প্রদান করে। Webpack-এর বিপরীতে, Metro দীর্ঘস্থায়ী মডিউল গ্রাফ ক্যাশ ব্যবহার করে না — পরিবর্তে এটি ফাইল পরিবর্তন হলে প্রতিবার গ্রাফ পুনর্নির্মাণ করে, যা ডেভেলপমেন্টের সময় তাৎক্ষণিক হট রিলোড প্রদান করে।
মূল পয়েন্ট
Metro Bundler হল একটি ওপেন-সোর্স JavaScript বান্ডলার যা Meta React Native-এর জন্য তৈরি করেছে এবং সমস্ত ফ্রেমওয়ার্ক প্রজেক্টে ডিফল্টরূপে ব্যবহৃত হয়। Metro-এর কাজ হল প্রজেক্টের JavaScript কোড নির্ভরতাসহ নিয়ে এক বা একাধিক বান্ডলে একত্রিত করা যা ডিভাইসে চলে। সার্বজনীন বান্ডলার (Webpack, Rollup, Parcel) থেকে ভিন্ন, Metro মোবাইল ডেভেলপমেন্টের বিশেষত্বের জন্য অপ্টিমাইজড: ন্যূনতম বিল্ড সময়, ডেভেলপমেন্টের সময় ইনক্রিমেন্টাল আপডেট এবং প্ল্যাটফর্ম মডিউল (Objective-C, Swift, Java, Kotlin নেটিভ মডিউল) সঠিকভাবে পরিচালনা। Metro React Native CLI-এর অংশ হিসেবে আসে এবং আলাদা ইনস্টলেশনের প্রয়োজন হয় না। React Native 0.72 থেকে শুরু করে, Metro সংস্করণ 0.80+ মডিউলের সমান্তরাল ট্রান্সপাইলেশন সমর্থন করে, যা মাল্টি-কোর প্রসেসরে বিল্ড 40% পর্যন্ত গতি বাড়ায়।
Metro-এর আর্কিটেকচার তিনটি স্বাধীন উপাদানে বিভক্ত: Resolver, Transformer এবং Bundler। Resolver মডিউল খোঁজা এবং সমাধানের জন্য দায়ী — এটি import/require এক্সপ্রেশন পড়ে, প্ল্যাটফর্ম এক্সটেনশন বিবেচনা করে সংশ্লিষ্ট ফাইল খুঁজে এবং সম্পূর্ণ পাথ ফেরত দেয়। Transformer ট্রান্সপাইলেশন করে: Babel presets এবং plugins-সহ প্রয়োগ করে, JSX, TypeScript বা Flow-কে বিশুদ্ধ JavaScript-এ রূপান্তর করে। Bundler চূড়ান্ত পর্যায়: এটি Resolver থেকে নির্ভরতা গ্রাফ এবং Transformer থেকে রূপান্তরিত ফাইল নেয়, তারপর সেগুলিকে এক বা একাধিক বান্ডলে (মডিউল বান্ডল) সিরিয়ালাইজ করে। তিনটি ধাপে বিভাজন Metro-কে প্রতিটি ধাপের ফলাফল ক্যাশ করতে দেয়: যদি শুধু একটি ফাইল পরিবর্তিত হয়, Resolver এবং Bundler বাকি মডিউলের জন্য ক্যাশ ব্যবহার করতে পারে, যা ডেভেলপমেন্ট মোডে বিল্ডের গতি 10 গুণ পর্যন্ত বাড়ায়।
Metro-তে Resolver একটি মডিউল রেজল্যুশন অ্যালগরিদম প্রয়োগ করে যা আংশিকভাবে Node.js মডিউল রেজল্যুশনের সাথে সামঞ্জস্যপূর্ণ। Node.js থেকে মূল পার্থক্য হল প্ল্যাটফর্ম এক্সটেনশনের সমর্থন: require(‘./Component’) নির্দিষ্ট অগ্রাধিকার ক্রমে Component.native.js, Component.ios.js, Component.android.js খোঁজে। Resolver বিকল্প বাস্তবায়নে মডিউল ম্যাপ করার জন্য package.json ফিল্ড “react-native”-ও সমর্থন করে — এটি প্ল্যাটফর্ম-নির্দিষ্ট কোড সহ লাইব্রেরির জন্য মানক প্রক্রিয়া। যদি ফাইল না পাওয়া যায়, Resolver সম্পূর্ণ অনুসন্ধান স্ট্যাক-সহ একটি ত্রুটি নিক্ষেপ করে।
Metro-র ভিতরে Transformer metro-react-native-babel-preset প্রিসেট-সহ Babel ব্যবহার করে। মানক কনফিগারেশনে অন্তর্ভুক্ত: JSX-কে React.createElement-এ রূপান্তর, TypeScript সমর্থন (টাইপ অপসারণ), Flow সমর্থন এবং আধুনিক JavaScript মানদণ্ডের (async/await, optional chaining, nullish coalescing) জন্য পলিফিল। Transformer সমান্তরাল মোডে কাজ করে: প্রতিটি মডিউল স্বাধীনভাবে ট্রান্সপাইল করা হয়, ওয়ার্কার প্রক্রিয়ার পুল ব্যবহার করে (ডিফল্টরূপে সংখ্যা CPU সংখ্যার সাথে মিলে যায়)। Metro 0.80 থেকে, Granular Transformer Cache সমর্থিত — পৃথক ফাইল স্তরে ক্যাশ অকার্যকরকরণ।
Metro-র মূল বৈশিষ্ট্যগুলির মধ্যে একটি হল প্ল্যাটফর্ম ফাইল এক্সটেনশনের সমর্থন। একটি React Native প্রজেক্টে একই মডিউলের তিনটি সংস্করণ থাকতে পারে: Component.ios.js (iOS), Component.android.js (Android) এবং Component.native.js (উভয় প্ল্যাটফর্ম)। require(‘./Component’) আমদানি করার সময়, Resolver লক্ষ্য বিল্ড প্ল্যাটফর্ম অনুযায়ী স্বয়ংক্রিয়ভাবে সঠিক সংস্করণ নির্বাচন করে। এটি শর্তসাপেক্ষ Platform.OS নির্মাণ ছাড়াই প্ল্যাটফর্ম-নির্ভর কোড লেখার অনুমতি দেয়। অগ্রাধিকার ক্রম: name.platform.js > name.native.js > name.js। .native.js এক্সটেনশন সাধারণ কোডের জন্য ব্যবহৃত হয় যা উভয় প্ল্যাটফর্মে কাজ করে কিন্তু ওয়েবের সাথে অসামঞ্জস্যপূর্ণ। .ios.js এবং .android.js এক্সটেনশন নির্দিষ্ট বৈশিষ্ট্য বাস্তবায়নের জন্য কাজ করে — নেভিগেশন, জেসচার, ফাইল সিস্টেম অপারেশন। Metro resolver.sourceExts কনফিগারেশনের মাধ্যমে কাস্টম এক্সটেনশন সমর্থন করে।
// metro.config.js — sourceExts এবং watchFolders সেটআপ
const config = {
resolver: {
sourceExts: ['jsx', 'js', 'tsx', 'ts', 'json'],
platformExtensions: ['ios', 'android', 'native'],
},
transformer: {
babelTransformerPath: require('metro-react-native-babel-transformer'),
},
watchFolders: [path.resolve('../shared')],
};
Fast Refresh হল Metro-র উপরে নির্মিত React Native-এর জন্য একটি হট রিলোড প্রক্রিয়া। যখন একজন ডেভেলপার ফাইল পরিবর্তন করে, Metro শুধু পরিবর্তিত মডিউল পুনরায় ট্রান্সপাইল করে এবং WebSocket-এর মাধ্যমে অ্যাপে আপডেট পাঠায়। Fast Refresh পুরো অ্যাপ্লিকেশন রিলোড না করেই UI আপডেট করে এবং শুধু JSX বা স্টাইল পরিবর্তিত হলে React কম্পোনেন্টের অবস্থা সংরক্ষণ করে। যদি হুক বা অবস্থা সহ কোড পরিবর্তিত হয়, Fast Refresh শুধু পরিবর্তিত কম্পোনেন্ট পুনরায় মাউন্ট করে। Metro দুটি মোড সমর্থন করে: Hot Module Replacement (HMR) চলাকালীন মডিউল পরিবর্তনের জন্য এবং Live Reload নেটিভ মডিউল বা কনফিগারেশন পরিবর্তনে সম্পূর্ণ অ্যাপ্লিকেশন রিলোডের জন্য। Fast Refresh React Native 0.76-এ ডিফল্টরূপে সক্রিয় এবং অতিরিক্ত কনফিগারেশনের প্রয়োজন হয় না — শুধু npx react-native start চালান।
| মোড | গতি | অবস্থা সংরক্ষণ করে | ট্রিগার |
|---|---|---|---|
| Fast Refresh | 200-500ms | হ্যাঁ | JS/TS ফাইল পরিবর্তন |
| HMR | 100-300ms | হ্যাঁ | CSS/স্টাইল পরিবর্তন |
| Live Reload | 1-3s | না | নেটিভ কনফিগ পরিবর্তন |
| Full Rebuild | 10-60s | না | podspec/build.gradle পরিবর্তন |
metro.config.js ফাইলটি React Native প্রজেক্টের রুটে অবস্থিত Metro কনফিগারেশন ফাইল। এতে কনফিগার করা হয়: resolver (sourceExts, platformExtensions, extraNodeModules), transformer (babelTransformerPath, minifierConfig), server (port, host, enableFastRefresh) এবং watcher (watchFolders, healthCheck)। মানক Metro কনফিগারেশন @react-native/metro-config প্যাকেজ (React Native 0.76+) থেকে ইনহেরিট করে। মনোরেপো প্রজেক্টের জন্য, watchFolders যোগ করুন — এটি Metro-কে প্রজেক্ট রুটের বাইরের প্যাকেজে পরিবর্তন ট্র্যাক করতে দেয়। sourceExts কনফিগার করতে, কাস্টম ট্রান্সফর্মারের জন্য ‘svg’, ‘png’, ‘gql’ যোগ করুন। Metro async function-এর মাধ্যমে অ্যাসিনক্রোনাস কনফিগারেশন সমর্থন করে — এটি পরিবেশের ভিত্তিতে ডায়নামিক কনফিগ জেনারেশনের জন্য উপযোগী।
Metro বিল্ডের অপ্টিমাইজেশন সঠিক ক্যাশ কনফিগারেশন দিয়ে শুরু হয়। maxWorkers CPU-র সংখ্যা মাইনাস 1-এ সেট করুন। ডিস্ট্রিবিউশনের জন্য, CI-তে resetCache ব্যবহার করুন। sourceExts কমিয়ে দিন — অতিরিক্ত এক্সটেনশন মডিউল রেজল্যুশন ধীর করে। বড় প্রজেক্টের জন্য, watchFolders শুধু প্রয়োজনীয় ডিরেক্টরির জন্য কনফিগার করুন। Metro Hermes বাইটকোড মিনিফিকেশন সমর্থন করে, যা মানক Terser-এর চেয়ে ছোট বান্ডল আকার দেয় — minifierPath: ‘metro-minify-terser’ ব্যবহার করুন।
Metro সরাসরি Hermes বাইটকোড-এ বিল্ড মোড সমর্থন করে — JavaScript AST ধাপ এড়িয়ে। HermesTransformer-সহ বিল্ড করার সময়, মডিউল সাধারণ JavaScript-এর পরিবর্তে HBC (Hermes ByteCode)-এ কম্পাইল হয়। এটি প্রদান করে: ছোট বান্ডল আকার (30-40%), দ্রুত অ্যাপ্লিকেশন স্টার্টআপ (20-30%) এবং কম মেমরি খরচ। সক্রিয় করতে, metro.config.js-এ hermesCommand সেট করুন এবং build.gradle (Android) বা Podfile (iOS)-এ Hermes ফ্ল্যাগ সক্রিয় করুন। Hermes বান্ডল বিল্ড দুটি ধাপে করা হয়: প্রথমে Metro JavaScript বান্ডল তৈরি করে, তারপর Hermes CLI এটি HBC-তে রূপান্তর করে। React Native 0.70 থেকে, Hermes Android-এ ডিফল্ট ইঞ্জিন, iOS-এ এটি স্পষ্টভাবে সক্রিয় করা প্রয়োজন।
Metro এবং Webpack-এর মধ্যে পার্থক্য ভিন্ন লক্ষ্যের কারণে। Webpack হল প্লাগইন এবং লোডারের বিশাল ইকোসিস্টেম-সহ ওয়েবের জন্য একটি সার্বজনীন বান্ডলার। Metro হল React Native-এর জন্য একটি বিশেষায়িত বান্ডলার যেখানে অগ্রাধিকার হল ইনক্রিমেন্টাল বিল্ড গতি এবং নেটিভ মডিউলের সাথে সঠিক কাজ। Webpack স্মার্ট ক্যাশ অকার্যকরকরণ-সহ দীর্ঘস্থায়ী মডিউল গ্রাফ ব্যবহার করে — এটি ওয়েবে দ্রুত পুনর্নির্মাণ দেয় কিন্তু প্ল্যাটফর্ম এক্সটেনশনের সাথে সমস্যা তৈরি করে। Metro বিল্ডের মধ্যে গ্রাফ ক্যাশ করে না বরং প্রতিবার এটি তৈরি করে — এটি প্ল্যাটফর্ম এক্সটেনশন এবং Haste মডিউল পরিচালনা সহজ করে। Webpack চাঙ্ক-সহ ডায়নামিক ইম্পোর্ট সমর্থন করে, Metro-ও করে — React.lazy() এবং Suspense-এর মাধ্যমে, কিন্তু একটি সক্রিয় অনুরোধের সীমা-সহ। Metro-র ইকোসিস্টেম উল্লেখযোগ্যভাবে ছোট: style-loader, css-loader, file-loader-এর কোনো বিকল্প নেই — এই কাজগুলি React Native-এ ভিন্নভাবে সমাধান করা হয়।
Metro React Native প্রজেক্টের জন্য একমাত্র সঠিক পছন্দ। Webpack আউট অফ দ্য বক্স প্ল্যাটফর্ম-সচেতন রেজল্যুশন সমর্থন করে না, এবং Webpack-সহ React Native সেট আপ করতে উল্লেখযোগ্য প্রচেষ্টা প্রয়োজন (haul bundler, expo web packager)। Metro React Native CLI-তে একীভূত, অফিসিয়াল Meta টিম দ্বারা সমর্থিত এবং React Native-এর প্রতিটি রিলিজের সাথে আপডেট পায়। React Native Web প্রজেক্টের জন্য, আপনি মোবাইল বান্ডলের জন্য Metro রেখে ওয়েব বিল্ডের জন্য Webpack ব্যবহার করতে পারেন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
npx react-native start --reset-cache চালান বা প্রজেক্ট রুট থেকে $TMPDIR/metro-* ফোল্ডার এবং .metro-health-check* ডিরেক্টরি মুছুন। বিকল্পভাবে: npx react-native clean — এই কমান্ড Metro-র সমস্ত অস্থায়ী ফাইল সাফ করে, যার মধ্যে Babel ক্যাশ এবং Haste ম্যাপ রয়েছে। সাফ করার পরে, প্রথম বিল্ড সম্পূর্ণ হবে (60-120 সেকেন্ড), কিন্তু পরবর্তী ইনক্রিমেন্টাল বিল্ড স্বাভাবিক গতিতে ফিরে আসবে।
যাচাই করুন যে প্যাকেজটি package.json dependencies-এ আছে (devDependencies নয়)। যদি মডিউল মনোরেপোতে থাকে, তাহলে metro.config.js-এ watchFolders-এ পাথ যোগ করুন। Metro ডিফল্টরূপে সিমলিঙ্ক অনুসরণ করে না — স্পষ্ট ম্যাপিংয়ের জন্য resolver.extraNodeModules ব্যবহার করুন। Yarn PnM-এর জন্য, resolver.useWatchman: false সেট করুন। যদি মডিউল প্ল্যাটফর্ম এক্সটেনশন ব্যবহার করে, তবে নির্দিষ্ট পাথে .ios.js বা .android.js ফাইল আছে কিনা নিশ্চিত করুন।
বাড়ান metro.config.js-এ maxWorkers CPU-র সংখ্যা মাইনাস 1-এ। watchFolders শুধু প্রয়োজনীয় ডিরেক্টরির জন্য কনফিগার করুন। প্রোডাকশন বিল্ডের জন্য Hermes বাইটকোড ব্যবহার করুন — এটি JS মিনিফিকেশন এড়িয়ে চূড়ান্ত বিল্ড দ্রুত করে। ডেভেলপমেন্টের জন্য Fast Refresh সক্রিয় করুন (এটি ডিফল্টরূপে সক্রিয়)। sourceExts শুধু প্রয়োজনীয় এক্সটেনশনে সীমিত করুন। লেজি লোডিং-এর মাধ্যমে বান্ডলকে চাঙ্কে ভাগ করার বিবেচনা করুন।
প্রযুক্তিগতভাবে হ্যাঁ, কিন্তু এটি সুপারিশ করা হয় না। Metro ওয়েব বিল্ডের জন্য অপ্টিমাইজড নয়: CSS, HTML, ইমেজ মডিউল হিসাবে সমর্থন নেই, ব্রাউজার স্তরে ডায়নামিক ইম্পোর্ট-সহ কোড স্প্লিটিং নেই। ওয়েবের জন্য, Webpack, Vite বা Parcel ব্যবহার করুন। Metro React Native-এর জন্য একটি বিশেষায়িত সমাধান, এবং এটি ওয়েবের জন্য অভিযোজিত করার চেষ্টা কর্মক্ষমতা হ্রাস এবং লোডার ইকোসিস্টেমের অভাব ঘটাবে।
Re.Pack হল React Native প্রজেক্টে Metro-কে Webpack দিয়ে প্রতিস্থাপনের জন্য একটি কমিউনিটি টুল। এটি Webpack লোডার ইকোসিস্টেম (css-loader, svg-loader) এবং উন্নত কোড স্প্লিটিং-এ অ্যাক্সেস প্রদান করে। তবে, Re.Pack কনফিগার করা আরও জটিল, Meta দ্বারা অফিসিয়ালি সমর্থিত নয়, এবং React Native-এর নতুন সংস্করণের সাথে সামঞ্জস্যের গ্যারান্টি দেয় না। Metro একমাত্র অফিসিয়ালি সমর্থিত বান্ডলার রয়ে গেছে, যা স্থিতিশীলতা এবং প্রতিটি রিলিজের সাথে গ্যারান্টিযুক্ত সামঞ্জস্য প্রদান করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন