Haunted — это библиотека для создания веб-компонентов на основе реактивных хуков в стиле React. Одной из ключевых особенностей веб-компонентов является Shadow DOM, который изолирует внутреннюю структуру компонента от внешнего документа. Понимание того, как инспектировать Shadow DOM в Haunted, важно для отладки, тестирования и анализа состояния компонентов.
Haunted использует нативные веб-компоненты, что подразумевает
создание Shadow DOM через attachShadow. В Haunted можно
определить компонент следующим образом:
import { html, component } from 'haunted';
function MyComponent({ message }) {
return html`
<div class="container">
<p>${message}</p>
</div>
`;
}
customElements.define('my-component', component(MyComponent));
По умолчанию Haunted создаёт shadow root в режиме
open, что позволяет напрямую обращаться к нему через
свойство shadowRoot:
const myComp = document.querySelector('my-component');
const shadow = myComp.shadowRoot;
console.log(shadow.innerHTML); // <div class="container"><p>...</p></div>
Если компонент создаётся с mode: 'closed', доступ к
shadowRoot напрямую невозможен. Для Haunted режим
open используется чаще всего, так как он обеспечивает
удобное инспектирование.
Shadow DOM хранит внутренние элементы компонента отдельно от основного DOM. Основные аспекты:
import { useState } from 'haunted';
function Counter() {
const [count, setCount] = useState(0);
return html`
<button @click=${() => setCount(count + 1)}>Счёт: ${count}</button>
`;
}
customElements.define('counter-element', component(Counter));
При нажатии на кнопку shadowRoot обновляется
автоматически, что позволяет инспектировать текущий DOM и видеть
обновлённые значения счётчика.
Современные браузеры (Chrome, Firefox, Edge) позволяют раскрывать Shadow DOM в панели Elements. Основные возможности:
#shadow-root (open).Важно учитывать, что inline-рендер Haunted создаёт виртуальный DOM, который конвертируется в реальные элементы внутри shadow root, поэтому структура в DevTools отображается в точности как итоговый HTML.
Для автоматизированного тестирования или динамического анализа можно работать с Shadow DOM через Jav * aScript:
// Поиск элемента внутри shadow root
const btn = myComp.shadowRoot.querySelector('button');
btn.addEventListener('click', () => console.log('Нажато'));
// Изменение содержимого
const p = myComp.shadowRoot.querySelector('p');
p.textContent = 'Обновлённый текст';
При использовании Haunted это особенно важно для unit-тестов, когда нужно проверять реакцию компонентов на изменения состояния.
Haunted поддерживает вложенные компоненты, каждый из которых имеет свой shadow root:
function Child() {
return html`<span>Дочерний элемент</span>`;
}
function Parent() {
return html`<child-element></child-element>`;
}
customElements.define('child-element', component(Child));
customElements.define('parent-element', component(Parent));
Доступ к вложенному shadow root осуществляется по цепочке:
const parent = document.querySelector('parent-element');
const child = parent.shadowRoot.querySelector('child-element');
console.log(child.shadowRoot.innerHTML); // <span>Дочерний элемент</span>
Такая структура позволяет точно инспектировать состояние компонентов на любом уровне и отслеживать их взаимодействие.
useState или useReducer мгновенно отражаются в
shadow root.useEffect), поэтому
инспектирование лучше проводить после завершения всех эффектов.mode: 'open' для компонентов Haunted, если
необходимо инспектирование.shadowRoot для динамического доступа и
тестирования.Haunted, будучи лёгкой и реактивной библиотекой, делает работу с Shadow DOM максимально предсказуемой и прозрачной. Понимание структуры shadow root и способов её инспектирования критично для качественного контроля поведения компонентов.