Lit — это современный JavaScript-фреймворк для создания веб-компонентов, который сочетает легковесность, декларативный подход и высокую производительность. В основе Lit лежат стандарты веб-компонентов: Custom Elements, Shadow DOM и HTML Templates. Это обеспечивает полную совместимость с любыми современными браузерами и позволяет интегрировать компоненты в существующие проекты без ограничений.
Важнейший элемент Lit — класс компонента, который
наследуется от LitElement. Именно через него реализуются
свойства, методы и шаблон отображения.
import { LitElement, html, css } from 'lit';
class MyComponent extends LitElement {
static properties = {
name: { type: String }
};
static styles = css`
p {
color: blue;
font-weight: bold;
}
`;
constructor() {
super();
this.name = 'Lit';
}
render() {
return html`<p>Hello, ${this.name}!</p>`;
}
}
customElements.define('my-component', MyComponent);
properties — реактивные свойства, изменение которых
автоматически инициирует перерисовку компонента.styles — стили компонента, изолированные через Shadow
DOM.render() — метод, возвращающий шаблон в формате
html с поддержкой интерполяции данных.В Lit ключевое внимание уделяется реактивности.
Любое изменение свойства, объявленного в static properties,
автоматически вызывает обновление DOM. При этом можно задать типы и даже
наблюдатели:
static properties = {
count: { type: Number, reflect: true }
};
updated(changedProperties) {
if (changedProperties.has('count')) {
console.log(`Count изменился на ${this.count}`);
}
}
reflect: true позволяет синхронизировать свойство с
атрибутом HTML.updated вызывается после каждой перерисовки и
может использоваться для дополнительных побочных эффектов.Lit использует шаблоны на основе Tagged Template Literals. Это позволяет динамически вставлять данные и использовать специальные директивы для оптимизации:
repeat — для рендеринга массивов.ifDefined — для условного присвоения атрибутов.unsafeHTML — для вставки HTML-кода, который не должен
экранироваться.Пример с циклом:
import { repeat } from 'lit/directives/repeat.js';
render() {
const items = ['Apple', 'Banana', 'Cherry'];
return html`
<ul>
${repeat(items, item => item, item => html`<li>${item}</li>`)}
</ul>
`;
}
Компоненты Lit поддерживают стандартные DOM-события. Для их объявления и обработки можно использовать:
handleClick() {
this.dispatchEvent(new CustomEvent('item-clicked', {
detail: { message: 'Элемент был нажат' },
bubbles: true,
composed: true
}));
}
render() {
return html`<button @click=${this.handleClick}>Нажми меня</button>`;
}
@click — синтаксис для привязки слушателей
событий.dispatchEvent позволяет компоненту испускать события,
которые могут быть обработаны внешним кодом.Lit полностью использует Shadow DOM, что
обеспечивает инкапсуляцию стилей и предотвращает конфликт с глобальными
CSS. Для глобальных стилей можно использовать CSS-переменные или
подключать стили через <style> в Light DOM.
static styles = css`
:host {
display: block;
padding: 16px;
background-color: var(--bg-color, lightgray);
}
p {
font-size: 1.2em;
}
`;
:host — селектор, который стилизует сам компонент.Lit позволяет создавать комплексные компоненты, объединяя несколько веб-компонентов в один интерфейс. Для этого компоненты могут содержать другие компоненты в шаблоне:
render() {
return html`
<my-header></my-header>
<main>
<my-content></my-content>
</main>
<my-footer></my-footer>
`;
}
Веб-компоненты, созданные с помощью Lit, могут использоваться в Angular, React, Vue и чистом HTML. Angular распознает их как обычные элементы DOM:
<my-component name="Angular"></my-component>
Для Angular достаточно импортировать компонент в проект и убедиться, что браузер поддерживает Custom Elements или подключён полифилл. Lit-компоненты не конфликтуют с Angular, так как Shadow DOM обеспечивает изоляцию.
Lit минимизирует перерисовку благодаря виртуальному
DOM-подходу внутри LitElement. При изменении
свойств обновляется только та часть шаблона, которая действительно
изменилась. Директивы вроде repeat и map
обеспечивают эффективное управление списками и массивами.
requestUpdate() позволяет вручную
инициировать обновление.shouldUpdate(changedProperties) позволяет
контролировать, когда шаблон следует обновлять, что полезно для больших
компонентов.Lit имеет официальные расширения, включая:
Эти возможности делают Lit мощным инструментом для построения веб-приложений, где важны модульность, легковесность и высокая производительность.