Virtual DOM, рендер-функции, компилятор

↑ 7.1 Vue под капотом · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Вопрос «как Vue быстрее чистого virtual DOM»: компилятор оптимизирует шаблон на этапе сборки.

Virtual DOM

Это дерево JS-объектов (vnode), описывающих DOM. При обновлении Vue строит новое дерево, сравнивает со старым и применяет минимальные изменения к настоящему DOM.

Рендер-функции

import { h } from 'vue'
export default {
  props: ['level'],
  setup(props, { slots }) {
    return () => h(`h${props.level}`, { class: 'title' }, slots.default?.())
  },
}

Шаблоны компилируются в такие функции. Рендер-функции (и JSX) удобны для динамических компонентов и библиотек.

Компилятор: оптимизации

ПриёмСмысл
Static hoistingстатические узлы создаются один раз вне render
Patch flagsу динамических узлов помечено, что менять (TEXT, CLASS, PROPS)
Block treeобход только динамических узлов блока, а не всего дерева
Cache handlersобработчики событий кэшируются
Inline textсклейка соседних статических строк

Пример: в <div><p>static</p><span>{{ msg }}</span></div> при обновлении проверяется только span, причём только текст.

Нюансы

  • оптимизации работают только для шаблонов, в ручных рендер-функциях их нет;
  • v-once и v-memo дополнительно отключают или ограничивают патчинг;
  • в Vue 3.6 Vapor Mode может вовсе отказаться от virtual DOM (см. тему про новое).

Вопросы с ответами