মডিউল এবং ইমপোর্ট (Modules & Imports)
মডিউল কেন প্রয়োজন? (Why Modules?)
কল্পনা করুন আপনি এমন একটি বাড়ি বানাচ্ছেন যার আসবাবপত্র, বৈদ্যুতিক তার আর পানির পাইপ সবকিছুই একটি বিশাল ঘরের ভেতর গাদাগাদি করে রাখা হয়েছে। কী এক হযবরল অবস্থা হবে, তাই না? মডিউলের (Modules) সাহায্যে আপনি আপনার কোডগুলোকে নির্দিষ্ট কাজের ওপর ভিত্তি করে আলাদা আলাদা ফাইলে ভাগ করে নিতে পারেন। যেমন, একটি ফাইল হয়তো গণিতের হিসাবনিকাশ সামলাবে, অন্যটি ব্যবহারকারীর অথেণ্টিকেশন (authentication) এবং আরেকটিতে থাকবে ইউআই (UI)।
প্রতিটি মডিউলের নিজস্ব স্কোপ (scope) থাকে — অর্থাৎ একটি মডিউলের ভেতরের ভ্যারিয়েবলগুলো অন্য কোনো মডিউলে লিক (leak) করে বা ছড়িয়ে পড়ে না, যদি না আপনি নিজে সেগুলোকে এক্সপোর্ট (export) করেন। পরবর্তীতে অন্যান্য ফাইলগুলো শুধু তাদের প্রয়োজনীয় জিনিসগুলোকে ইমপোর্ট (import) করে নিতে পারে। এটি আপনার কোডকে গোছানো রাখে, নামের দ্বন্দ্ব বা কনফ্লিক্ট এড়ায় এবং বিভিন্ন প্রজেক্টের মধ্যে কোড পুনরায় ব্যবহার করা সহজ করে তোলে।
জাভাস্ক্রিপ্ট মডিউলে import এবং export স্টেটমেন্ট ব্যবহার করা হয়। ব্রাউজারের ক্ষেত্রে আপনাকে <script type="module"> ব্যবহার করতে হবে। আর Node.js-এর ক্ষেত্রে আপনি .mjs ফাইল ব্যবহার করতে পারেন অথবা package.json-এ "type": "module" সেট করে দিতে পারেন।
নেমড এক্সপোর্ট এবং ইমপোর্ট (Named Exports & Imports)
ডিফল্ট এক্সপোর্ট (Default Exports)
প্রতিটি মডিউলে একটি মাত্র ডিফল্ট এক্সপোর্ট থাকতে পারে। এটি হলো সেই মডিউলের দেওয়া "সবচেয়ে গুরুত্বপূর্ণ জিনিস"। আপনি যখন কোনো ডিফল্ট এক্সপোর্ট ইমপোর্ট করেন, তখন আপনি চাইলে যে কোনো নামে সেটিকে ডাকতে পারেন — এক্ষেত্রে কোনো কার্লি ব্রেইস (curly braces) বা দ্বিতীয় বন্ধনী দেওয়ার প্রয়োজন হয় না।
নেমড এক্সপোর্টগুলোকে (named exports) অনেকটা দোকানের বিভিন্ন আইটেমের মতো ভাবতে পারেন (আপনি যেমন নাম ধরে নির্দিষ্ট আইটেম বেছে নেন), আর ডিফল্ট এক্সপোর্ট হলো সেই দোকানের সিগনেচার প্রোডাক্ট বা স্পেশাল পণ্যের মতো (যা একটাই হয় এবং সবাই সেটাকে "ওই দোকানের জিনিস" নামেই চেনে)।
একটি সাধারণ নিয়ম হলো: কোনো মডিউলের প্রধান ক্লাস বা কম্পোনেন্টের (component) ক্ষেত্রে ডিফল্ট এক্সপোর্ট ব্যবহার করুন, আর প্রয়োজনীয় বিভিন্ন ফাংশন বা কনস্ট্যান্টের (constant) ক্ষেত্রে নেমড এক্সপোর্ট ব্যবহার করুন।
ডিফল্ট এক্সপোর্ট এবং মিক্সড এক্সপোর্ট (Default Exports & Mixed Exports)
ডায়নামিক ইমপোর্ট এবং রি-এক্সপোর্ট (Dynamic Imports & Re-Exports)
ডায়নামিক ইমপোর্টগুলো (Dynamic imports) ফাংশন হিসেবে (কোনো স্টেটমেন্ট হিসেবে নয়) import() ব্যবহার করে। এগুলো মূলত প্রমিস (Promise) রিটার্ন করে এবং কেবল প্রয়োজন হলেই মডিউল লোড করে — যা কোড-স্প্লিটিংয়ের (code-splitting) জন্য দারুণ কাজ করে, যেখানে কেবল ব্যবহারকারীর প্রয়োজন হলেই কোড লোড করা হয়। শুরুতেই সবকিছু লোড করার বদলে এ পদ্ধতি আপনাকে দ্রুতগতির অ্যাপ তৈরি করতে সাহায্য করে।
রি-এক্সপোর্ট বা Re-exports আপনাকে এমন একটি "ইন্ডেক্স (index)" ফাইল তৈরি করার সুযোগ দেয়, যা একাধিক মডিউলের এক্সপোর্টগুলোকে একজায়গায় জড়ো করে সেখান থেকে পুনরায় এক্সপোর্ট করে। লাইব্রেরি সাজানোর ক্ষেত্রে এটি একটি চমৎকার ও পরিচ্ছন্ন উপায় বা প্যাটার্ন।