Що таке block tree (Vue 3)?
Block Tree (блочне дерево) - це внутрішня оптимізаційна структура Vue 3, яка дозволяє значно зменшити обсяг Virtual DOM, що порівнюється, і пришвидшити рендеринг.
Це одна з ключових причин, чому Virtual DOM у Vue 3 працює швидше, ніж у Vue 2, і швидше, ніж у React до появи Server Components.
Простіше кажучи:
Block Tree - це дерево блоків, де Vue відокремлює динамічні частини шаблону від статичних і оновлює лише ті вузли, які справді можуть змінитися.
Навіщо потрібен Block Tree?
У Vue 2 і класичному підході Virtual DOM diffing порівнював УСЕ дерево, навіть ті вузли, які гарантовано не змінюються.
Дорого? Так.
Vue 3 вирішив цю проблему.
Як працює Block Tree?
Коли Vue 3 компілює шаблон, він:
- Аналізує весь шаблон
- Будує дерево блоків - кожен блок містить лише динамічні вузли
- Статичні вузли виносяться за межі блоку і більше НЕ беруть участі в diff
Підсумок:
- diff працює лише по динамічних вузлах
- статичні - взагалі не перевіряються
- продуктивність -> різко вища
Приклад для розуміння
Шаблон:
<div>
<h1>Заголовок</h1>
<p>{{ message }}</p>
<button @click="inc">+</button>
</div>Vue аналізує:
<h1>- статичний<p>{{ message }}- динамічний (TEXT)<button @click="inc">- динамічний (EVENT)
І створює блок:
Block {
dynamicChildren: [
p (TEXT),
button (EVENT)
]
}А <h1> розміщується за межами блоку.
Тепер Vue під час оновлення буде порівнювати й патчити ЛИШЕ <p> і <button>.
<h1> взагалі ігнорується (навіть якщо таких елементів 1000).
Чому це швидше?
Тому що:
До Vue 3:
Diff -> рекурсивне порівняння ВСЬОГО DOM-дерева.
Vue 3 + Block Tree:
Diff -> порівняння лише динамічних вузлів.
Це може бути різниця в 10 разів на великих компонентах.
Важлива деталь: Block Tree = база для patch flags
Block Tree працює в парі з patch-флагами:
- TEXT
- PROPS
- CLASS
- STYLE
- EVENT
- і т.д.
Vue точно знає, які частини ноди можуть змінитися.
Не потрібно робити повний diff -> робота точкова.
Реальні переваги Block Tree
Значно менше роботи під час оновлення DOM
Лише динаміка -> жодної зайвої перевірки.
Менше сміття в пам'яті
Статичні вузли створюються один раз і кешуються.
Швидший рендер і re-render
Особливо в компонентах з:
- великими таблицями
- списками
- heavy UI
- layout-компонентами
Основа компіляторних оптимізацій Vue 3
Block Tree дозволяє Vue-компілятору бути «розумним».
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.