Deklaratywny Shadow DOM
Dołączanie shadow DOM z poziomu HTML bez JavaScript za pomocą shadowrootmode
Deklaratywny Shadow DOM to bezpłatna lekcja HTML Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej HTML Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs HTML Academy zawiera 4 lekcji w sumie.
Rozwiązywany problem
Tradycyjny Shadow DOM jest tworzony za pomocą JavaScriptu (attachShadow). W przypadku stron renderowanych po stronie serwera oznacza to, że drzewo cieni jest puste do momentu uruchomienia JavaScriptu — co niweczy cel SSR, czyli dostarczenie kompletnego HTML-u już przy pierwszym bajcie. Declarative Shadow DOM rozwiązuje ten problem.
Atrybut shadowrootmode
Element <template> z atrybutem shadowrootmode="open" deklaruje root cienia w HTML-u w momencie parsowania. Przeglądarka automatycznie dołącza root cienia do elementu nadrzędnego, a zawartość template staje się drzewem cieni. JavaScript nie jest wymagany.
<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 z Web Components
Declarative Shadow DOM umożliwia prawdziwe renderowanie komponentów webowych po stronie serwera: serwer umieszcza całe drzewo cieni bezpośrednio w dokumencie, przeglądarka parsuje je i dołącza przed uruchomieniem jakiegokolwiek JavaScriptu, a JavaScript odpowiedzialny za hydrację może przejąć kontrolę nad w pełni wyrenderowaną bazą. Zapewnia to możliwości SSR na równi z frameworkami.
Tryb: open lub closed
Dostępne są te same tryby co w imperatywnym attachShadow: shadowrootmode="open" udostępnia cień jako element.shadowRoot, a shadowrootmode="closed" go ukrywa. Zachowanie jest identyczne jak w przypadku odpowiednika dołączonego za pomocą JavaScriptu.
Parsowanie tylko raz dla każdego elementu
Przeglądarka dołącza root cienia przy pierwszym napotkaniu elementu <template shadowrootmode>. Po dołączeniu template zostaje zużyty — późniejsze wyszukiwanie go nic nie zwróci. Odpowiada to cyklowi życia attachShadow: cień istnieje przez cały czas życia elementu.
Sloty działają normalnie
Dzieci light DOM-u (element <p> znajdujący się poza elementem <template> w przykładzie) są wstawiane do elementów <slot> wewnątrz drzewa cieni, tak samo jak w przypadku imperatywnego Shadow DOM-u. Sposób kompozycji jest identyczny — różni się tylko mechanizm dołączania.
Łączenie z Custom Elements
Jeśli <my-card> jest zarejestrowanym custom elementem, proces aktualizacji wykorzystuje już dołączony root cienia zamiast ponownie wywoływać attachShadow. Klasa custom elementu może odczytać this.shadowRoot w swoim connectedCallback bez konieczności jego tworzenia.
Obsługa w narzędziach serwerowych
render z Lit-html, komponenty Astro i kilka innych frameworków emituje teraz Declarative Shadow DOM jako część danych wyjściowych SSR. Samodzielna implementacja również jest możliwa: każdy system szablonów oparty na ciągach znaków może wygenerować template z atrybutem shadowrootmode.
Obsługa przeglądarek
Declarative Shadow DOM jest dostępny w Chrome, Edge, Safari i Firefoxie. Starsze przeglądarki po cichu ignorują element <template> — jego zawartość jest niewidoczna, co zapewnia łagodne pogorszenie działania w środowiskach bez obsługi tej funkcji.
Strategia polyfillu
Aby zapewnić szerszą obsługę, niewielki skrypt może przejść po DOM-ie i przekształcić elementy template[shadowrootmode] w rzeczywiste rooty cienia. Uruchom go przed zarejestrowaniem jakichkolwiek custom elements, aby późniejsze aktualizacje komponentów zobaczyły oczekiwane drzewo cieni.
Kompromisy
Declarative Shadow DOM powiela strukturę: zawartość <template> znajduje się w HTML-u, mimo że jest również zawarta w klasie komponentu. W przypadku stron zawierających wiele takich samych komponentów zwiększa to rozmiar danych. Frameworki usuwają duplikaty; w przypadku własnej implementacji SSR warto rozważyć to samo.
Kiedy wdrożyć
Jeśli dostarczają Państwo web components i zależy Państwu na renderowaniu od pierwszego bajtu lub na SEO — warto wdrożyć tę funkcję już teraz. Jest stabilna, obsługiwana i znacząco poprawia SSR w aplikacjach opartych na web components. Nie ma zastosowania w aplikacjach, które nie używają Shadow DOM-u.
Sprawdzenie wiedzy
Jaki problem rozwiązuje Declarative Shadow DOM w porównaniu z imperatywnym attachShadow?
Podsumowanie
Declarative Shadow DOM wykorzystuje <template shadowrootmode="open"> wewnątrz custom elementu, aby dołączyć root cienia w momencie parsowania, bez potrzeby użycia JavaScriptu. Umożliwia prawdziwe SSR dla web components: drzewo cieni, style z zakresem ograniczonym do komponentu i sloty działają jeszcze przed hydracją. Funkcja jest obsługiwana we wszystkich nowoczesnych przeglądarkach, a dla starszych dostępny jest polyfill. Frameworki (Lit, Astro) emitują ją automatycznie.
Często zadawane pytania
Czy lekcja „Deklaratywny Shadow DOM” jest bezpłatna?
Tak — pełny tekst „Deklaratywny Shadow DOM” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu HTML Academy, przejdź na CoddyKit PRO. Kurs HTML Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Deklaratywny Shadow DOM”?
Dołączanie shadow DOM z poziomu HTML bez JavaScript za pomocą shadowrootmode Ćwiczysz HTML Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć HTML Academy?
Nie wymagamy żadnego doświadczenia. HTML Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Deklaratywny Shadow DOM”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji HTML Academy?
Tak. Każda lekcja HTML Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Deklaratywny Shadow DOM
- Popover API
- Element selectlist
- Interest Invokers i atrybut command