Haunted — это библиотека для создания веб-компонентов на базе современного JavaScript, использующая реактивные хуки, аналогичные React, но ориентированная на Web Components. Она строится вокруг концепции легковесного обновления DOM и обеспечивает тесную интеграцию с нативными веб-технологиями. Основные элементы Haunted — это функциональные компоненты, хуки состояния и эффекты, которые позволяют управлять жизненным циклом компонентов и их состоянием.
Функциональный компонент определяется как обычная функция, возвращающая template literal с разметкой HTML:
import { html, component } from 'haunted';
function Counter({ initial = 0 }) {
const [count, setCount] = useState(initial);
return html`
<div>
<p>Счётчик: ${count}</p>
<button @click=${() => setCount(count + 1)}>Увеличить</button>
</div>
`;
}
customElements.define('my-counter', component(Counter));
Важный момент — Haunted не использует виртуальный DOM. Обновления DOM происходят только там, где изменились значения, что обеспечивает высокую производительность и низкий overhead.
Haunted реализует несколько ключевых хуков:
Пример использования useEffect для подписки на события:
import { useEffect } from 'haunted';
function Timer() {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const id = setInterval(() => setSeconds(s => s + 1), 1000);
return () => clearInterval(id); // очистка при размонтировании
}, []);
return html`<p>Прошло секунд: ${seconds}</p>`;
}
Ключевой аспект — возврат функции из useEffect позволяет корректно очищать ресурсы при уничтожении компонента, предотвращая утечки памяти.
Миграция на Haunted требует анализа архитектуры текущего проекта и планирования постепенного внедрения компонентов. Основные подходы:
Пример обертки старого элемента:
class LegacyWrapper extends HTMLElement {
connectedCallback() {
this.innerHTML = `<my-counter initial="10"></my-counter>`;
}
}
customElements.define('legacy-wrapper', LegacyWrapper);
Существующие классовые Web Components можно постепенно переписать в функциональные Haunted-компоненты:
useState.useEffect.useRef.Преимущество — уменьшение шаблонного кода и повышение читаемости.
Haunted совместим с любыми фронтенд-технологиями, поддерживающими Custom Elements:
Пример внедрения Haunted в React:
import React from 'react';
function App() {
return (
<div>
<my-counter initial={5}></my-counter>
</div>
);
}
При переходе на Haunted важно учитывать способы управления состоянием:
useState.Пример передачи данных через свойства и прослушку событий:
function UserCard({ user }) {
const handleClick = () => dispatchEvent(new CustomEvent('select-user', { detail: user }));
return html`
<div @click=${handleClick}>
<h2>${user.name}</h2>
</div>
`;
}
Haunted изначально проектировался для минимизации перерисовок. При миграции нужно учитывать:
useMemo или кэширования сложных
вычислений.useEffect для
предотвращения утечек.Haunted позволяет создавать реактивные Web Components с минимальным overhead и высокой интеграцией с существующими веб-технологиями. Стратегии миграции включают пошаговую замену UI, рефакторинг классовых компонентов в функциональные, а также сохранение совместимости с внешними фреймворками и системами состояния. Такой подход обеспечивает плавный переход без потери производительности и контролируемое управление сложностью проекта.