Гидратация — это процесс связывания уже существующей разметки в DOM с функциональностью компонента FAST Element без её полного пересоздания. Это особенно важно при серверном рендеринге (SSR) или при использовании статической разметки, когда HTML уже присутствует на странице. Гидратация позволяет экономить ресурсы и ускорять загрузку интерфейса.
В FAST Element гидратация реализуется через методы жизненного цикла компонентов и возможности связывания свойств с DOM.
Чтобы компонент был готов к гидратации, необходимо соблюсти несколько условий:
Определение шаблона через html
Компоненты должны иметь шаблон, созданный с помощью функции
html из пакета @microsoft/fast-element:
import { FASTElement, html, css } from "@microsoft/fast-element";
const template = html<MyButton>`
<button class="btn">${x => x.label}</button>
`;Привязка свойств Все динамические значения должны быть представлены через свойства класса:
class MyButton extends FASTElement {
label = "Нажми меня";
}Регистрация компонента Компоненты необходимо
зарегистрировать с использованием customElements.define или
через FAST-специфичный API FASTElement.define:
MyButton.define({
name: "my-button",
template
});Эта структура гарантирует, что при гидратации FAST Element сможет корректно сопоставить существующие элементы с компонентной логикой.
FAST Element использует динамическую привязку свойств к
DOM, которая активируется при вызове
FASTElement.hydrate. Основные этапы процесса:
Поиск целевых элементов в DOM FAST Element сканирует дерево DOM на наличие зарегистрированных тегов компонентов.
Создание экземпляров классов Для каждого найденного элемента создаётся экземпляр соответствующего класса компонента, но без пересоздания внутреннего DOM.
Привязка данных и обработчиков Присваиваются значения свойств и добавляются обработчики событий, определённые в шаблоне:
FASTElement.hydrate(document.body);
В этом случае весь document.body проверяется на наличие
компонентов FAST Element и связывается с их логикой.
Гидратация тесно интегрирована с методами жизненного цикла FAST Element:
connectedCallback() вызывается после связывания
экземпляра с DOM.propertyChanged(name, oldValue, newValue) позволяет
отслеживать изменение свойств даже при гидратации.render() — метод шаблона запускается только при первом
отображении данных.Правильная организация этих методов обеспечивает корректное функционирование компонента независимо от того, был ли он создан динамически или гидратирован из уже существующего DOM.
При SSR FAST Element позволяет:
Пример интеграции SSR:
// server.js (Node.js)
const templateHtml = renderToString(html<MyButton>`<my-button label="Привет"></my-button>`);
// client.js
import { FASTElement, FASTElement.hydrate } from "@microsoft/fast-element";
FASTElement.hydrate(document.body);
В этом случае кнопка сразу отображается, а после гидратации становится интерактивной.
Для ускорения работы можно:
Гидратировать только нужные узлы Вместо
document.body лучше указывать контейнер компонента:
FASTElement.hydrate(document.getElementById("app"));Использовать ленивую гидратацию Компоненты можно
гидратировать по мере появления в viewport с помощью
IntersectionObserver.
Минимизировать вычисления в
connectedCallback Любая тяжелая логика при
гидратации замедляет интерфейс, так как она выполняется сразу после
связывания с DOM.
FAST Element поддерживает двунаправленную привязку даже при гидратации:
const template = html<MyInput>`
<input type="text" value="${x => x.text}" @input="${x => x.text = x.event.target.value}">
`;
class MyInput extends FASTElement {
text = "Начальное значение";
}
Если элемент уже присутствует в DOM с текстом, гидратация
синхронизирует его с text и подключает обработчики событий,
сохраняя текущее состояние.
Использование гидратации в FAST Element позволяет объединять преимущества серверного рендеринга с полной интерактивностью компонентов без лишней нагрузки на браузер. Она обеспечивает плавный переход от статической HTML-разметки к полностью управляемому компонентному интерфейсу.