Preact — это легковесный JavaScript-фреймворк для построения пользовательских интерфейсов, основой которого является концепция виртуального DOM. Виртуальный DOM (Virtual DOM, VDOM) представляет собой легковесную абстракцию настоящего DOM, позволяющую минимизировать количество прямых изменений в дереве элементов браузера и повышать производительность приложений.
Виртуальный DOM создается как дерево JavaScript-объектов, соответствующих элементам интерфейса. Каждый объект описывает:
type, например, 'div' или
'span');props, включая атрибуты и
обработчики событий);children).VDOM не взаимодействует с браузером напрямую. Изменения сначала происходят в виртуальном дереве, после чего Preact вычисляет минимальный набор операций, необходимых для обновления реального DOM.
Преимущества подхода:
В традиционном подходе при изменении интерфейса каждый вызов
appendChild, removeChild или
setAttribute приводит к непосредственному изменению
DOM, что вызывает перерасчёт стилей и повторную отрисовку
страницы (reflow/repaint). Это особенно критично для больших
интерфейсов, где DOM содержит сотни или тысячи узлов.
VDOM позволяет собрать все изменения в памяти, затем выполнить их пакетно, минимизируя количество реальных операций.
Главный механизм, обеспечивающий эффективность виртуального DOM в Preact, — это алгоритм диффинга. Он сравнивает старое и новое виртуальные деревья и вычисляет, какие изменения необходимо применить к реальному DOM.
Основные шаги алгоритма:
Сравнение корневых узлов:
Сравнение свойств (props):
Обработка детей:
key), если они указаны, что позволяет эффективно
перемещать или переиспользовать элементы.Особенности Preact:
Использование атрибута key критично для корректного
диффинга массивов элементов. Без ключей Preact будет полагаться на
порядок элементов, что может привести к неэффективной
перерисовке и потерям состояния компонентов.
Пример использования ключей:
const listItems = items.map(item => (
<li key={item.id}>{item.name}</li>
));
Ключи позволяют Preact:
Компоненты в Preact могут быть функциональными или классовыми. В основе рендеринга лежит создание виртуального DOM-узла и последующее диффинг-обновление.
Пример функционального компонента:
function Counter({ count }) {
return <div>Счетчик: {count}</div>;
}
При изменении свойства count Preact:
В совокупности виртуальный DOM и алгоритмы рендеринга формируют ядро высокой производительности Preact и делают его одним из самых легких и быстрых решений для построения интерактивных веб-приложений.