Три етапи роботи Vue:
- компіляція - шаблон перетворюється на рендер-функцію (зазвичай під час збирання, через Vite і
@vitejs/plugin-vue); - монтування - рендер-функція повертає дерево віртуальних вузлів (VNode), з якого створюється DOM. Під час виконання реактивна система запам'ятовує, які дані читалися;
- оновлення (patch) - змінилися дані - рендер-функція виконується знову, нове віртуальне дерево порівнюється зі старим, і в DOM застосовуються лише відмінності.
Чому шаблон - це не просто «зручний синтаксис». Компілятор бачить структуру шаблону цілком і додає підказки, яких немає в рукописній рендер-функції. Vue називає це «віртуальний DOM з підказками компілятора»:
- піднімання статичного (static hoisting): вузли без динамічних прив'язок створюються один раз і використовуються в усіх рендерах. Великі статичні фрагменти можуть бути перетворені на рядок HTML;
- прапорці оновлення (patch flags): на кожен динамічний вузол компілятор записує, що саме в ньому може змінитися - лише текст, лише
class, лише конкретні props. При оновленні Vue перевіряє тільки це; - блоки й «сплощення дерева» (tree flattening): кожен блок зберігає плоский список своїх динамічних нащадків. При оновленні Vue проходить лише цей список, а не все дерево. Межі блоків - структурні директиви (
v-if,v-for), де форма дерева може змінитися.
Результат: вартість оновлення залежить від кількості динамічних частин, а не від розміру шаблону.
Можна подивитися самому: Vue Template Explorer показує, у що компілюється шаблон, з підсвіченими прапорцями.
Дві збірки Vue:
- runtime-only - без компілятора (менша й без
eval). Підходить, коли всі шаблони -.vue-файли, скомпільовані Vite; - повна збірка (
vue/dist/vue.esm-bundler.jsз компілятором) - потрібна, якщо шаблон компілюється в браузері: опціяtemplateу компоненті чи in-DOM шаблон (Vue монтується на розмітку, згенеровану Blade). Вона більша й потребуєunsafe-evalу CSP.
Практичні висновки:
- шаблони ефективніші за рукописні рендер-функції для звичайних компонентів;
- розділення статичного й динамічного має сенс: великий шаблон з кількома динамічними місцями оновлюється дешево;
v-onceіv-memo- ручні підказки для випадків, де компілятор не може знати, що частина не змінюється.