Hot Reload এমন একটি প্রযুক্তি যেখানে সোর্স কোডের পরিবর্তন সম্পূর্ণ পৃষ্ঠা রিলোড ছাড়া এবং বর্তমান অবস্থা না হারিয়ে চলমান অ্যাপ্লিকেশনে প্রয়োগ করা হয়। Live Reload-এর বিপরীতে, যা সম্পূর্ণ পৃষ্ঠা রিফ্রেশ করে, হট রিলোড শুধুমাত্র পরিবর্তিত মডিউলগুলো তাৎক্ষণিকভাবে প্রতিস্থাপন করে। Webpack, 2024 অনুসারে, Hot Module Replacement (HMR) কম্পোনেন্টের অবস্থা সংরক্ষণ করে ডেভেলপমেন্ট চক্রের সময় 80% পর্যন্ত হ্রাস করে।
মূল বিষয়
Hot Reload একটি ডেভেলপমেন্ট প্রক্রিয়া যেখানে সোর্স ফাইলের পরিবর্তন অ্যাপ্লিকেশন পুনরায় চালু না করে চলমান অ্যাপ্লিকেশনে অবিলম্বে প্রতিফলিত হয়। ডেভেলপার এডিটরে কোড সম্পাদনা করে, ফাইল সংরক্ষণ করে, এবং ফলাফল অবিলম্বে ব্রাউজার বা এমুলেটরে দৃশ্যমান হয়।
এই প্রযুক্তির মূল বৈশিষ্ট্য হল অ্যাপ্লিকেশনের অবস্থা সংরক্ষণ। মেমরিতে ভেরিয়েবল, ফর্মে ডেটা, বর্তমান নেভিগেশন — সবকিছু জায়গায় থাকে। ডেভেলপারকে প্রয়োজনীয় স্ক্রিনে ফিরে যেতে কর্মের ক্রম পুনরাবৃত্তি করতে হয় না।
ওয়েব ডেভেলপমেন্টে, Hot Reload Hot Module Replacement (HMR) প্রক্রিয়ার মাধ্যমে বাস্তবায়িত হয়। বান্ডলার ফাইল পরিবর্তন পর্যবেক্ষণ করে, কোন মডিউল প্রভাবিত তা নির্ধারণ করে এবং WebSocket-এর মাধ্যমে ব্রাউজারে আপডেট করা কোড পাঠায়। ব্রাউজার পৃষ্ঠা রিলোড না করে শুধুমাত্র সেই মডিউলগুলি প্রতিস্থাপন করে।
Hot Reload-এর জনপ্রিয়তা সিঙ্গেল-পেজ অ্যাপ্লিকেশন (SPA) বিস্তারের সাথে বেড়েছে, যেখানে সম্পূর্ণ পৃষ্ঠা রিলোড ক্লায়েন্ট অ্যাপ্লিকেশনের সমস্ত অবস্থা ধ্বংস করে। React, Vue, Angular এবং অন্যান্য ফ্রেমওয়ার্ক HMR-কে প্রাথমিক ডেভেলপমেন্ট মোড হিসাবে সুপারিশ করে।
HMR প্রক্রিয়া চারটি ধাপ নিয়ে গঠিত। সার্ভার সাইডে বান্ডলার পরিবর্তিত মডিউল কম্পাইল করে, কোডের নতুন সংস্করণ সহ JSON প্যাচ তৈরি করে এবং WebSocket সংযোগের মাধ্যমে ব্রাউজারে পাঠায়। ব্রাউজার-সাইড HMR রানটাইম প্যাচ গ্রহণ করে, পুরানো মডিউলটি নতুন দিয়ে প্রতিস্থাপন করে এবং মডিউলের সাবস্ক্রাইবারদের通知 করে।
Webpack Dev Server ক্লায়েন্টের সাথে যোগাযোগের জন্য WebSocket ব্যবহার করে। যখন একটি ফাইল পরিবর্তিত হয়, বান্ডলার পরিবর্তনের ম্যানিফেস্ট সহ hot-update.js এবং hot-update.json তৈরি করে। ক্লায়েন্ট JSONP-এর মাধ্যমে এই ফাইলগুলি স্বয়ংক্রিয়ভাবে লোড করে।
// webpack.config.js - HMR সেটআপ
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode: 'development',
devServer: {
hot: true,
liveReload: false
},
plugins: [new HtmlWebpackPlugin()]
};
ব্রাউজারে HMR রানটাইম পরীক্ষা করে যে প্রতিস্থাপিত মডিউলটি accept সমর্থন করে কিনা। যদি মডিউল module.hot.accept() ঘোষণা করে থাকে, রানটাইম এটি ইন-প্লেস প্রতিস্থাপন করে এবং আপডেট কলব্যack চালায়। যদি accept ঘোষণা না করা হয়, HMR প্যারেন্ট মডিউল স্তরে ফিরে যায়।
React Fast Refresh-এ, এই যুক্তি ফ্রেমওয়ার্ক স্তরে নির্মিত — প্রতিটি ফাইলে ম্যানুয়ালি module.hot.accept লেখার প্রয়োজন নেই। Babel প্লাগইন react-refresh/babel এমন কোড যোগ করে যা নিরাপদে অবস্থা না হারিয়ে কম্পোনেন্ট প্রতিস্থাপন করে।
এই তিনটি শব্দ প্রায়ই বিভ্রান্ত হয়, কিন্তু এগুলি আচরণে মৌলিকভাবে ভিন্ন। Live Reload যেকোনো পরিবর্তনে সম্পূর্ণ পৃষ্ঠা রিলোড করে — সমস্ত অবস্থা হারিয়ে যায়। Full Reload ঘটে যখন ডেভেলপমেন্ট সার্ভার সম্পূর্ণরূপে পুনরায় চালু হয়, শুধু ক্লায়েন্ট নয়, সার্ভারের অবস্থাও হারিয়ে যায়।
| প্রকার | পৃষ্ঠা রিলোড | অবস্থা সংরক্ষণ | গতি |
|---|---|---|---|
| Hot Reload (HMR) | না | হ্যাঁ | তাৎক্ষণিক |
| Live Reload | হ্যাঁ | না | 1-3 সেকেন্ড |
| Full Reload | হ্যাঁ | না | 3-10 সেকেন্ড |
Hot এবং Live-এর মধ্যে পছন্দ সরাসরি ডেভেলপমেন্ট গতিকে প্রভাবিত করে। HMR-এ, “কোড সম্পাদনা → ফলাফল দেখা” চক্রে 50-200 মিলিসেকেন্ড লাগে। Live Reload-এ — 1-3 সেকেন্ড এবং প্রসঙ্গ পুনরুদ্ধারের সময়। কাজের দিনে, পার্থক্য দশ মিনিটের সাশ্রয় সময়ের সমান।
React Fast Refresh হল React কম্পোনেন্টের জন্য অপ্টিমাইজ করা অফিসিয়াল Hot Reload বাস্তবায়ন। এটি পুরানো React Hot Loader প্রক্রিয়া প্রতিস্থাপন করেছে, যা অস্থির ছিল এবং ম্যানুয়াল কনফিগারেশন প্রয়োজন হত। Fast Refresh react-refresh/babel-এর মাধ্যমে Create React App, Next.js, Vite এবং Webpack-এ নির্মিত।
Fast Refresh ফাংশনাল কম্পোনেন্টের অবস্থা সঠিকভাবে সংরক্ষণ করে যখন তাদের কোড পরিবর্তিত হয়। আপনি যদি শুধু JSX মার্কআপ পরিবর্তন করেন, useState এবং অন্যান্য হুক তাদের মান ধরে রাখে। যদি হুকের যুক্তি পরিবর্তিত হয়, কম্পোনেন্ট পুনরায় মাউন্ট হয়।
// উদাহরণ - JSX পরিবর্তন হলে অবস্থা সংরক্ষিত
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>+</button>
</div>
);
}
Fast Refresh অবস্থা সংরক্ষণ করে না যদি নতুন কোডে কম্পাইলেশন ত্রুটি থাকে। যদি কম্পোনেন্ট ডিফল্টভাবে এক্সপোর্ট না করা হয় (named export), অবস্থাও সংরক্ষিত নাও হতে পারে। কম্পোনেন্টের জন্য default export ব্যবহার করার এবং অবস্থা সংরক্ষণ নিশ্চিত করতে এক্সপোর্ট memo-তে মোড়ানোর পরামর্শ দেওয়া হয়।
আধুনিক বান্ডলারগুলি HMR প্রদান করে। Webpack devServer.hot-এর মাধ্যমে নমনীয় কনফিগারেশন সহ HMR-এর অগ্রদূত। Vite বান্ডলিং ছাড়া তাৎক্ষণিক HMR-এর জন্য নেটিভ ESM এবং esbuild ব্যবহার করে। Parcel জিরো-কনফিগ HMR অফার করে। Turbopack Rust-ভিত্তিক HMR সহ Vercel-এর নতুন বান্ডলার।
| টুল | HMR প্রকার | কনফিগারেশন | ইকোসিস্টেম |
|---|---|---|---|
| Webpack 5 | WebSocket-এর মাধ্যমে HMR | devServer.hot: true | React, Vue, Angular |
| Vite | নেটিভ ESM HMR | অন্তর্নির্মিত | React, Vue, Svelte |
| Parcel 2 | জিরো-কনফিগ HMR | প্রয়োজন নেই | React, Vue, TS |
| Turbopack | ইনক্রিমেন্টাল HMR | অন্তর্নির্মিত | Next.js |
Vite গতিতে এগিয়ে — Vite-এ HMR ব্রাউজারের নেটিভ ES মডিউলের মাধ্যমে কাজ করে। যখন একটি ফাইল পরিবর্তিত হয়, Vite পুরো প্রকল্প পুনরায় কম্পাইল না করে শুধুমাত্র সেই মডিউল import()-এর মাধ্যমে পাঠায়। Webpack প্রতিটি মডিউল সম্পূর্ণভাবে কম্পাইল করে, যা বড় প্রকল্পে HMR ধীর করে দেয়।
বিভিন্ন বান্ডলারের জন্য HMR সেটআপ দেখি। Webpack-এ, devServer-এ hot: true সেট করা এবং react-refresh/babel যোগ করা প্রয়োজন। Vite-এ, HMR যেকোনো প্রিসেটের সাথে অন্তর্নির্মিত কাজ করে। Next.js-এ, Fast Refresh টার্বোকম্পাইলারের মাধ্যমে ডিফল্টভাবে সক্রিয়।
// vite.config.js
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
server: {
hmr: {
port: 3001
}
}
});
// webpack.config.js
const ReactRefreshWebpackPlugin =
require('@pmmmwh/react-refresh-webpack-plugin');
module.exports = {
mode: 'development',
devServer: { hot: true },
plugins: [new ReactRefreshWebpackPlugin()],
module: {
rules: [
{
test: /\.jsx?$/u,
use: 'babel-loader'
}
]
}
};
HMR সব পরিস্থিতিতে সঠিকভাবে কাজ করে না। CSS মডিউল ডায়নামিক ক্লাসের সাথে প্রয়োগ নাও হতে পারে। গ্লোবাল ভেরিয়েবল এবং সিঙ্গলটন (Redux স্টোর, রাউটার) রিলোডে রিসেট হতে পারে। ভারী লাইব্রেরি HMR-এ কখনও কখনও GC ছাড়া মডিউল প্রতিস্থাপনের কারণে মেমরি লিক তৈরি করতে পারে।
HMR সমস্যার সমাধান হল হট কোডকে সাইড ইফেক্ট ছাড়া বিশুদ্ধ কম্পোনেন্টে আলাদা করা। সাইড ইফেক্ট (WebSocket সাবস্ক্রিপশন, টাইমার) useEffect-এ পরিষ্কার করা উচিত। Redux-এর জন্য, sessionStorage-এ অবস্থা সংরক্ষণকারী persister সুপারিশ করা হয়। CSS Modules বা styled-components-এর মতো CSS সমাধান অতিরিক্ত কনফিগারেশন ছাড়া HMR-এর সাথে সঠিকভাবে কাজ করে।
আরেকটি সীমাবদ্ধতা হল প্রোডাকশনে ডিবাগিং: HMR ইচ্ছাকৃতভাবে প্রোডাকশন বিল্ডে নিষ্ক্রিয় করা হয়। সোর্স কোড মিনিফাইড হয় এবং প্রোডাকশনে হট রিপ্লেসমেন্ট অসম্ভব। প্রোডাকশনে ত্রুটি ডিবাগ করতে, source maps এবং লগিং ব্যবহার করুন, কিন্তু HMR নয়।
সচরাচর জিজ্ঞাসিত প্রশ্ন
Hot Reload পৃষ্ঠা রিলোড না করে শুধুমাত্র পরিবর্তিত মডিউল প্রতিস্থাপন করে এবং অবস্থা সংরক্ষণ করে। Live Reload সম্পূর্ণ পৃষ্ঠা রিলোড করে — অবস্থা হারিয়ে যায়, অ্যাপ্লিকেশন প্রাথমিক স্ক্রিন থেকে আবার শুরু হয়।
Create React App এবং Vite-এ প্রকল্পগুলিতে, HMR ডিফল্টভাবে সক্রিয়। Webpack-এ, devServer: { hot: true } এবং @pmmmwh/react-refresh-webpack-plugin যোগ করা প্রয়োজন। Next.js-এ, Fast Refresh কনফিগারেশন ছাড়া কাজ করে।
কারণ হল নতুন কোডে কম্পাইলেশন ত্রুটি, default-এর পরিবর্তে named export, হুক সিগনেচারে পরিবর্তন, বা সরাসরি স্টেট মিউটেশন। React Fast Refresh নিরাপদে কম্পোনেন্ট রিসেট করে শুধুমাত্র যখন সঠিক অপারেশনের জন্য প্রয়োজন।
হ্যাঁ, সব আধুনিক বান্ডলার TypeScript-এর সাথে HMR সমর্থন করে। Vite TS ট্রান্সপাইলেশনের জন্য esbuild ব্যবহার করে। Webpack ts-loader বা @babel/preset-typescript সহ babel ব্যবহার করে। Fast Refresh টাইপযুক্ত কম্পোনেন্টের সাথে সঠিকভাবে কাজ করে।
WebSocket সংযোগ ত্রুটির জন্য ব্রাউজার কনসোল পরীক্ষা করুন। নিশ্চিত করুন devServer.hot: true সক্রিয় আছে। Vite-এর জন্য, HMR পোর্ট পরীক্ষা করুন। যদি সমস্যা থেকে যায়, সম্পূর্ণ পৃষ্ঠা রিলোড (F5) করুন এবং বান্ডলার কনসোল পরীক্ষা করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন