React Rendering Masterclass
Ինչպես է React-ը մտածում՝ Fiber, Reconciliation և Rendering-ի գաղտնիքները
Շատ ծրագրավորողներ մտածում են, որ React-ը «պարզապես կրկին նկարում է կոմպոնենտը, երբ state-ը փոխվում է»։ Բայց իրականում React-ը ունի իր «virtual mind» — բարդ համակարգ, որը որոշում է՝
Այս ամենը հնարավոր է Fiber architecture-ի շնորհիվ։
React-ը երբեք անմիջապես չի փոխում իրական DOM-ը։ Փոխարենը ստեղծում է դրա թեթև պատճենը (Virtual DOM) հիշողության մեջ։
function App() {
return <h1>Hello, Aram!</h1>;
}
React-ը սա չի նկարում անմիջապես էկրանին։ Նախ ստեղծում է Virtual DOM ծառ՝
App
└── h1
└── "Hello, Aram!"
Երբ state-ը փոխվում է, React-ը ստեղծում է նոր Virtual DOM, համեմատում է հինը և նոր տարբերակը՝ 👉 այս քայլը կոչվում է reconciliation (հաշտեցում)։ Այնուհետև React-ը միայն այն տարբերությունները է փոխում իրական DOM-ում, ինչը փոխվել է։
React 16-ից սկսած (Fiber architecture), rendering-ը ամբողջովին վերաշարադրվել է։ Fiber-ը թույլ է տալիս React-ին միջնարկել (interrupt) rendering-ը, կիսատ թողնել և հետո վերականգնել։
Ամեն կոմպոնենտ հիմա ներկայացվում է որպես “Fiber node”՝ օբյեկտ, որը պահում է՝
{
type: ComponentFunction,
pendingProps: {},
memoizedState: {},
return: ParentFiber,
child: ChildFiber,
sibling: SiblingFiber
}
Այս ծառը React-ին թույլ է տալիս հասկանալ՝
React-ը rendering-ը կատարում է երկու փուլով 👇
Render Phase → Commit Phase → Browser Paint
Այս մոտեցումն է, որ թույլ է տալիս Concurrent Rendering React 18-ում։ React-ը կարող է ասել՝ «Սպասի՛ր, հիմա այս component-ի render-ը չեմ ավարտել, բայց մյուսին ավելի շտապ պետք է ցույց տալ»։
React-ը երբեք ամեն state update-ի ժամանակ չի rerender անում։ React-ը «բաչում» է դրանք միասին՝ մեկ render-ում։
setCount(c => c + 1);
setCount(c => c + 1);
👉 React-ը սա դիտում է որպես մեկ գործողություն՝ ոչ թե երկու render։ Արդյունքում performance-ը զգալիորեն բարձրանում է։
Concurrent Mode-ում React-ը նաև օգտագործում է scheduler, որը որոշում է՝
Բացիր React DevTools → Profiler։ Այնտեղ կարելի է տեսնել՝
function Counter() {
const [count, setCount] = useState(0);
console.log('render');
return (
<button onClick={() => setCount(c => c + 1)}>
{count}
</button>
);
}
Profiler-ում կնկատես՝ React-ը rerender է անում միայն այն component-ը, որի state-ը փոխվել է — ոչ ամբողջ ծառը։
React-ը պարզապես UI գրադարան չէ։ Դա մի ամբողջ rendering engine է՝ սեփական scheduler-ով, priority system-ով և memory management-ով։ Fiber-ի շնորհիվ React-ը հիմա կարող է լինել՝