Lit построен вокруг идеи декларативного описания пользовательского интерфейса. DOM не модифицируется вручную: состояние компонента описывается через свойства, а разметка — как функция этого состояния. Любое изменение данных автоматически приводит к повторному рендерингу только затронутых частей шаблона.
Ключевой принцип — реактивные свойства. Свойства компонента объявляются явно и становятся источниками истины для UI. Lit отслеживает изменения этих свойств и инициирует обновление представления без необходимости ручного управления жизненным циклом.
static properties = {
count: { type: Number }
};
Такое объявление одновременно решает несколько задач:
Lit сознательно избегает избыточных абстракций. В его основе лежат Web Components и стандартные возможности платформы: Custom Elements, Shadow DOM, ES Modules, шаблонные строки.
Фреймворк не скрывает браузерные API, а аккуратно надстраивается над ними:
HTMLElement;connectedCallback,
disconnectedCallback);Такой подход приводит к следующим архитектурным эффектам:
Шаблоны в Lit описываются с помощью tagged template literals
(html). Они не являются строками или виртуальным DOM, а
компилируются в эффективные инструкции обновления реального DOM.
render() {
return html`
<p>${this.count}</p>
`;
}
Принципиальные свойства шаблонов Lit:
Lit не пересоздаёт DOM-дерево, а применяет диффы на уровне отдельных выражений, что снижает нагрузку на браузер.
Lit не навязывает архитектуру глобального состояния. Он исходит из предположения, что большинство компонентов могут быть локально управляемыми. Состояние принадлежит компоненту и изменяется предсказуемым образом.
Основные принципы:
Для сложных сценариев допускается интеграция с внешними хранилищами (Redux, Zustand, Signals), но сам Lit не зависит от них.
Проектирование компонентов в Lit предполагает однонаправленный data flow:
this.dispatchEvent(new CustomEvent('change', { detail }));
Такой подход:
Компоненты не знают о структуре приложения и не взаимодействуют напрямую друг с другом.
Каждый компонент Lit — это изолированная единица:
Стили по умолчанию не «протекают» наружу и не зависят от внешнего окружения. Это позволяет проектировать компоненты как автономные модули, пригодные для повторного использования в разных проектах.
static styles = css`
:host {
display: block;
}
`;
Инкапсуляция не является абсолютной: предусмотрены механизмы кастомизации через CSS Custom Properties, слоты и атрибуты.
Lit изначально проектировался с прицелом на минимальный runtime:
Рендеринг выполняется лениво и батчится. Несколько изменений свойств в одном тике event loop приводят к одному обновлению DOM. Это снижает количество перерисовок и улучшает отзывчивость интерфейса.
Lit поощряет композицию:
Наследование используется минимально и только для расширения базового
LitElement. Повторное использование достигается за
счёт:
repeat, when,
classMap);Жизненный цикл компонента Lit чётко структурирован и прозрачен:
Методы updated, firstUpdated и
willUpdate предоставляют контролируемые точки для побочных
эффектов. Рендеринг всегда отделён от логики, что предотвращает
случайные зависимости между состоянием и DOM.
Lit разрабатывается с учётом TypeScript и активно использует его возможности:
Философия фреймворка предполагает, что большинство ошибок должны выявляться до запуска приложения. Это влияет на стиль API: он декларативен, явен и дружелюбен к статическому анализу.
Lit не стремится быть экосистемой «всё в одном». Он проектируется как долгоживущий слой, устойчивый к изменениям трендов. Компоненты, написанные сегодня, остаются актуальными через годы, поскольку опираются на стандарты веб-платформы.
Это выражается в следующих принципах:
Lit рассматривается не как временное решение, а как инфраструктурный уровень для построения интерфейсов.