Hot Reload — bu manba kodidagi o'zgarishlar sahifani to'liq qayta yuklamasdan va joriy holatni yo'qotmasdan ishlayotgan ilovaga qo'llaniladigan texnologiyadir. Sahifani to'liq yangilaydigan Live Reload-dan farqli o'laroq, issiq qayta yuklash faqat o'zgartirilgan modullarni joyida almashtiradi. Webpack, 2024 ma'lumotlariga ko'ra, Hot Module Replacement (HMR) komponentlar holatini saqlash hisobiga dasturlash sikli vaqtini 80% gacha qisqartiradi.
Asosiy
Hot Reload — bu manba fayllardagi o'zgarishlar ilovani qayta ishga tushirmasdan darhol ishlayotgan ilovada aks etadigan dasturlash mexanizmidir. Dasturchi muharrirda kodni tahrir qiladi, faylni saqlaydi va natija darhol brauzer yoki emulatorda ko'rinadi.
Texnologiyaning asosiy xususiyati ilova holatini saqlashdir. Xotiradagi o'zgaruvchilar, formadagi ma'lumotlar, joriy navigatsiya — hamma narsa o'z joyida qoladi. Dasturchi kerakli ekranga qaytish uchun harakatlar ketma-ketligini takrorlashi shart emas.
Veb-dasturlashda Hot Reload Hot Module Replacement (HMR) mexanizmi orqali amalga oshiriladi. Bandler fayl o'zgarishlarini kuzatadi, qaysi modullar ta'sirlanganini aniqlaydi va yangilangan kodni WebSocket orqali brauzerga yuboradi. Brauzer sahifani qayta yuklamasdan faqat o'sha modullarni almashtiradi.
Hot Reload-ning mashhurligi bir sahifali ilovalar (SPA) tarqalishi bilan oshdi, bunda sahifani to'liq qayta yuklash mijoz ilovasining butun holatini yo'q qiladi. React, Vue, Angular va boshqa freymvorklar HMRni asosiy dasturlash rejimi sifatida tavsiya qiladi.
HMR mexanizmi to'rt bosqichdan iborat. Server tomonidagi bandler o'zgartirilgan modulni kompilyatsiya qiladi, kodning yangi versiyasi bilan JSON yamoq yaratadi va uni WebSocket ulanishi orqali brauzerga yuboradi. Brauzer qismidagi HMR runtime yamog'ini qabul qiladi, eski modulni yangisi bilan almashtiradi va modul obunachilariga xabar beradi.
Webpack Dev Server mijoz bilan aloqa qilish uchun WebSocket-dan foydalanadi. Fayl o'zgartirilganda, bandler o'zgarishlar manifesti bilan hot-update.js va hot-update.json yaratadi. Mijoz bu fayllarni JSONP orqali avtomatik yuklaydi.
// webpack.config.js - HMR sozlamalari
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode: 'development',
devServer: {
hot: true,
liveReload: false
},
plugins: [new HtmlWebpackPlugin()]
};
Brauzerdagi HMR runtime almashtirilayotgan modul accept-ni qo'llab-quvvatlashini tekshiradi. Agar modul module.hot.accept() ni e'lon qilgan bo'lsa, runtime uni joyida almashtiradi va yangilash callback-ni ishga tushiradi. Agar accept e'lon qilinmagan bo'lsa, HMR yuqori darajaga, ota-modulga o'tadi.
React Fast Refresh da bu mantiq freymvork darajasida o'rnatilgan — har bir faylda qo'lda module.hot.accept yozish shart emas. Babel-plugin react-refresh/babel holatni yo'qotmasdan komponentlarni xavfsiz almashtiradigan kod qo'shadi.
Bu uch atama ko'pincha aralashtiriladi, ammo ular xatti-harakati jihatidan tubdan farq qiladi. Live Reload har qanday o'zgarishda butun sahifani to'liq qayta yuklaydi — barcha holat yo'qoladi. Full Reload nafaqat mijoz holatini, balki server holatini ham yo'qotib, dasturlash serverini to'liq qayta ishga tushirish bilan sodir bo'ladi.
| Tur | Sahifani qayta yuklash | Holatni saqlash | Tezlik |
|---|---|---|---|
| Hot Reload (HMR) | Yo'q | Ha | Bir zumda |
| Live Reload | Ha | Yo'q | 1-3 son |
| Full Reload | Ha | Yo'q | 3-10 son |
Hot va Live o'rtasidagi tanlov bevosita dasturlash tezligiga ta'sir qiladi. HMR da „kodni o'zgartirdim → natijani ko'rdim” sikli 50-200 ms davom etadi. Live Reload da — 1-3 soniya va kontekstni tiklash vaqti. Ish kuni davomida farq o'nlab daqiqa tejalgan vaqtni tashkil qiladi.
React Fast Refresh — React komponentlari uchun optimallashtirilgan rasmiy Hot Reload amalga oshirilishi. U beqaror bo'lgan va qo'lda sozlashni talab qiladigan eski React Hot Loader mexanizmini almashtirdi. Fast Refresh react-refresh/babel orqali Create React App, Next.js, Vite va Webpack-ga o'rnatilgan.
Fast Refresh kod o'zgartirilganda funksional komponentlarning holatini to'g'ri saqlaydi. Agar siz faqat JSX belgilashni o'zgartirsangiz — useState va boshqa hook-lar o'z qiymatlarini saqlaydi. Agar hook mantig'i o'zgarsa — komponentni qayta o'rnatish sodir bo'ladi.
// Misol - JSX o'zgarganda holat saqlanadi
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>
);
}
Agar yangi kod kompilyatsiya xatosi ni o'z ichiga olsa, Fast Refresh holatni saqlamaydi. Agar komponent standart (default) o'rniga nomli (named export) eksport qilinsa, holat ham saqlanmasligi mumkin. Komponentlar uchun default export dan foydalanish va holatni saqlashni kafolatlash kerak bo'lsa, eksportlarni memo bilan o'rash tavsiya etiladi.
Zamonaviy bandlerlar HMR ni ta'minlaydi. Webpack — devServer.hot orqali moslashuvchan konfiguratsiyaga ega HMR kashshofi. Vite bandlingsiz bir zumda HMR uchun mahalliy ESM va esbuild dan foydalanadi. Parcel — nol konfiguratsiyali HMR. Turbopack — Rust da HMR bilan Vercel dan yangi bandler.
| Vosita | HMR turi | Konfiguratsiya | Ekotizim |
|---|---|---|---|
| Webpack 5 | WebSocket orqali HMR | devServer.hot: true | React, Vue, Angular |
| Vite | Native ESM HMR | Qutidan chiqadi | React, Vue, Svelte |
| Parcel 2 | Zero-config HMR | Talab qilinmaydi | React, Vue, TS |
| Turbopack | Incremental HMR | Qutidan chiqadi | Next.js |
Vite tezligi bilan ajralib turadi — Vite da HMR brauzerning mahalliy ES modullari orqali ishlaydi. Fayl o'zgartirilganda, Vite butun loyihani qayta kompilyatsiya qilmasdan faqat o'sha modulni import() orqali yuboradi. Webpack har bir modulni to'liq kompilyatsiya qiladi, bu katta loyihalarda HMR ni sekinlashtiradi.
Turli bandlerlar uchun HMR sozlamalarini ko'rib chiqamiz. Webpack da devServer da hot: true ni o'rnatish va react-refresh/babel qo'shish kerak. Vite da HMR har qanday preset bilan qutidan chiqadi. Next.js da Fast Refresh turbo kompilyator orqali sukut bo'yicha yoqilgan.
// 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 barcha stsenariylarda to'g'ri ishlamaydi. CSS modullari dinamik sinflar bilan qo'llanilmasligi mumkin. Global o'zgaruvchilar va singletonlar (Redux store, router) qayta yuklashda qayta o'rnatilishi mumkin. Og'ir kutubxonalar HMR da GCsiz modullarni almashtirish tufayli ba'zan xotira oqishlarini keltirib chiqaradi.
HMR muammolarini hal qilish — issiq kodni yon ta'sirlarsiz toza komponentlarda ajratish. Yon ta'sirlar (WebSocket obunalari, taymerlar) useEffect da tozalanishi kerak. Redux uchun sessionStorage da holatni saqlaydigan persister tavsiya etiladi. CSS Modules yoki styled-components kabi CSS yechimlari qo'shimcha sozlamalarsiz HMR bilan to'g'ri ishlaydi.
Yana bir cheklov — ishlab chiqarishda nosozliklarni tuzatish: HMR ishlab chiqarish qurilishida ataylab o'chiriladi. Manba kodi minimallashtirilgan va ishlab chiqarishda issiq almashtirish mumkin emas. Ishlab chiqarishdagi xatolarni tuzatish uchun source maps va loglash ishlatiladi, lekin HMR emas.
Tez-tez so'raladigan savollar
Hot Reload sahifani qayta yuklamasdan faqat o'zgartirilgan modulni almashtiradi va holatni saqlaydi. Live Reload butun sahifani to'liq qayta yuklaydi — holat yo'qoladi, ilova bosh ekrandan qayta ishga tushadi.
Create React App va Vite loyihalarida HMR sukut bo'yicha yoqilgan. Webpack da devServer: { hot: true } va @pmmmwh/react-refresh-webpack-plugin qo'shish kerak. Next.js da Fast Refresh sozlamasdan ishlaydi.
Sabab — yangi kodda kompilyatsiya xatosi, default o'rniga named export, hook imzosining o'zgarishi yoki holatni to'g'ridan-to'g'ri mutatsiya qilish. React Fast Refresh komponentni faqat to'g'ri ishlashi uchun zarur bo'lganda xavfsiz tarzda qayta o'rnatadi.
Ha, barcha zamonaviy bandlerlar TypeScript bilan HMR ni qo'llab-quvvatlaydi. Vite TS transpiratsiyasi uchun esbuild dan foydalanadi. Webpack — ts-loader yoki @babel/preset-typescript bilan babel. Fast Refresh tiplangan komponentlar bilan to'g'ri ishlaydi.
WebSocket ulanish xatolari uchun brauzer konsolini tekshiring. devServer.hot: true yoqilganligiga ishonch hosil qiling. Vite uchun HMR portini tekshiring. Agar muammo hal qilinmasa — sahifani to'liq qayta yuklang (F5) va bandler konsolini tekshiring.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.