Общие принципы интеграции

FAST Element — это современная библиотека для создания веб-компонентов на базе стандартов Custom Elements и Shadow DOM. Она обеспечивает высокую производительность, декларативность и гибкость при работе с компонентами, позволяя строить масштабируемые пользовательские интерфейсы.

В основе FAST Element лежат классы компонентов, шаблоны и реактивные свойства, а также мощная система директив и стилей, интегрируемых непосредственно в компоненты.


Определение компонента

Компонент FAST создается с помощью класса, который наследует FASTElement. Основная структура:

import { FASTElement, html, css } from "@microsoft/fast-element";

const template = html`
  <div class="container">
    <p>${x => x.message}</p>
  </div>
`;

const styles = css`
  .container {
    padding: 10px;
    border: 1px solid #ccc;
  }
`;

class MyComponent extends FASTElement {
  message = "Привет, FAST!";
}

FASTElement.define({
  name: "my-component",
  template,
  styles,
  elementClass: MyComponent
});

Ключевые моменты:

  • html используется для создания шаблона с привязками.
  • css задает стили, которые применяются только к данному компоненту.
  • Свойства класса автоматически становятся реактивными, если используются в шаблоне через ${x => x.property}.

Реактивные свойства

FAST Element использует обсервабельные свойства для автоматического обновления DOM при их изменении.

class Counter extends FASTElement {
  count = 0;

  increment() {
    this.count++;
  }
}

const template = html`
  <div>
    <span>${x => x.count}</span>
    <button @click=${x => x.increment()}>Увеличить</button>
  </div>
`;

Особенности реактивности:

  • Любое свойство, упомянутое в шаблоне, становится реактивным.
  • Изменение значения автоматически обновляет DOM без ручного управления состоянием.
  • Методы можно привязывать к событиям через @event=${x => x.method()}.

Интеграция с существующим DOM

FAST компоненты легко внедряются в обычный HTML:

<my-component></my-component>

Если требуется динамическое создание компонента через Jav * aScript:

const component = document.createElement("my-component");
component.message = "Динамическое сообщение";
document.body.appendChild(component);

Преимущества:

  • Компоненты полностью совместимы с нативным DOM.
  • Не требуется сторонних фреймворков для интеграции.
  • Shadow DOM обеспечивает изоляцию стилей и предотвращает конфликт с глобальными CSS.

Шаблоны и директивы

FAST Element поддерживает мощные директивы, которые управляют отображением, повторением и условной логикой внутри шаблонов.

  • repeat — для рендеринга списков:
import { repeat } from "@microsoft/fast-element";

const template = html`
  <ul>
    ${repeat(x => x.items, html`<li>${x => x}</li>`)}
  </ul>
`;
  • when — для условного отображения:
import { when } from "@microsoft/fast-element";

const template = html`
  ${when(x => x.isVisible, html`<p>Элемент видим</p>`)}
`;
  • ref — позволяет получить прямой доступ к DOM-элементу внутри шаблона:
const template = html`
  <input ${ref("inputElement")} />
`;

Стилизация и темы

FAST Element поддерживает каскадные стили внутри компонента и позволяет легко создавать темы.

const darkTheme = css`
  :host {
    --bg-color: #333;
    --text-color: #fff;
  }
  .container {
    background-color: var(--bg-color);
    color: var(--text-color);
  }
`;

Особенности:

  • :host применяется к самому элементу, обеспечивая изоляцию стилей.
  • CSS-переменные позволяют динамически менять темы.
  • Поддержка adoptedStyleSheets обеспечивает высокую производительность при масштабировании.

События и обработчики

FAST Element использует синтаксис @event для привязки событий:

const template = html`
  <button @click=${x => x.handleClick()}>Нажми меня</button>
`;

class MyComponent extends FASTElement {
  handleClick() {
    console.log("Кнопка нажата");
    this.$emit("custom-event", { value: 42 });
  }
}

Особенности работы с событиями:

  • $emit позволяет создавать кастомные события с деталями (detail).
  • События поднимаются через Shadow DOM наружу, сохраняя стандартное поведение DOM.

Подключение сторонних библиотек

FAST Element легко интегрируется с существующими библиотеками:

  • Можно использовать lit-html для рендеринга внутри FAST компонента.
  • Любые сторонние UI-библиотеки подключаются через Shadow DOM или глобальные стили.
  • Взаимодействие с фреймворками типа React или Vue осуществляется через обёртки Web Components.

Практические рекомендации

  • Оптимизировать рендеринг списков через директиву repeat.
  • Использовать реактивные свойства вместо прямого манипулирования DOM.
  • Разделять стили на глобальные темы и локальные компоненты для поддержки масштабируемости.
  • События и методы компонента должны быть максимально инкапсулированы, а связь с внешним DOM — через $emit.

FAST Element предоставляет современный подход к созданию Web Components с декларативной реактивностью, встроенной системой шаблонов и стилями, обеспечивая удобную интеграцию с любым существующим приложением на JavaScript.