PassFront
  1. PassFront
  2. База знаний
  3. Рендеринг и производительность

Как React вносит правки в Real DOM?

Рендеринг и производительность

Правки в реальный DOM React вносит в commit-фазе: после того как рендер и дифф вычислили точный список изменений, они применяются к DOM синхронно и одним пакетом.

Откуда берётся список правок

  • Render-фаза: компоненты вызваны, построено новое дерево, reconciliation сравнил его со старым.
  • Для каждого затронутого узла зафиксирован эффект: вставить, удалить, переместить, обновить свойства.

Какие операции выполняются

  • Создание: document.createElement для новых узлов, установка атрибутов/свойств, appendChild/insertBefore в правильную позицию.
  • Обновление: точечные правки существующих узлов — className, style (по отдельным полям), textContent, value; меняются только отличающиеся атрибуты, узел не пересоздаётся.
  • Перемещение: insertBefore для переставленных элементов списка (по key React знает, что узел тот же).
  • Удаление: removeChild + размонтирование поддерева (cleanup эффектов, отсоединение refs).

Свойства процесса

  • Синхронность и атомарность: commit не прерывается (в отличие от render-фазы) — пользователь не увидит «полуобновлённый» UI.
  • Батчинг: все правки одного обновления — одним куском; браузер пересчитывает layout один раз.
  • Минимальность: НЕ innerHTML и не пересоздание поддеревьев — хирургические операции по списку диффа; поэтому сохраняются фокус, выделение, позиция скролла.
  • Сразу после правок: обновляются refs, синхронно выполняется useLayoutEffect, затем браузер рисует кадр, после — useEffect.

Коротко для собеседования

React применяет изменения в commit-фазе: по списку из диффа выполняются точечные операции (createElement/insertBefore/removeChild, обновление отдельных атрибутов и текста) — синхронно, пакетно, без пересоздания узлов. Затем refs → useLayoutEffect → отрисовка → useEffect.

Другие вопросы раздела