Какие проблемы решает Virtual DOM?
Рендеринг и производительность
Virtual DOM решает конфликт между декларативным кодом («опиши, как выглядит UI») и дорогими операциями с реальным DOM.
Проблема 1: DOM-операции дороги
Каждое изменение реального DOM может вызвать пересчёт стилей, layout (reflow) и перерисовку. Наивная реализация декларативности — «стереть и построить заново на каждое изменение состояния» — была бы недопустимо медленной (и убивала бы фокус, ввод, скролл).
Проблема 2: ручная синхронизация не масштабируется
Императивный путь (jQuery) быстр, но требует вручную обновлять каждый зависимый кусок DOM при каждом изменении данных. Число связей растёт лавинообразно, забытые обновления дают рассинхрон интерфейса.
Решение
setState → новое виртуальное дерево (дёшево: JS-объекты)
→ дифф со старым → минимальный набор правок
→ батчем в реальный DOMРазработчик пишет так, будто UI пересоздаётся целиком; физически меняется минимум. Плюс: узлы переиспользуются (сохраняются фокус и позиция курсора), правки батчатся (один reflow вместо серии).
Что решает дополнительно
- Платформонезависимость: то же дерево рендерится в HTML на сервере (SSR) и в нативные вью (React Native).
- Прерываемость: работа над виртуальным деревом — обычные вычисления, их можно приоритизировать и прерывать (Fiber, React 18).
Границы
VDOM не делает рендер бесплатным: дифф стоит CPU. Он оптимизирует DOM-операции, а не количество вызовов компонентов — за это отвечают структура состояния и мемоизация.
Коротко для собеседования
Virtual DOM решает: дороговизну DOM-операций (дифф вычисляет минимальный патч, правки батчатся, узлы переиспользуются) и невозможность вручную поддерживать синхронизацию DOM с данными (декларативность вместо императивных обновлений). Бонусом — переносимость на другие платформы и прерываемый рендеринг.