Skip to main content

Commit Phase проти Render Phase

Коротко:

React проходить два етапи оновлення інтерфейсу:

ФазаЩо робитьЧи можна переривати?Коли виконується
Render phaseОбчислює, що потрібно оновити (будує нове віртуальне дерево)ТакУ пам'яті (Virtual DOM)
Commit phaseЗастосовує ці зміни в реальний DOMНіУ браузері (DOM)

1. Render Phase (фаза обчислення / підготовки)

Тут React визначає, які частини інтерфейсу потрібно оновити,
але ще не торкається DOM.

Що відбувається:

  • React викликає компоненти (або render() у класових);
  • будує нове дерево Fiber-вузлів (віртуальне дерево);
  • порівнює його зі старим деревом (diffing algorithm);
  • вирішує, які вузли:
    • потрібно створити,
    • які оновити,
    • які видалити.

Важливо:
На цьому етапі користувач не бачить змін, усе відбувається «в пам'яті».

Особливості:

  • React може призупиняти цю фазу (асинхронний рендеринг);
  • може повторно почати її з самого початку (якщо, наприклад, надійшли нові дані);
  • може змінювати пріоритет завдань (введення користувача важливіше за оновлення списку).

Приклад:

Якщо ти викликав setState(…), React спочатку створює нове віртуальне дерево,
але не оновлює DOM одразу.

2. Commit Phase (фаза застосування)

Тут React вносить реальні зміни в DOM
і викликає відповідні хуки життєвого циклу.

Що відбувається:

  • React застосовує всі накопичені зміни:
    • додає/видаляє/оновлює реальні DOM-елементи;
    • запускає ефекти (useEffect, componentDidMount, componentDidUpdate);
    • викликає layout-ефекти (useLayoutEffect).

Після завершення commit-фази користувач бачить оновлений UI.

Особливості:

  • Ця фаза не може бути перервана (інакше UI опиниться в «напівстані»);
  • Виконується дуже швидко, зазвичай за мілісекунди;
  • React вносить зміни одним пакетом, щоб уникнути мерехтіння.

Ілюстрація процесу

javascript
setState() → починається Render phase ↓ React викликає компоненти → створює нове Virtual DOM ↓ React порівнює старе і нове дерево (diffing) ↓ Вирішує: що оновити, видалити, додати ↓ (можна призупинити / відновити) ↓ Render phase завершена → починається Commit phase ↓ React вносить реальні зміни в DOM ↓ Виконуються useLayoutEffect і useEffect ↓ Користувач бачить оновлений UI

Різниця через аналогію

Уяви, що React - це будівельник.

ЕтапЩо робить ReactАналогія
Render PhaseПланує, що потрібно змінити: креслить новий план будинкуАрхітектор робить креслення
Commit PhaseВтілює зміни в реальності: переставляє стіни і мебліБудівельники роблять ремонт за планом

Що можна і не можна робити в цих фазах

ДіяRender PhaseCommit Phase
Викликати хуки (useState, useContext, useMemo)ТакНі
Змінювати DOM напрямуНіТак
Запускати побічні ефекти (useEffect)НіТак
Обчислювати JSXТакНі
Працювати з layout (useLayoutEffect)НіТак

Приклад із хуками:

javascript
function Example({ count }) { useEffect(() => { console.log('useEffect: Commit phase'); }); console.log('Рендер компонента: Render phase'); return <div>{count}</div>; }

Коли count оновиться:

  • Спочатку React викликає компонент (Render phase);
  • Потім оновлює DOM (Commit phase);
  • Після цього запускає useEffect.

Підсумок

ПараметрRender PhaseCommit Phase
МетаОбчислити, що потрібно оновитиЗастосувати зміни
Де виконуєтьсяУ пам'яті (Virtual DOM / Fiber tree)У браузері (реальний DOM)
Чи можна перерватиТакНі
ТривалістьМоже бути тривалоюДуже коротка
Побічні ефектиНе виконуютьсяВиконуються
ХукиuseMemo, useState, useContextuseEffect, useLayoutEffect

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.