Lit — это легковесный фреймворк для создания веб-компонентов с
использованием стандартов Web Components. Основная цель Lit — облегчить
разработку компонентов, сохраняя высокую производительность и
совместимость с нативными браузерными технологиями. Компоненты Lit
наследуются от класса LitElement, который предоставляет
методы для реактивного рендеринга и управления состоянием.
Простейший компонент выглядит следующим образом:
import { LitElement, html, css } from 'lit';
class MyComponent extends LitElement {
static styles = css`
p {
color: blue;
font-weight: bold;
}
`;
static properties = {
message: { type: String }
};
constructor() {
super();
this.message = 'Привет, Lit!';
}
render() {
return html`<p>${this.message}</p>`;
}
}
customElements.define('my-component', MyComponent);
Ключевые моменты:
LitElement — базовый класс для
создания компонента.html — функция для шаблонной разметки,
поддерживает реактивное обновление.css — позволяет определять локальные
стили компонента.properties — декларация реактивных
свойств, изменения которых вызывают повторный рендер.В Lit реактивные свойства автоматически отслеживают изменения и вызывают ререндер компонента. Это позволяет избежать прямого манипулирования DOM и упрощает управление состоянием.
Пример использования реактивного свойства:
this.count = 0;
increment() {
this.count += 1;
}
В шаблоне:
html`<button @click=${this.increment}>Нажато: ${this.count}</button>`
Особенность: каждый раз при изменении count вызывается
render, и DOM обновляется только там, где произошли
изменения.
Lit поддерживает инкапсулированные стили с помощью CSS, определённого
через свойство static styles. Это предотвращает конфликт
CSS между компонентами и позволяет создавать модульные интерфейсы.
Пример с медиа-запросами и псевдоклассами:
static styles = css`
button {
background-color: #007bff;
color: white;
border: none;
padding: 0.5em 1em;
cursor: pointer;
}
button:hover {
background-color: #0056b3;
}
@media (max-width: 600px) {
button {
width: 100%;
}
}
`;
Lit упрощает добавление событий через синтаксис
@event=${handler} в шаблоне. Этот подход обеспечивает
чистый и удобный способ обработки действий пользователя.
Пример:
handleClick() {
console.log('Кнопка нажата!');
}
render() {
return html`<button @click=${this.handleClick}>Кликни меня</button>`;
}
События можно также кастомизировать и передавать наружу через
CustomEvent:
this.dispatchEvent(new CustomEvent('my-event', { detail: { value: 42 } }));
Vue.js и Lit могут сосуществовать в одном проекте, что позволяет постепенно мигрировать старый интерфейс на веб-компоненты без полной переработки. Lit-компоненты можно использовать в Vue-шаблонах как обычные HTML-теги.
Пример использования Lit-компонента в Vue:
<template>
<div>
<my-component message="Привет из Vue!"></my-component>
</div>
</template>
<script>
import './MyComponent.js';
export default {
name: 'VueWrapper'
};
</script>
Особенности интеграции:
CustomEvent, могут быть
пойманы с помощью директивы Vue @event-name.<my-component @my-event="handleEvent"></my-component>
ref.Lit оптимизирует рендеринг, обновляя только изменённые части DOM. Для больших приложений с множеством компонентов это значительно снижает нагрузку на браузер. В сочетании с Vue можно разделять ответственность: Vue управляет состоянием и бизнес-логикой, а Lit отвечает за высокопроизводительный UI и визуальные компоненты.
Рекомендации по повышению производительности:
shouldUpdate(changedProperties) для
контроля, когда компонент должен обновляться.render.Lit поддерживает:
repeat для списков.async
функции и директивы, что позволяет создавать плавные интерфейсы с
большим количеством данных.Пример с повторением списка:
import { repeat } from 'lit/directives/repeat.js';
render() {
const items = ['Яблоко', 'Банан', 'Груша'];
return html`
<ul>
${repeat(items, (item) => item, (item, index) => html`<li>${index + 1}. ${item}</li>`)}
</ul>
`;
}
Такой подход минимизирует пересоздание элементов при изменении массива и значительно улучшает производительность.
Lit сочетает лёгкость, модульность и высокую производительность, что делает его мощным инструментом для современных веб-приложений, особенно в гибридных проектах с Vue.js.