FAST Element — это библиотека для создания высокопроизводительных веб-компонентов на базе стандартов Web Components. Она предоставляет декларативный синтаксис для связывания данных, управления состоянием и определения шаблонов элементов, сохраняя при этом совместимость с нативными браузерными API.
Базовый элемент создаётся с помощью класса, наследующего
FASTElement, и функции html для описания
шаблона:
import { FASTElement, html, css } from "@microsoft/fast-element";
const template = html<MyElement>`
<div class="container">
<span>${x => x.label}</span>
</div>
`;
const styles = css`
.container {
padding: 8px;
background-color: #f0f0f0;
}
`;
class MyElement extends FASTElement {
label = "Пример текста";
}
MyElement.define({ name: "my-element", template, styles });
Ключевые моменты:
FASTElement управляет жизненным циклом компонента.${x => x.property}
обеспечивает реактивность.css и прикреплять к
компоненту локально.FAST Element использует одностороннее и двухстороннее связывание данных.
Одностороннее связывание позволяет отображать свойства компонента в шаблоне:
<span>${x => x.username}</span>
Двухстороннее связывание реализуется через директивы
bind:
<input value.bind=${x => x.username}>
При изменении username в компоненте, значение
автоматически обновляется в DOM и наоборот.
Реактивность достигается через наблюдаемые свойства:
import { observable } from "@microsoft/fast-element";
class UserCard extends FASTElement {
@observable username = "guest";
}
Любое изменение username вызовет повторный рендер
шаблона там, где это свойство используется.
FAST Element изначально проектировался с учетом доступности. Основная задача — корректное взаимодействие компонентов с технологиями чтения с экрана.
Основные аспекты:
ARIA-атрибуты
<button aria-pressed="${x => x.active}" @click="${x => x.toggle()}">
${x => x.label}
</button>
aria-pressed сообщает скринридеру, включена кнопка или
нет.Роль и семантика
role="button", role="dialog",
role="tab" и т.д.Управление фокусом
this.focus() внутри методов компонента.autofocus или слушать
события клавиатуры для улучшения навигации:handleKeyDown(event) {
if (event.key === "Enter") this.activate();
}Обновление текста для скринридеров
aria-live:<div aria-live="polite">${x => x.message}</div>
aria-live="polite" сообщает скринридеру, что контент
нужно зачитать без прерывания текущей речи пользователя.Слоты (<slot>) позволяют вставлять внешний контент
в компоненты, сохраняя семантику:
<template>
<div class="card">
<header><slot name="header"></slot></header>
<main><slot></slot></main>
</div>
</template>
<header>,
<main>, <footer>) внутри
слотов.slot для кнопок, заголовков или
интерактивных элементов, чтобы обеспечить предсказуемое чтение
контента.Компоненты часто обновляют контент в реальном времени. Для
скринридеров используется aria-live:
class NotificationElement extends FASTElement {
message = "";
notify(newMessage) {
this.message = newMessage;
}
}
const template = html<NotificationElement>`
<div aria-live="assertive">${x => x.message}</div>
`;
aria-live="assertive" прерывает текущую речь
скринридера и озвучивает сообщение немедленно.aria-live совместно с реактивными
свойствами FAST Element позволяет создавать доступные уведомления без
дополнительных библиотек.<button> или <a> вместо
<div> для интерактивности.<input> с
label и aria-describedby обеспечивает
корректное озвучивание.<dialog role="dialog" aria-modal="true"> совместно с
FAST Element позволяет управлять открытием и закрытием модальных окон
для скринридеров.aria-live для уведомлений, обновляющихся в
DOM.FAST Element сочетает реактивную архитектуру с полной поддержкой стандартов веб-доступности, что делает его мощным инструментом для создания интерактивных и доступных интерфейсов на современных веб-платформах.