FAST Element — это библиотека для создания веб-компонентов с высокой производительностью и декларативной моделью. Для использования с современными сборщиками, такими как Vite, требуется корректная настройка проекта.
Для начала необходимо инициализировать проект через npm или Yarn:
npm create vite@latest fast-vite-app -- --template vanilla
cd fast-vite-app
npm install
После этого устанавливается FAST Element:
npm install @microsoft/fast-element
Vite поддерживает работу с ES-модулями, поэтому достаточно убедиться,
что проект использует современный синтаксис импорта. В
vite.config.js можно добавить:
import { defineConfig } from 'vite';
export default defineConfig({
optimizeDeps: {
include: ['@microsoft/fast-element']
}
});
Это гарантирует корректное предварительное сканирование FAST Element для ускорения сборки.
Компоненты создаются с использованием функции
FASTElement.define или через декоратор
@customElement. Основные элементы:
Шаблон создается с помощью функции html:
import { FASTElement, html, css } from '@microsoft/fast-element';
const template = html<MyComponent>`
<template>
<h1>${x => x.title}</h1>
<button @click=${x => x.increment()}>Нажми меня</button>
<p>Счётчик: ${x => x.count}</p>
</template>
`;
const styles = css`
h1 {
color: #005a9c;
font-size: 24px;
}
button {
padding: 8px 16px;
margin-top: 10px;
cursor: pointer;
}
`;
class MyComponent extends FASTElement {
count = 0;
title = 'Пример компонента FAST Element';
increment() {
this.count++;
}
}
FASTElement.define({
name: 'my-component',
template,
styles,
observedAttributes: ['count', 'title']
}, MyComponent);
После этого компонент доступен в HTML через тег
<my-component></my-component>.
FAST Element использует реактивные свойства для автоматического обновления DOM при изменении состояния. Ключевые моменты:
observedAttributes или декораторы.class Counter extends FASTElement {
count = 0;
increment() {
this.count++;
}
}
Использование в шаблоне:
html<Counter>`
<button @click=${x => x.increment()}>+</button>
<span>${x => x.count}</span>
`
FAST Element по умолчанию использует Shadow DOM, что обеспечивает изоляцию стилей:
Пример:
const styles = css`
:host {
display: block;
border: 1px solid #ccc;
padding: 16px;
}
::slotted(p) {
color: #ff6600;
}
`;
Слоты позволяют передавать контент внутрь компонента:
<my-component>
<p>Текст в слоте</p>
</my-component>
FAST Element поддерживает нативные DOM-события и добавляет удобные директивы:
@event для привязки событий.dispatchEvent для генерации кастомных событий.Пример создания и обработки события:
class ToggleButton extends FASTElement {
isOn = false;
toggle() {
this.isOn = !this.isOn;
this.dispatchEvent(new CustomEvent('toggle', { detail: this.isOn }));
}
}
const template = html<ToggleButton>`
<button @click=${x => x.toggle()}>
${x => x.isOn ? 'Вкл' : 'Выкл'}
</button>
`;
Для запуска проекта используется стандартная команда Vite:
npm run dev
Vite обеспечивает горячую перезагрузку при изменении файлов. Для продакшн-сборки:
npm run build
FAST Element не требует дополнительных транспайлеров или плагинов, благодаря полной поддержке ES-модулей. Важно убедиться, что любые сторонние зависимости тоже совместимы с ES-модулями для корректной работы в Vite.
FAST Element поддерживает декларативные директивы:
if — условное отображение
элемента.repeat — повторение элементов
массива.ref — ссылка на DOM-элемент.Пример условного рендера:
const template = html<MyComponent>`
<template>
${x => x.showMessage ? html`<p>Сообщение отображается</p>` : ''}
<button @click=${x => x.showMessage = !x.showMessage}>Показать/Скрыть</button>
</template>
`;
Пример повторения:
const template = html<MyComponent>`
<template>
<ul>
${x => x.items.map(item => html`<li>${item}</li>`)}
</ul>
</template>
`;
FAST Element легко интегрируется с современными библиотеками и фреймворками:
class.Если требуется, могу подготовить следующий блок с продвинутыми приёмами FAST Element: слоты, композиция компонентов, динамическая загрузка и расширенные реактивные шаблоны.
Хотите, чтобы я продолжил этим разделом?