React Rendering: Virtual DOM, Reconciliation, Batching — To'liq qo'llanma
Doston RajabovMavzu bo‘limlari:
- Umumiy tushuncha: React nima uchun shunday ishlaydi
- Virtual DOM: nima, nega kerak, ichki ko‘rinishi
- Reconciliation (diffing): algoritm,
keyning roli, komponent o‘zgarishlari - Fiber arxitekturasi: units of work, render vs commit fazalari, prioritet (lanes)
- Batching: avvalgi model va React 18 avtomatik batching,
flushSync,startTransition - Concurrent / Concurrent-like konseptlar: Suspense, transition, interaktivlik
- Praktik kod-misollar: optimallashtirish, common pitfalls
- Prezentatsiya uchun slayd outline va speaker-notes
- Qo‘shimcha manbalar va tavsiyalar
1. Umumiy tushuncha
React — deklarativ UI kutubxonasi. Siz komponentlarni funksiyalar yoki klasslar ko‘rinishida yozasiz, ular props va state dan foydalanib UI tasvirini (React elementlar daraxti) qaytaradi. Har safar state yoki props o‘zgarganda, React yangi element daraxtini (virtual representation) hosil qiladi va mavjud UI bilan solishtirib, minimal DOM o‘zgarishlarini qo‘llaydi.
Maqsadlar:
- Ishlashni yaxshilash (minimum real DOM manipulyatsiyasi)
- Kodni oddiyroq qilish (declarative — nima ko‘rinishi kerakligini bildiradi)
- Samarali yangilashlar qilish uchun diffing imkoniyati
2. Virtual DOM (VDOM)
Nima?
Virtual DOM — brauzerning haqiqiy DOM’idan mustaqil, xotirada saqlanadigan yengil JavaScript ob’ektlar daraxti. Har bir React elementi (element node) — bu oddiy JS ob’ekti: type, props, children.
Nega kerak?
- Re-renderlar paytida real DOM bilan bevosita ishlash sekin bo‘ladi. VDOM yordamida React o‘zgargan joylarni aniqlab, minimal real DOM o‘zgarishlarini amalga oshiradi.
- Oson diffing: ikki VDOM daraxtini solishtirish va farq bo‘yicha
patchyaratish.
Ichki jihat (soddalashtirilgan):
- Component render bo‘ladi → yangi VDOM (element tree) qaytariladi.
- React eski VDOM bilan yangi VDOMni solishtiradi — bu yerda reconciler ishlaydi.
- Farq topilganda, React minimal DOM patchlarini hisoblab chiqaradi va commit fazasida real DOM yangilanadi.
3. Reconciliation (Diffing)
Maqsad
Ikki VDOM daraxtini tez va ishonchli solishtirish: qaysi element o‘zgargan, o‘chirildi yoki ko‘chirildi.
Asosiy qoidalar (React diffing algorithm – soddalashtirilgan):
- Tur mos emas → butun komponentni qayta yaratish (unmount + mount).
- Tur mos va elementlar list bo‘lsa → index asosida tekshiriladi, lekin
keybo‘lsa, Reactkeyni ishlatib farqlaydi. - Key muhimligi: list elementlariga barqaror va noyob
keyberish kerak (odatda id).indexni faqat static, o‘zgarmaydigan listlar uchun ishlatish tavsiya etiladi.
Nega komponentni ichida komponent e'lon qilish yomon? (masalan const A = () => { const B = () => ... })
Har renderda yangi komponent funksiya obyekti yaratiladi va reconciliation qiyinlashadi — React uchun to‘g‘ri elementni aniqlash mushkul bo‘ladi.
Conditional rendering va elementning turi
Agar rendering shart bo‘yicha bir turdan boshqa turga o‘tsa (<div> → <span> yoki ComponentA → ComponentB), React eski elementni o‘chiradi va yangi elementni joylashtiradi.
4. Fiber arxitekturasi (React 16+)
Nima uchun Fiber?
Oldingi (stack) reconciler barcha o‘zgarishlarni sinxron tarzda, bitta chuqur pass orqali qayta ishlardi. Bu katta daraxtlarda bloklanishlarga olib kelardi. Fiber — ishlarni kichik "unit of work"larga bo‘lib, prioritetlar (lanes) bo‘yicha asenkron yoki qismlarga bo‘lingan tarzda bajarishga imkon beradi.
Asosiy tushunchalar
- Fiber node: har bir React element uchun ichki ob’ekt (aloqa, state, pointers — child/sibling/return).
- Work loop: React bir nechta "unit"larni bajarib, zarur vaqtda ishlashni to‘xtatib, brauzerga boshqaruvni qaytaradi (ya'ni interaktivlikni saqlaydi).
- Render fazasi (Reconciliation): virtual hisob-kitoblar (work in progress) — bu faza interruptible (to‘xtatilishi mumkin).
- Commit fazasi: DOM o‘zgarishlari aslida qo‘llanadigan, atomik va sinxron bosqich.
Lanes & Priorities
React 18+ bilan priority lanes qo‘shildi — yangilanishlar turlicha prioritetlarda bo‘lishi mumkin (user input — yuqori; background fetch — past). Bu React’ga muhim ishlarni avval bajarish imkonini beradi.
5. Batching (Yangilanishlarni guruhlash)
Nima?
Bir nechta setState chaqiriqlari bitta renderga guruhlanadi — bu renderinglarni kamaytiradi.
Tarixiy kontekst
- Oldin: React faqat event handlers ichida (React-controlled events) batch qilardi.
- React 18: automatic batching joriy etildi — mikrotask/async callback ichida ham bir nechta state yangilanishlari bitta renderga guruhlanadi.
Misol
function Comp(){
const [a, setA] = useState(0);
const [b, setB] = useState(0);
const onClick = () => {
setA(x => x + 1);
setB(x => x + 1);
// React buni bittagina renderga yig‘adi (automatic batching)
}
}
Opt-out: flushSync
Agar darhol DOM yangilanishini xohlasangiz (masalan, third-party integratsiya), flushSync bilan batchingni buzishingiz mumkin:
import { flushSync } from 'react-dom';
flushSync(()=>{
setState(...);
});
// DOM shu satrdan keyin yangilanadi
Eslatma: Keraksiz ishlatilsa, performans pasayishi mumkin.
Concurrent-ish API: startTransition
Agar yangilanish past prioritetli bo‘lsa (masalan, inputga bog‘liq katta list filteri), startTransition ichida qilinsa, React uni background ga o‘tkazadi va UI interaktiv qoladi:
import { startTransition } from 'react';
startTransition(()=>{
setHugeListFilter(...);
});
6. Render va Commit fazalari — nimaga e'tibor berish kerak
- Render (Reconciliation) fazasi — hisob-kitob (virtual), interruptible. Bu yerda React markaziy ishlarni (fiber work) bajaradi.
- Commit fazasi — real DOM yangilanishlari, refs yangilanadi, effectlar (
useLayoutEffect) shu bosqichda bajarilishi kerak.
Qoida: DOM manipulyatsiyalar va layout-dependent work useLayoutEffect ichida yoki commit bosqichida bajarilsin; useEffect esa commitdan keyin async bo‘lib ishlaydi.