FAST Element — это современная библиотека для создания веб-компонентов на чистом JavaScript с использованием декларативного синтаксиса. Она позволяет строить высокопроизводительные, реактивные и настраиваемые элементы интерфейса, полностью совместимые со стандартом Custom Elements.
В основе FAST Element лежит класс
FASTElement, который расширяет стандартный
HTMLElement. Для создания компонента необходимо наследовать
этот класс и описать шаблон и реактивные свойства.
import { FASTElement, html, css, customElement, observable } from "@microsoft/fast-element";
@customElement({
name: 'my-element',
template: html`<p>${x => x.message}</p>`,
styles: css`p { color: blue; }`
})
class MyElement extends FASTElement {
@observable message = 'Привет, FAST!';
}
HTML-шаблоны в FAST Element определяются через
функцию html. Шаблон может содержать:
${x => x.property}) — реактивно обновляется при
изменении значения свойства.@event=${x => x.handler()}) — позволяет напрямую
обрабатывать DOM-события.when) и
итерации (repeat) для динамического
отображения данных.Пример итерации массива:
import { repeat } from "@microsoft/fast-element";
@customElement({
name: 'list-element',
template: html`
<ul>
${repeat(x => x.items, html`<li>${x => x}</li>`)}
</ul>
`
})
class ListElement extends FASTElement {
@observable items = ['Элемент 1', 'Элемент 2', 'Элемент 3'];
}
FAST Element поддерживает инкапсулированные стили,
используя стандартные CSS-переменные и css из библиотеки.
Можно подключать глобальные темы или создавать локальные стили.
const styles = css`
:host {
display: block;
padding: 10px;
background-color: var(--background, #f0f0f0);
}
p {
font-size: 16px;
color: var(--text-color, black);
}
`;
Стили можно применять как в декларации @customElement,
так и динамически изменять через реактивные свойства.
С помощью декоратора @observable создаются
наблюдаемые свойства, которые автоматически вызывают
перерисовку шаблона при изменении:
@observable count = 0;
increment() {
this.count += 1;
}
FAST Element поддерживает события изменения свойств
через метод propertyChanged, позволяя реагировать на
обновления и синхронизировать состояние с другими элементами:
countChanged(oldValue, newValue) {
console.log(`Count изменился с ${oldValue} на ${newValue}`);
}
Для обработки событий используется синтаксис @event
внутри шаблона. Это позволяет привязывать методы класса напрямую к
DOM-событиям:
template: html`
<button @click=${x => x.increment()}>Нажми меня</button>
<p>Счёт: ${x => x.count}</p>
`
FAST Element поддерживает слоты и композицию компонентов, что позволяет создавать сложные интерфейсы с переиспользуемыми блоками.
@customElement({
name: 'card-element',
template: html`
<div class="card">
<slot name="header"></slot>
<slot></slot>
<slot name="footer"></slot>
</div>
`,
styles: css`
.card { border: 1px solid #ccc; padding: 10px; border-radius: 5px; }
`
})
class CardElement extends FASTElement {}
Компонент можно использовать так:
<card-element>
<h3 slot="header">Заголовок</h3>
<p>Основное содержимое</p>
<footer slot="footer">Подвал</footer>
</card-element>
FAST Element реализует подход ViewModel, когда все данные и методы компонента сосредоточены в одном классе. Это упрощает управление состоянием и интеграцию с другими компонентами.
Компоненты FAST Element используют стандартные методы жизненного цикла Custom Elements:
connectedCallback — вызывается при вставке в DOM.disconnectedCallback — вызывается при удалении из
DOM.adoptedCallback — при переносе элемента в другой
документ.attributeChangedCallback — при изменении атрибута
элемента.FAST Element автоматически связывает наблюдаемые свойства с
атрибутами, если они объявлены с attribute: true в
конфигурации.
FAST Element использует виртуальный DOM-lite, минимизируя обновления DOM и выполняя диффинг шаблонов на уровне свойств. Это обеспечивает высокую производительность даже при большом количестве компонентов и данных.
Для динамических списков рекомендуется использовать
repeat с ключами:
${repeat(x => x.items, html`<li>${x => x.name}</li>`, {key: x => x.id})}
FAST Element легко интегрируется с любыми библиотеками и фреймворками через стандартные события и свойства. Можно использовать его внутри Vue, React или Angular как кастомный элемент, сохраняя реактивность и стилизацию.
FAST Element сочетает в себе удобство декларативного синтаксиса, реактивность и гибкость веб-компонентов, позволяя создавать сложные, масштабируемые интерфейсы с минимальным количеством кода и максимальной производительностью.