Коротка відповідь
middle#shadow-root — це частина Shadow DOM, яка ізолює внутрішню структуру компонента від глобального DOM. В інспекторі HTML він показує окремий піддерево, що містить стилі та елементи, недоступні за межами. Це забезпечує модульність і запобігає колізії CSS‑селекторів.
Повне пояснення
-
Що це і навіщо. #shadow-root – внутрішній контейнер Shadow DOM, що ізолює компонент. Він дозволяє розробникам створювати самодостатні UI‑блоки, не турбуючись про вплив зовнішніх стилів.
-
Ключові принципи, терміни, інваріанти.
- Shadow DOM – технологія Web Components.
- Відкритий (open) чи закритий (closed) режим доступу до #shadow-root.
- Внутрішні елементи не впливають на глобальний CSS, а навпаки – зовнішні стилі не проникають.
-
Як це працює (життєвий цикл, алгоритм). При створенні елемента з атрибутом
attachShadow({mode:'open'})браузер створює #shadow-root. У ньому рендериться вміст, а під час пошуку стилів застосовується Shadow DOM CSS‑scoping. -
Практика і реалізація (React/Next.js). У React можна створити кастомний компонент, що використовує
useRefіattachShadow. Приклад:const MyComp = () => { const ref = useRef<HTMLDivElement>(null); useEffect(() => { if (ref.current) ref.current.attachShadow({mode:'open'}).innerHTML = '<p>Hello</p>'; }, []); return <div ref={ref} />; }; -
Тестування. Для тестів з Shadow DOM використовуйте
@testing-library/domі методиgetByText, які працюють через ShadowRoot. -
Оптимізація продуктивності.
- Уникайте надмірного використання слідування стилів (CSS cascade) всередині Shadow DOM.
- Кешуйте створений ShadowRoot, щоб не повторювати його при кожному рендері.
-
Accessibility.
- Внутрішні елементи Shadow DOM мають бути доступними через ARIA‑атрибути.
- Переконайтеся, що клавіатурна навігація працює всередині компоненту.
-
Безпека та валідація.
- Внутрішні скрипти не мають доступу до глобального
window, що зменшує ризик XSS. - Перевіряйте вміст перед вставкою у ShadowRoot.
- Внутрішні скрипти не мають доступу до глобального
-
Типові помилки й edge cases.
- Забудьте про
mode:'closed'– тоді доступ до ShadowRoot через JavaScript неможливий. - Якщо компонент використовується в старих браузерах, слід забезпечити polyfill.
- Забудьте про
-
Cheatsheet + можливі follow‑up питання.
- Як отримати доступ до елементу всередині ShadowRoot? –
shadowRoot.querySelector(). - Чому стилі не проникають у Shadow DOM? – через CSS‑scoping.
- Які альтернативи Shadow DOM? –
iframe,slot(частина Web Components).