Фреймворк Lit ориентирован на высокую производительность за счёт минимизации количества операций с DOM и оптимизации рендеринга компонентов. Основная идея заключается в том, чтобы шаблоны обновляли только те части DOM, которые действительно изменились, а не перерисовывали весь узел целиком.
Lit использует систему реактивных свойств. Любое свойство,
объявленное через декоратор @property или через
static properties, автоматически отслеживается. При
изменении значения свойства Lit ставит компонент в очередь обновлений,
но не сразу запускает ререндер. Это позволяет сгруппировать несколько
изменений и выполнить их одним проходом, избегая лишних пересчётов.
import { LitElement, html, css } from 'lit';
import { property } from 'lit/decorators.js';
class MyComponent extends LitElement {
@property({ type: String }) name = 'Lit';
render() {
return html`<p>Hello, ${this.name}!</p>`;
}
}
customElements.define('my-component', MyComponent);
Ключевой момент: изменение свойства
name вызовет обновление только текста внутри
<p>, а не всего компонента.
Lit использует шаблоны с системой директив, которые управляют рендерингом элементов и атрибутов. Директивы позволяют контролировать создание, удаление или обновление частей DOM без полной перерисовки.
Примеры:
repeat: эффективное рендерирование массивов, избегающее
пересоздания элементов при изменении массива.ifDefined: обновление атрибутов только при наличии
значения, предотвращая лишние операции.guard: блокировка рендеринга, если данные не
изменились.import { repeat } from 'lit/directives/repeat.js';
render() {
const items = ['A', 'B', 'C'];
return html`
<ul>
${repeat(items, (item) => item, (item, index) => html`<li>${item}</li>`)}
</ul>
`;
}
Ключевой момент: repeat использует
ключи для отслеживания элементов, что позволяет обновлять только
изменившиеся элементы массива, не трогая остальные.
Lit строит виртуальный DOM в виде шаблонов
(TemplateResult), который хранит структуру элементов и
связывает её с реактивными данными. При обновлении Lit выполняет
диффинг на уровне текстовых узлов и атрибутов, что
минимизирует затраты на работу с реальным DOM.
Lit ставит обновления в очередь и выполняет их асинхронно через микротаски. Это снижает количество лишних ререндеров при быстром изменении нескольких свойств.
this.name = 'New Name';
this.age = 30;
// Вместо двух отдельных рендеров Lit объединит обновления
Ключевой момент: несколько изменений свойств, выполненные в одном цикле событий, приведут к единственному обновлению DOM.
Lit поддерживает scoped CSS, что позволяет локально применять стили к
компоненту без пересчёта стилей всего документа. Использование
static styles позволяет применять стили один раз при
создании шаблона, а не при каждом обновлении.
static styles = css`
p {
color: blue;
}
`;
Lit позволяет оптимизировать рендеринг за счёт ленивой загрузки
частей шаблона или использования HTMLTemplateElement для
фрагментов, которые обновляются редко. Это снижает накладные расходы на
создание и пересоздание DOM-узлов.
Прямое манипулирование DOM через innerHTML или
appendChild приводит к полной перерисовке и разрушению
структуры узлов. Lit избегает этого, благодаря шаблонам и связыванию
данных, что делает обновления микропроизводительными и
масштабируемыми.
Эффективная работа шаблонов Lit строится на трёх принципах: реактивные свойства, минимальные операции с DOM и использование директив для управления обновлениями. Эти механизмы позволяют создавать динамичные интерфейсы с высокой производительностью, даже при больших объёмах данных и сложной структуре компонентов.