Skip to main content

Навіщо використовують virtual DOM?

1. Що таке Virtual DOM

Virtual DOM (віртуальний DOM) - це легка, віртуальна копія реального DOM-дерева, що зберігається в пам'яті (у JS), а не в браузері.

Кожен елемент сторінки представляється звичайним JS-об'єктом, наприклад:

javascript
{ type: 'div', props: { className: 'card' }, children: [ { type: 'h1', props: { children: 'Заголовок' } }, { type: 'p', props: { children: 'Опис' } } ] }

Цей об'єкт і є "віртуальним DOM-вузлом" (VNode). Він не пов'язаний напряму з браузерним DOM, тому операції з ним дуже швидкі.


2. Як працює Virtual DOM (по кроках)

Уявімо, що застосунок оновлює інтерфейс:

  1. Застосунок змінює стан (state):
javascript
setCount(count + 1);
  1. Фреймворк створює нове Virtual DOM-дерево (на основі поточного стану компонента).
  2. Порівнює нове дерево з попереднім (diffing) → обчислює, що реально змінилося.
  3. Оновлює лише змінені вузли в реальному DOM (через мінімальну кількість операцій).

Приклад:

javascript
// Було <div> <h1>Лічильник: 5</h1> </div> // Стало <div> <h1>Лічильник: 6</h1> </div>

React не перестворює весь <div>, він бачить, що змінилася лише текстова нода всередині <h1>, і оновлює тільки її.


3. Навіщо це потрібно

Робота з реальним DOM - повільна: кожна зміна викликає reflow / repaint (перерахунок стилів, layout і перемальовування).

Virtual DOM вирішує проблему так:

Звичайний DOMVirtual DOM
Зміни одразу торкаються браузераЗміни відбуваються в пам'яті
Кожен апдейт викликає reflowФреймворк сам вирішує, коли оновити DOM
Потрібно вручну керувати оновленнямиАлгоритм сам оптимізує "дифф"
Багато дрібних операційКілька "батчів" оновлень

4. Ключові переваги Virtual DOM

ПеревагаЩо дає
Менше операцій з DOMОновлюються лише реальні зміни
Оптимізація ререндерівReact/Vue порівнюють старе і нове дерево
Зручність декларативного UI"Що малювати" замість "як оновлювати"
Незалежність від платформиVDOM можна рендерити не лише в браузері (React Native, SSR)
Інваріантність порядку оновленьНе потрібно думати про послідовність маніпуляцій

5. Алгоритм порівняння (diffing)

Щоб зрозуміти, які вузли змінилися, Virtual DOM використовує diff-алгоритм.

  • Порівнює за ключами і типами елементів.
  • Якщо type збігається → порівнює props і children.
  • Якщо ні - старий вузол видаляється, новий створюється.
  • Алгоритм оптимізований → складність приблизно O(n).

Приклад:

javascript
<ul> <li key="1">A</li> <li key="2">B</li> <li key="3">C</li> </ul>

Якщо B видаляється - React не перестворює C, тому що в нього той самий ключ, і він "переїжджає" вгору.


6. Чому Virtual DOM все ще не "безкоштовний"

  • Побудова і порівняння віртуальних дерев теж займає час.
  • При дуже частих оновленнях (анімації, canvas) - VDOM може бути повільнішим.
  • Тому React/Vue застосовують батчинг оновлень (групують їх за кадр) і хуки на кшталт useMemo / PureComponent.

7. Альтернативи і розвиток ідеї

ПідхідОсобливістьПриклад
Virtual DOM (дифф-дерево)Оновлює мінімальні частиниReact, Vue 2
Incremental DOMОдразу генерує патчі без diffSvelte (частково), lit-html
Compile-time diffingКод компілюється в оптимальний JS без VDOMSvelte, Solid.js
Fine-grained reactivityЗмінюється лише конкретний сигнал/коміркаSolid.js, Vue 3 (composition API)

Сучасні фреймворки поступово відходять від "глобального Virtual DOM" до точкової реактивності (Signal-based UI).


8. Коротке резюме

ЩоПояснення
Virtual DOMJS-представлення реального DOM у пам'яті
НавіщоЗменшити кількість прямих операцій з DOM
ЯкПорівнює старе і нове дерево, оновлює лише змінені частини
ПлюсиШвидше, простіше, декларативно
МінусиНе безкоштовний, додає шар абстракції
АльтернативаSvelte / Solid - без глобального VDOM (компілятор сам знає, що міняти)

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

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

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