Як Vue оптимізує Virtual DOM?
1. Оптимізація на етапі компіляції (Compile-time optimization)
Vue-компілятор аналізує шаблон і помічає ділянки, які НЕ змінюються, як static nodes.
Це означає:
- статичні частини взагалі не беруть участі в diff
- вони створюються один раз і більше не перевіряються
- віртуальні ноди для них не перестворюються
Приклад:
<div>
<h1>Заголовок</h1> <!-- статично -->
<p>{{ message }}</p> <!-- динамічно -->
</div>Vue позначить <h1> як статичний вузол.
Він не братиме участі в порівнянні та оновленні.
Це сильно зменшує diff-дерево.
2. Patch flags - прапори патчингу (Vue 3)
Головне нововведення Vue 3.
Під час компіляції Vue додає спеціальні прапори:
- TEXT - змінюється тільки текст
- PROPS - змінюються тільки певні пропси
- CLASS - змінюється тільки клас
- STYLE - змінюються тільки стилі
Це дозволяє Vue не порівнювати всю віртуальну ноду, а одразу застосовувати конкретне оновлення, минаючи diff.
Приклад віртуальної ноди з прапором:
// Vue знає, що змінюється тільки текст
createVNode("p", null, message, PatchFlags.TEXT)Diffing виконується точково, а не для всього дерева.
3. Block Tree (блочне дерево)
Vue 3 використовує структуру блоків, які:
- групують динамічні частини
- виключають статичні піддерева
- мінімізують кількість порівнюваних нод
Це величезна оптимізація, якої немає в React.
Ідея:
Динамічні елементи відстежуються окремо, а статичне дерево взагалі не бере участі в diff.
Це в рази зменшує роботу алгоритму порівняння.
4. Hoisting - винесення статичних вузлів
Статичні елементи "виносяться" за межі рендеру і створюються тільки один раз:
const _hoisted_1 = /*#__PURE__*/ createVNode(...)Рендер-функція:
- не перестворює вузол
- не порівнює його
- використовує заздалегідь створений кеш
Менше створення об'єктів → менше GC → швидший рендер.
5. Memoization (v-memo)
Vue може кешувати фрагменти шаблону:
<div v-memo="[count]">
{{ expensiveComputation }}
</div>Якщо count не змінився → Vue пропускає дифф усієї секції.
6. Оптимізація списку через ключі (v-for + key)
Vue ефективно порівнює списки, якщо задати ключ:
<li v-for="item in list" :key="item.id">Алгоритм:
- мінімально переміщує елементи
- не перерендерює зайве
- використовує O(n) оптимізації
Без ключів продуктивність падає.
7. Reactive refs і reactive → точкові оновлення
Vue 3 використовує проксі-реактивність:
- оновлюється тільки конкретне поле
- тільки конкретний watcher
- тільки потрібний компонент
- тільки потрібний шматок VDOM
Це мінімізує запуск рендеру.
8. Tree-shaking і оптимізація збірки
Vue 3 - повністю tree-shakable:
- невикористані функції не потрапляють у бандл
- менше коду → швидше завантаження → швидший рендер
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.