FAST Element — это библиотека для создания веб-компонентов с высокой производительностью и модульной архитектурой. Она строится на стандартах Web Components и предоставляет расширенные возможности для декларативного управления состоянием, шаблонами и стилями.
В основе FAST Element лежит класс
FASTElement, который наследуется при создании
собственного компонента. Любой компонент состоит из трёх ключевых
частей: шаблон, стиль и
логика.
import { FASTElement, html, css } from "@microsoft/fast-element";
const template = html`
<div class="container">
<span>${x => x.message}</span>
<button @click=${x => x.updateMessage()}>Обновить</button>
</div>
`;
const styles = css`
.container {
display: flex;
gap: 10px;
align-items: center;
}
button {
padding: 5px 10px;
cursor: pointer;
}
`;
class MyComponent extends FASTElement {
message = "Привет, FAST!";
updateMessage() {
this.message = "Сообщение обновлено";
}
}
MyComponent.define({ name: "my-component", template, styles });
В этом примере видно несколько ключевых особенностей FAST Element:
${x => x.message} обеспечивает реактивное обновление DOM
при изменении свойства.@click=${x => x.updateMessage()} привязывает метод
класса к событию DOM.css, применяется только к этому компоненту.FAST Element использует мощную систему шаблонов на основе tagged template literals. Основные возможности включают:
${x => x.prop}:if="${x => x.show}"repeat(x => x.items, html\
)
Пример условного отображения и повторения элементов:
import { repeat } from "@microsoft/fast-element";
const listTemplate = html`
<ul>
${repeat(x => x.items, html`<li>${x => x}</li>`)}
</ul>
<div :if="${x => x.items.length === 0}">Список пуст</div>
`;
Свойства компонента, определённые в классе, автоматически становятся
реактивными, если они объявлены через обычные поля или
через @observable. Любое изменение такого свойства
инициирует обновление шаблона.
import { observable } from "@microsoft/fast-element";
class Counter extends FASTElement {
@observable count = 0;
increment() {
this.count++;
}
}
FAST Element отслеживает изменения автоматически, что позволяет не писать лишний код для обновления DOM.
FAST Element предоставляет стандартные методы жизненного цикла веб-компонентов:
connectedCallback() — вызывается при добавлении
элемента в DOM.disconnectedCallback() — вызывается при удалении
элемента из DOM.adoptedCallback() — при переносе элемента в другой
документ.attributeChangedCallback() — при изменении
атрибута.Кроме того, FAST добавляет собственные расширения, например:
templateChanged() — срабатывает при изменении
шаблона.stylesChanged() — срабатывает при изменении
стилей.Компоненты FAST легко объединяются: один компонент может включать другой через обычный HTML, используя определённый тег:
const parentTemplate = html`
<div>
<my-component></my-component>
<my-component message="Второй компонент"></my-component>
</div>
`;
Композиция позволяет создавать сложные интерфейсы без дублирования логики и стилей.
FAST Element поддерживает CSS custom properties и темизацию. Стиль можно задавать как на уровне отдельного компонента, так и через глобальные темы.
const styles = css`
:host {
--button-color: blue;
display: block;
}
button {
background-color: var(--button-color);
color: white;
border: none;
padding: 8px 16px;
border-radius: 4px;
}
`;
:host позволяет управлять стилями самого компонента, а
переменные CSS дают возможность менять тему без переписывания кода.
FAST Element автоматически синхронизирует атрибуты HTML с реактивными свойствами:
class MyInput extends FASTElement {
value = "";
}
MyInput.define({
name: "my-input",
template: html`<input type="text" :value="${x => x.value}">`,
});
Изменение атрибута в DOM
(<my-input value="тест"></my-input>) обновит
свойство value и наоборот.
FASTElement,
html, csshtml с привязками
и директивамиcss с локальной
инкапсуляциейFASTElement, реактивные свойства, методыdefine({ name, template, styles })Эта структура позволяет создавать масштабируемые, модульные веб-компоненты с минимальными усилиями и высокой производительностью, используя стандарты веб-платформы и возможности FAST Element.