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() घोषित किया है, रनटाइम इसे इन-प्लेस बदलता है और अपडेट कॉलबैक चलाता है। यदि 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें