Haunted — это небольшая библиотека для создания веб-компонентов с реактивным рендерингом, построенная поверх стандарта Web Components. Главная цель Haunted — дать возможность управлять состоянием компонентов через хуки, аналогично React, но без необходимости подключать целый фреймворк.
Ключевой принцип работы Haunted — реактивные
функции, которые автоматически вызываются при изменении
состояния. Это достигается с помощью хука useState, который
возвращает текущее значение и функцию для его обновления:
import { html, component, useState } from 'haunted';
function Counter() {
const [count, setCount] = useState(0);
return html`
<div>
<p>Счетчик: ${count}</p>
<button @click=${() => setCount(count + 1)}>Увеличить</button>
</div>
`;
}
customElements.define('my-counter', component(Counter));
В этом примере каждое обновление состояния вызывает повторный рендер компонента, сохраняя при этом минимальные затраты на DOM-операции.
Haunted использует lit-html для шаблонов, что позволяет эффективно обновлять только изменившиеся части DOM. Основные моменты оптимизации:
setState без необходимости. Каждое изменение состояния
запускает повторный рендер.useMemo или вычислять данные
вне шаблона.key,
чтобы Haunted правильно сопоставлял элементы и не пересоздавал их
полностью.function ItemList({ items }) {
return html`
<ul>
${items.map(item => html`<li key=${item.id}>${item.name}</li>`)}
</ul>
`;
}
Haunted предоставляет несколько хуков для управления состоянием и эффектами:
useState(initialValue) — хранение и обновление
локального состояния.useReducer(reducer, initialState) — для сложных
состояний с логикой изменений, аналог Redux внутри компонента.useEffect(callback, dependencies) — выполнение побочных
эффектов при изменении зависимостей.Эффективная работа с состоянием напрямую влияет на производительность. Чрезмерное использование состояний может привести к частым рендерам, поэтому важно комбинировать состояние и вычисляемые значения.
В веб-приложениях Haunted, как и в других SPA, ключевой фактор скорости — это размер и количество загружаемых ресурсов. Рекомендации:
import() для ленивой загрузки.const loadChart = async () => {
const module = await import('./chart-component.js');
return module.default;
};
Для уменьшения нагрузки на DOM рекомендуется:
const isVisible = true;
html`${isVisible ? html`<p>Видимый текст</p>` : ''}`
<div> и упрощают структуру DOM.Haunted отличается минимальным размером и прямым использованием Web Components. Ключевые преимущества в плане оптимизации:
Эти особенности делают Haunted удобным для проектов, где важны малый размер бандла, высокая скорость рендеринга и контроль над состоянием компонентов.
Haunted позволяет строить реактивные, компактные и быстрые веб-приложения при строгом соблюдении принципов оптимизации рендеринга и ассетов.