Декларативный Shadow DOM
Подключайте shadow DOM из HTML без JavaScript с помощью shadowrootmode
«Декларативный Shadow DOM» — бесплатный урок HTML Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения HTML Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс HTML Academy содержит 4 уроков всего.
Какую проблему это решает
Традиционный теневой DOM создаётся с помощью JavaScript (attachShadow). Для страниц, отображаемых на сервере, это означает, что теневое дерево остаётся пустым до запуска JS — и тем самым сводит на нет цель SSR: передать полный HTML уже в первом байте. Декларативный теневой DOM решает эту проблему.
Атрибут режима теневого корня
Элемент <template> с shadowrootmode="open" объявляет теневой корень в HTML во время разбора. Браузер автоматически присоединяет теневой корень к родительскому элементу, а содержимое шаблона становится теневым деревом. JavaScript не требуется.
<my-card>
<template shadowrootmode="open">
<style>:host { display: block; padding: 16px; }</style>
<slot></slot>
</template>
<p>This goes into the slot</p>
</my-card>SSR с веб-компонентами
Декларативный теневой DOM обеспечивает полноценный рендеринг веб-компонентов на сервере: сервер встраивает всё теневое дерево в страницу, браузер разбирает и присоединяет его до выполнения какого-либо JS, а JS для гидратации может продолжить работу с уже полностью отображённой основы. Веб-компоненты получают те же возможности, что и SSR фреймворков.
Режим: открытый или закрытый
Используются те же режимы, что и для императивного attachShadow: shadowrootmode="open" предоставляет доступ к теневому корню через element.shadowRoot, а shadowrootmode="closed" скрывает его. Поведение идентично соответствующей версии, подключаемой через JavaScript.
Разбирается один раз для каждого элемента
Браузер присоединяет теневой корень, когда впервые встречает элемент <template shadowrootmode>. После присоединения шаблон используется — последующий запрос к нему ничего не возвращает. Это соответствует жизненному циклу attachShadow: теневой корень существует столько же, сколько и элемент.
Слоты работают как обычно
Дочерние элементы основного DOM — <p> за пределами <template> в примере — проецируются в элементы <slot> внутри теневого дерева, как и при императивном использовании теневого DOM. Принцип композиции тот же, различается только механизм присоединения.
Сочетание с пользовательскими элементами
Если <my-card> — зарегистрированный пользовательский элемент, процесс его обновления использует уже присоединённый теневой корень, а не вызывает attachShadow повторно. Класс пользовательского элемента может прочитать this.shadowRoot в своём connectedCallback, не создавая теневой корень.
Поддержка серверных инструментов
Lit-html с помощью render, компоненты Astro и несколько других фреймворков теперь добавляют декларативный теневой DOM в результат SSR. Самостоятельная реализация тоже возможна: любая система шаблонов на основе строк может записывать шаблон с атрибутом режима теневого корня.
Поддержка браузерами
Декларативный теневой DOM поддерживается в Chrome, Edge, Safari и Firefox. Старые браузеры молча игнорируют элемент <template> — содержимое внутри шаблона остаётся невидимым, что обеспечивает корректное постепенное ухудшение для сред без поддержки.
Стратегия полифилла
Для более широкой поддержки небольшой скрипт может обойти DOM и преобразовать шаблоны с атрибутом режима теневого корня в настоящие теневые корни. Запускайте его до регистрации пользовательских элементов, чтобы последующие обновления компонентов увидели ожидаемое теневое дерево.
Компромиссы
Декларативный теневой DOM дублирует структуру: содержимое <template> находится в HTML, хотя оно также встроено в класс компонента. На страницах с большим количеством одинаковых компонентов это увеличивает объём передаваемых данных. Фреймворки устраняют дублирование; самостоятельной реализации SSR может понадобиться делать то же самое.
Когда стоит внедрять
Если вы создаёте веб-компоненты и заботитесь об отображении с первого байта или о поисковой оптимизации, внедряйте эту возможность уже сейчас. Она стабильна, поддерживается браузерами и значительно улучшает SSR для приложений на основе веб-компонентов. Для приложений без теневого DOM она неприменима.
Проверка знаний
Какую проблему решает декларативный теневой DOM по сравнению с императивным attachShadow?
Итоги
Декларативный теневой DOM использует <template shadowrootmode="open"> внутри пользовательского элемента, чтобы присоединить теневой корень во время разбора; JS не требуется. Это обеспечивает настоящий SSR для веб-компонентов: теневое дерево, изолированные стили и слоты работают ещё до гидратации. Возможность поддерживается всеми современными браузерами; для старых доступен полифилл. Фреймворки Lit и Astro добавляют её автоматически.
Часто задаваемые вопросы
Урок «Декларативный Shadow DOM» бесплатный?
Да — полный текст урока «Декларативный Shadow DOM» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс HTML Academy, подпишись на CoddyKit PRO. Курс HTML Academy содержит 4 уроков всего.
Чему я научусь в уроке «Декларативный Shadow DOM»?
Подключайте shadow DOM из HTML без JavaScript с помощью shadowrootmode Ты практикуешь HTML Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать HTML Academy?
Предыдущий опыт не требуется. HTML Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Декларативный Shadow DOM»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке HTML Academy?
Да. Каждый урок HTML Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Декларативный Shadow DOM
- Popover API
- Элемент selectlist
- Вызыватели интереса и атрибут command