The Art of Organizing Code 🎨
মডিউল সিস্টেম হলো কোডকে ছোট ছোট লজিক্যাল ব্লকে ভাগ করা। এতে কোড রিইউজেবল হয় এবং টিমে কাজ করা সহজ হয়। Node.js প্রধানত দুটি মডিউল সিস্টেম সাপোর্ট করে।
৪.১ CommonJS (The Classic Way) 📦
Node.js শুরু থেকেই CommonJS ব্যবহার করে আসছে। এটি সিনক্রোনাসলি মডিউল লোড করে, যা সার্ভার-সাইড অ্যাপ্লিকেশনের জন্য খুব কার্যকর।
🔧 Exporting (utils.js):
// ১. সিঙ্গেল ফাংশন এক্সপোর্ট const logger = (msg) => console.log(`[LOG]: ${msg}`); // ২. অবজেক্ট হিসেবে মাল্টিপল এক্সপোর্ট const formatDate = (date) => date.toLocaleDateString(); module.exports = { logger, formatDate };
📥 Importing (app.js):
const { logger, formatDate } = require('./utils'); logger("System Started"); console.log(formatDate(new Date()));
৪.২ ES Modules (The Modern Standard) ✨
এটি বর্তমান জাভাস্ক্রিপ্টের অফিশিয়াল স্ট্যান্ডার্ড। এটি ব্রাউজার এবং নোড—উভয় ক্ষেত্রেই কাজ করে এবং এটি অ্যাসিনক্রোনাস।
⚙️ অ্যাক্টিভেশন: package.json-এ "type": "module" যুক্ত করতে হবে।
🔧 Exporting (math.js):
// Named Export export const PI = 3.1416; export const multiply = (a, b) => a * b; // Default Export (প্রতি ফোল্ডারে একটিই থাকতে পারে) const calculator = () => { console.log("Calculator is ready!"); }; export default calculator;
📥 Importing (main.js):
import calc, { PI, multiply } from './math.js'; // মনে রাখবেন: ESM এ ফাইলের এক্সটেনশন (.js) দেওয়া বাধ্যতামূলক। calc(); console.log(`Area: ${multiply(PI, 10 * 10)}`);
৪.৩ Export Patterns & Best Practices 🎯
একজন সিনিয়র ডেভেলপার হিসেবে আপনাকে জানতে হবে কখন কোনটি ব্যবহার করতে হয়।
📤 Named Export
যখন একটি ফাইলে অনেকগুলো হেল্পার ফাংশন থাকে (যেমন: mathUtils.js)। এতে নির্দিষ্ট জিনিস ইম্পোর্ট করা সহজ হয়।
🎯 Default Export
যখন একটি ফাইল বা ক্লাস একটি মাত্র প্রধান কাজ করে (যেমন: UserComponent.js বা dbConfig.js)।
💡 Pro Tip: বড় প্রোজেক্টে সব সময় Named Export ব্যবহার করার চেষ্টা করবেন। এতে অটো-ইম্পোর্ট ফিচার ভালো কাজ করে এবং কোড রিফ্যাক্টর করা সহজ হয়।
৪.৪ Folder Structure: Scalable Architecture 🏗️
আপনার প্রোজেক্ট ফোল্ডার দেখেই যেন বোঝা যায় আপনি একজন প্রো ডেভেলপার। আমরা এখানে Layered Architecture ফলো করবো।
src/ ├── controllers/ # ইনকামিং রিকোয়েস্ট হ্যান্ডেল করে │ └── userController.js ├── services/ # বিজনেস লজিক (ব্রেইন) │ └── userService.js ├── models/ # ডেটাবেস স্কিমা │ └── User.js ├── routes/ # API এন্ডপয়েন্ট │ └── userRoutes.js ├── utils/ # হেল্পার ফাংশন │ └── hashPassword.js └── server.js # অ্যাপ্লিকেশনের এন্ট্রি পয়েন্ট
💡 Interview Q&A (Chapter 4)
প্রশ্ন ১: require() এবং import-এর মধ্যে প্রধান পার্থক্য কী?
উত্তর: require() হলো রানটাইম (Runtime) ইম্পোর্ট, এটি কোডের যেকোনো জায়গায় কল করা যায়। অন্যদিকে import হলো কমপাইল-টাইম (Compile-time), এটি সব সময় ফাইলের উপরে থাকতে হয়। এছাড়াও import অ্যাসিনক্রোনাস হওয়ায় এটি বড় অ্যাপ্লিকেশনে পারফরম্যান্স বেটার দেয়।
প্রশ্ন ২: module.exports এবং exports এর মধ্যে সম্পর্ক কী?
উত্তর: module.exports হলো আসল অবজেক্ট যা নোড রিটার্ন করে। exports হলো ওই অবজেক্টের একটি ছোট শর্টকাট বা রেফারেন্স। যদি আপনি সরাসরি exports = { ... } লিখেন, তবে রেফারেন্স ভেঙে যাবে এবং কোড কাজ করবে না। তাই সবসময় module.exports ব্যবহার করাই নিরাপদ।
প্রশ্ন ৩: Node.js কীভাবে মডিউল ক্যাশ (Caching) করে?
উত্তর: আপনি যদি একই মডিউল দশবার ইম্পোর্ট করেন, নোড শুধু প্রথমবার ফাইলটি পড়ে রান করবে। এরপরের ৯ বার সে মেমোরি থেকে ক্যাশ ভার্সনটি দেবে। এটি অ্যাপ্লিকেশনের গতি অনেক বাড়িয়ে দেয়।
প্রশ্ন ৪: Circular Dependency কী এবং এটি কীভাবে এড়ানো যায়?
উত্তর: যখন মডিউল A ইম্পোর্ট করে মডিউল B-কে, আবার মডিউল B ইম্পোর্ট করে মডিউল A-কে—তখন এটি একটি লুপ তৈরি করে। এটি এড়াতে কোডকে ছোট ছোট ইনডিপেনডেন্ট মডিউলে ভাগ করতে হয় এবং ডিপেন্ডেন্সি ইনজেকশন প্যাটার্ন ফলো করতে হয়।
🎯 অধ্যায় ৪ এর সারাংশ (Summary)
- ✓ CommonJS (require/module.exports): Node.js-এর ক্লাসিক ওয়ে, সার্ভার-সাইডের জন্য পারফেক্ট
- ✓ ES Modules (import/export): মর্ডান স্ট্যান্ডার্ড, ব্রাউজার এবং নোড উভয় জায়গায় কাজ করে
- ✓ Named Export vs Default Export: একাধিক ফাংশনের জন্য Named, একক কাজের জন্য Default
- ✓ Layered Architecture: Controllers → Services → Models → Routes → Utils
- ✓ Caching: একবার লোড হওয়া মডিউল মেমোরিতে স্টোর হয়, পরবর্তীবার দ্রুত লোড হয়
📌 পরবর্তী ধাপ (Phase 2): Backend Core Concepts
আমরা আমাদের লার্নিংকে নেক্সট লেভেলে নিয়ে যাবো! সেখানে আমরা শিখবো কীভাবে ম্যানুয়ালি API রাউটিং করতে হয় এবং Express.js 🚀-এর গভীরে ডুব দেবো। প্রস্তুত তো?