JavaScript বা React নিয়ে কাজ করতে গিয়ে export আর import শব্দদুটোর সাথে কমবেশি পরিচয় হয়ে গেছেন নিশ্চয়ই। কিন্তু নতুনরা জাভাস্ক্রিপ্টে বা রিয়েক্টে কাজ করতে গেলে তাদের কাছ থেকে একটা প্রশ্ন সব সময়ই আসে; এই default export আর named export এর মধ্যে পার্থক্যটা কী? আর কখন কোনটা ব্যবহার করবো?
আজকের এই ব্লগে আমরা খুব সহজ ভাষায় বিষয়টা একবারে পরিষ্কার করে ফেলবো।
Named Export কী এবং কিভাবে কাজ করে?
Named Export নাম থেকেই তো বোঝা যাচ্ছে যে এটা এমন একটা এক্সপোর্ট যেটার একটা নির্দিষ্ট নাম থাকবে। চলুন একটা উদাহরণ দিয়ে দেখি:
ধরুন আপনি একটি mathUtils.js ফাইল তৈরি করলেন যেখানে কিছু গাণিতিক ফাংশন আছে:
// mathUtils.js
// বিভিন্ন গাণিতিক ফাংশনগুলো named export হিসেবে এক্সপোর্ট করছি
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
export const multiply = (a, b) => a * b;
// অথবা আলাদাভাবে এক্সপোর্ট করতে পারেন
const divide = (a, b) => b !== 0 ? a / b : 'Cannot divide by zero';
const percentage = (value, total) => (value / total) * 100;
export { divide, percentage };
এখন অন্য ফাইলে এগুলো ইমপোর্ট করতে হলে:
// app.js
// নির্দিষ্ট ফাংশনগুলো ইমপোর্ট করছি - নাম একদম ঠিক রাখতে হবে
import { add, subtract, multiply } from './mathUtils.js';
// ব্যবহার করা
console.log(add(5, 3)); // 8
console.log(subtract(10, 4)); // 6
// অথবা সব একসাথে ইমপোর্ট করতে চাইলে
import * as MathUtils from './mathUtils.js';
console.log(MathUtils.multiply(4, 5)); // 20
Named Export এর বৈশিষ্ট্য:
- নাম ঠিক রাখতে হয়: ইমপোর্ট করার সময় যে নামে এক্সপোর্ট করেছেন, সেই নামেই ইমপোর্ট করতে হবে
- একাধিক এক্সপোর্ট: একটি ফাইল থেকে একাধিক জিনিস এক্সপোর্ট করতে পারেন
- সিলেক্টেড ইমপোর্ট: যেগুলো দরকার শুধু সেগুলোই ইমপোর্ট করতে পারেন
Default Export কী এবং কিভাবে কাজ করে?
Default Export হলো এমন একটা এক্সপোর্ট যেটা ফাইলের প্রধান বা মূল জিনিস। একটা ফাইলে শুধুমাত্র একটাই default export থাকতে পারে। চলুন একটি রিয়েক্ট কম্পোনেন্টের উদাহরণ থেকে বিষয়টি ক্লিয়ার করে ফেলি।
// Button.js
// একটা React কম্পোনেন্ট যেটা ফাইলের মূল ফাংশন
const Button = ({ children, onClick, type = "button" }) => {
return (
<button
type={type}
onClick={onClick}
className="custom-button"
>
{children}
</button>
);
};
// Default export হিসেবে এক্সপোর্ট করছি
export default Button;
এখন এটা ইমপোর্ট করতে হলে:
// App.js
// Default export ইমপোর্ট করার সময় যেকোনো নাম দিতে পারেন
import Button from './Button.js';
import MyButton from './Button.js'; // এটাও কাজ করবে
import CoolButton from './Button.js'; // এটাও কাজ করবে
// ব্যবহার করা
function App() {
return (
<div>
<Button onClick={() => alert('Clicked!')}>
Click Me
</Button>
</div>
);
}
অথবা আরেকটি উদাহরণ (ক্লাস কিংবা অবজেক্ট এক্সপোর্ট) এর মাধ্যমে দেখা যাক।
// UserService.js
class UserService {
constructor() {
this.users = [];
}
addUser(user) {
this.users.push(user);
}
getUsers() {
return this.users;
}
findUser(id) {
return this.users.find(user => user.id === id);
}
}
// ক্লাসটি default export হিসেবে এক্সপোর্ট করছি
export default UserService;
// main.js
// যেকোনো নাম দিয়ে ইমপোর্ট করতে পারি
import UserService from './UserService.js';
// অথবা
import MyUserService from './UserService.js';
const userService = new UserService();
userService.addUser({ id: 1, name: 'আহমেদ' });
দুটোর মধ্যে মূল পার্থক্য
আসুন একটা টেবিলের মাধ্যমে দুই টাইপ এক্সপোর্টের মধ্যে তুলনামূলক পার্থক্যগুলো দেখি:
বিষয় | Named Export | Default Export |
---|---|---|
সংখ্যা | একটি ফাইলে একাধিক হতে পারে | একটি ফাইলে শুধু একটি |
ইমপোর্টের নাম | নির্দিষ্ট নাম ব্যবহার করতে হয় | যেকোনো নাম দিতে পারেন |
সিনট্যাক্স | import { functionName } from './file' | import AnyName from './file' |
ব্যবহারের ক্ষেত্র | Utility functions, constants | Main component, class, object |
কখন কোনটা ব্যবহার করবেন?
এটাই সবচেয়ে গুরুত্বপূর্ণ প্রশ্ন! আসুন বিভিন্ন পরিস্থিতি অনুযায়ী দেখি:
Named Export ব্যবহার করুন যখন:
১. Utility Functions তৈরি করছেন:
// helpers.js
export const formatDate = (date) => { /* code */ };
export const formatCurrency = (amount) => { /* code */ };
export const validateEmail = (email) => { /* code */ };
২. Constants বা Configuration এক্সপোর্ট করছেন:
// config.js
export const API_BASE_URL = 'https://api.example.com';
export const DEFAULT_TIMEOUT = 5000;
export const SUPPORTED_LANGUAGES = ['bn', 'en', 'hi'];
৩. একাধিক related functions আছে:
// stringUtils.js
export const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);
export const truncate = (str, length) => str.length > length ? str.slice(0, length) + '...' : str;
export const slugify = (str) => str.toLowerCase().replace(/\s+/g, '-');
Default Export ব্যবহার করুন যখন:
১. React Component তৈরি করছেন:
// Header.js
const Header = () => {
return <header>My Website</header>;
};
export default Header;
২. একটি Class এক্সপোর্ট করছেন:
// Database.js
class Database {
connect() { /* code */ }
query() { /* code */ }
}
export default Database;
৩. একটি Main Function আছে:
// logger.js
const logger = (message, level = 'info') => {
console.log(`[${level.toUpperCase()}] ${message}`);
};
export default logger;
Mixed Approach: দুটো একসাথে ব্যবহার
অনেক সময় একটি ফাইলে default export এর পাশাপাশি named export ও থাকতে পারে:
// Button.js
// Helper function - named export
export const getButtonTheme = (type) => {
const themes = {
primary: 'bg-blue-500',
secondary: 'bg-gray-500',
danger: 'bg-red-500'
};
return themes[type] || themes.primary;
};
// Constants - named export
export const BUTTON_SIZES = {
small: 'px-2 py-1',
medium: 'px-4 py-2',
large: 'px-6 py-3'
};
// Main component - default export
const Button = ({ children, type = 'primary', size = 'medium' }) => {
const theme = getButtonTheme(type);
const sizeClass = BUTTON_SIZES[size];
return (
<button className={`${theme} ${sizeClass}`}>
{children}
</button>
);
};
export default Button;
এটা ইমপোর্ট করার সময়:
// App.js
import Button, { getButtonTheme, BUTTON_SIZES } from './Button.js';
// অথবা শুধু default import
import Button from './Button.js';
// অথবা শুধু named imports
import { getButtonTheme, BUTTON_SIZES } from './Button.js';
Best Practices এবং টিপস
১. সামঞ্জস্যতা বজায় রাখুন
আপনার প্রজেক্টে একটি নির্দিষ্ট pattern follow করুন। যদি utility functions এর জন্য named export ব্যবহার করেন, তাহলে সব জায়গায় সেটাই করুন।
২. ফাইলের নাম এবং default export এর নাম মিলিয়ে রাখুন
// Button.js ফাইলে
export default Button; // ✅ Good
// Button.js ফাইলে
export default MyAwesomeComponent; // ❌ Confusing
৩. Tree Shaking এর কথা ভাবুন
Named exports bundle size কমাতে সাহায্য করে কারণ unused exports build এ include হয় না:
// utils.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
export const multiply = (a, b) => a * b; // এটা ব্যবহার না হলে bundle এ আসবে না
// app.js
import { add, subtract } from './utils.js'; // শুধু দরকারি functions import
৪. TypeScript এ type exports
TypeScript ব্যবহার করলে types এর জন্য named export ব্যবহার করুন:
// types.ts
export interface User {
id: number;
name: string;
email: string;
}
export type UserRole = 'admin' | 'user' | 'moderator';
// main service - default export
const UserService = {
// service methods
};
export default UserService;
সারসংক্ষেপ
Default Export এবং Named Export এর মধ্যে কোনটা "ভাল" বা "খারাপ" নেই। দুটোরই নিজস্ব ব্যবহারের ক্ষেত্র আছে। মূল বিষয় হলো সঠিক জায়গায় সঠিক approach ব্যবহার করা।
মনে রাখবেন:
- Named Export: একাধিক utility functions, constants, types এর জন্য
- Default Export: main component, class বা primary function এর জন্য
- Mixed Approach: যখন একটা main thing এর সাথে helper functions দরকার
নিয়মিত practice করলে এই concepts গুলো আপনার কাছে খুবই স্বাভাবিক লাগবে। আর প্রজেক্টের consistency বজায় রাখাটাই সবচেয়ে গুরুত্বপূর্ণ।
Happy Coding!