Q27. What are JavaScript modules (import/export)?
ES module কীভাবে কোড ভাগ করে, named ও default export-এর পার্থক্য এবং গতিশীল import।
Module মানে কোডকে ছোট ছোট ফাইলে ভাগ করা, যাতে প্রতিটি ফাইলের একটি স্পষ্ট কাজ থাকে এবং ফাইলগুলো export ও import দিয়ে একে অন্যের সাথে যুক্ত হয়।
// math.js — এখান থেকে কিছু পাঠানো হচ্ছে
export function add(a, b) {
return a + b;
}
export const PI = 3.1416;
export default class Calculator {
// ...
}// app.js — এখান থেকে নেওয়া হচ্ছে
import Calculator, { add, PI } from "./math.js";
console.log(add(2, 3)); // 5
console.log(PI); // 3.1416দুটি ধরনের export আছে। Named export-এ চিহ্ন লেখা থাকে, তাই কোনটা নিচ্ছি তা পরিষ্কার। আর default export-এ কোনো নাম লেখতে হয় না, ফাইলে একটি করেই default রাখা যায়।
// একসাথে সব import
import { add, PI } from "./math.js";
// alias দিয়ে অন্য নামে
import { add as plus } from "./math.js";
// পুরো namespace হিসেবে
import * as math from "./math.js";
math.add(2, 3);Named import-এর নাম ভুল লিখলে বা export করা নাম না থাকলে build টাইমেই error পড়ে — ফলে ভুল ধরা পড়ে।
Module ব্যবহারের জন্য type="module" লাগে, তাই package-এ type বা .mjs এক্সটেনশন লাগতে পারে।
// index.html
<script type="module" src="./app.js"></script>
// Node-এ ESM চালাতে package.json-এ
{ "type": "module" }
// অথবা ফাইলের নাম .mjs রাখুনImport গতিশীলভাবেও করা যায় — ফাংশনের ভিতরে import() লিখলে সেটা তখনই লোড হয়।
async function loadPage(name) {
const module = await import("./pages/" + name + ".js");
return module.render();
}
// এক্ষেত্রে লোড হওয়া ফাইল আলাদা আলাদা chunk হয়
// শুধু দরকার হলে তখনই ডাউনলোড হয়Module-এর আরেকটি বড় সুবিধা — import করা মান live binding। মূল ফাইলে ভেরিয়েবলটি বদলালে, যে ফাইল সেটি import করেছে তাতেও নতুন মান দেখা যায়।
// counter.js
export let count = 0;
export function increment() {
count++;
}
// app.js
import { count, increment } from "./counter.js";
console.log(count); // 0
increment();
console.log(count); // 1 — মূল ফাইল বদলালে এখানেও দেখা যায়| বিষয় | Named export | Default export |
|---|---|---|
| ফাইলে কয়টি | যত খুশি | সর্বোচ্চ একটি |
| Import-এ নাম | লিখতে হয় | না লিখলেও চলে |
| পরিবর্তন করা | সহজ | ঝামেলা বেশি |
| সুপারিশ | বেশি ব্যবহার | একমাত্র main export-এ |
মিসনা import করলে ওই module-এর সব কোড চলে আসে, bundle-এ সাইজ বাড়ে। তাই বড় লাইব্রেরি import না করে দরকারমতো নির্দিষ্ট অংশ import করাই ভালো।