Shadow DOM в SkateJS изолирует структуру, стиль и логику компонентов, предотвращая конфликт с внешней страницей и соседними компонентами. В основе лежит стандартный Web Components API, поэтому SkateJS не создаёт собственную модель инкапсуляции, а лишь упрощает взаимодействие.
Shadow Root формирует замкнутую область рендера. В
SkateJS он создаётся автоматически при определении компонента. Элементы
и стили, помещённые внутрь Shadow DOM, становятся недоступны напрямую
извне, если только не используется механика ::part,
::theme, slot или
exportparts.
Shadow DOM обеспечивает:
Отрисовка происходит через render() компонента. SkateJS
использует базовый подход: функция возвращает фрагменты DOM, которые
монтируются в Shadow Root. HTML-структура компонента остаётся стабильной
и недоступной для случайных изменений.
import { define, Component } from 'skatejs';
class Tooltip extends Component {
render () {
return (
<div part="container">
<slot name="trigger"></slot>
<div part="content"><slot></slot></div>
</div>
);
}
}
define('x-tooltip', Tooltip);
Этот пример показывает, что компонент не зависит от DOM страницы и не вмешивается в него. Слоты дают возможность вписать пользовательский контент внутрь Shadow DOM без нарушения изоляции.
CSS помещается в Shadow Root и не влияет на внешний контент. Обычно используется собственный механизм добавления стилей в компонент, после чего стили замыкаются внутри корневого объекта.
Ключевые особенности:
:host и
:host(...) для стилизации корневого элемента;:host-context(...) позволяет реагировать на окружение
компонента;::slotted(...) управляет видом контента, переданного
через слот.Для тематизации используются part и
exportparts. Они позволяют открыть определённые части
компонента для внешней стилизации без раскрытия всей внутренней
структуры.
<div part="btn"></div>
Когда требуется делегировать стилизацию, компонент может экспортировать части дальше. Это особенно важно при создании библиотек UI-компонентов.
Слоты обеспечивают гибкость структуры. SkateJS не модифицирует
механизм стилизации slot, поэтому используются стандартные
возможности Web Components:
Домашний DOM и Shadow DOM остаются независимыми: добавление или удаление узлов через слот не нарушает внутренний рендер.
Shadow DOM не прерывает событийную модель. События по умолчанию
всплывают сквозь границы Shadow Root. SkateJS не изменяет механизм
composed и bubbles, поэтому компоненты могут
участвовать в сложных цепочках взаимодействия без необходимости
раскрывать внутреннее DOM-дерево.
Основные моменты:
composed: true делает событие доступным вне Shadow
Root;composed внешняя среда не увидит внутренние
события;Инкапсуляция снижает количество непредсказуемых ререндеров, поскольку Shadow DOM стабилизирует область, которую изменяет компонент. SkateJS обновляет внутреннее дерево выборочно, что исключает тяжёлые манипуляции с глобальным DOM и упрощает оптимизацию.
На масштабных интерфейсах это заметно уменьшает количество коллизий CSS, снижает сложность отладки и избегает непредсказуемого поведения, вызванного внешними стилями и скриптами.
Shadow DOM не мешает предварительной отрисовке и может использоваться вместе с SSR. SkateJS передаёт результат рендера в Shadow Root на клиенте, обеспечивая предсказуемое состояние после гидратации. Компонент остаётся изолированным даже при смешанном рендеринге.
Так как SkateJS опирается на нативные Web Components, интеграция не требует сторонних рантаймов. Инкапсуляция поддерживается браузером, без полифиллов, что повышает совместимость и уменьшает зависимость от экосистемы фреймворков.
Shadow DOM формирует фундамент архитектуры SkateJS, обеспечивая стабильность компонентов, неизменяемость структуры и предсказуемость при разрастании интерфейса.