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 ms لیتا ہے۔ 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 جیسے CSS Modules یا styled-components اضافی کنفیگریشن کے بغیر HMR کے ساتھ صحیح کام کرتے ہیں۔
ایک اور حد پروڈکشن میں ڈیبگنگ ہے: HMR جان بوجھ کر پروڈکشن بلڈز میں غیر فعال کیا جاتا ہے۔ سورس کوڈ منیفائیڈ ہوتا ہے اور پروڈکشن میں ہاٹ ریپلیسمنٹ ناممکن ہے۔ پروڈکشن میں خرابیوں کو ڈیبگ کرنے کے لیے، سورس میپس اور لاگنگ استعمال کریں، لیکن HMR نہیں۔
اکثر پوچھے جانے والے سوالات
Hot Reload صفحہ دوبارہ لوڈ کیے بغیر صرف تبدیل شدہ ماڈیول کو بدلتا ہے اور حالت محفوظ رکھتا ہے۔ Live Reload پورے صفحہ کو دوبارہ لوڈ کرتا ہے — حالت ختم ہو جاتی ہے، ایپلیکیشن ابتدائی اسکرین سے دوبارہ شروع ہوتی ہے۔
Create React App اور Vite استعمال کرنے والے پروجیکٹس میں، HMR ڈیفالٹ طور پر فعال ہے۔ Webpack میں devServer: { hot: true } اور @pmmmwh/react-refresh-webpack-plugin شامل کرنا ضروری ہے۔ Next.js میں Fast Refresh کنفیگریشن کے بغیر کام کرتا ہے۔
وجہ نئے کوڈ میں کمپائیلیشن خرابی، ڈیفالٹ کے بجائے named export، ہک سگنیچر میں تبدیلی، یا براہ راست سٹیٹ میوٹیشن ہے۔ React Fast Refresh جزو کو صرف اس وقت محفوظ طریقے سے ری سیٹ کرتا ہے جب درست آپریشن کے لیے ضروری ہو۔
ہاں، تمام جدید بنڈلرز TypeScript کے ساتھ HMR کو سپورٹ کرتے ہیں۔ Vite TS ٹرانسپائلیشن کے لیے esbuild استعمال کرتا ہے۔ Webpack @babel/preset-typescript کے ساتھ ts-loader یا babel استعمال کرتا ہے۔ Fast Refresh ٹائپ شدہ اجزاء کے ساتھ صحیح کام کرتا ہے۔
WebSocket کنکشن کی خرابیوں کے لیے براؤزر کنسول چیک کریں۔ یقینی بنائیں کہ devServer.hot: true فعال ہے۔ Vite کے لیے، HMR پورٹ چیک کریں۔ اگر مسئلہ حل نہ ہو تو مکمل صفحہ ری لوڈ (F5) کریں اور بنڈلر کنسول چیک کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں