Shadow DOM declarativo
Adjunte Shadow DOM desde HTML sin JavaScript mediante shadowrootmode
Shadow DOM declarativo es una lección gratuita de HTML Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de HTML Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de HTML Academy incluye 4 lecciones en total.
El problema que resuelve
El Shadow DOM tradicional se crea mediante JavaScript (attachShadow). En páginas renderizadas en el servidor, esto significa que el árbol shadow está vacío hasta que se ejecuta JavaScript, lo que contradice el propósito del SSR de entregar HTML completo desde el primer byte. Declarative Shadow DOM resuelve este problema.
El atributo shadowrootmode
Un <template> con shadowrootmode="open" declara un shadow root en HTML durante el análisis. El navegador adjunta automáticamente el shadow root al elemento padre; el contenido de template se convierte en el árbol shadow. No se necesita 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 con Web Components
Declarative Shadow DOM permite usar verdaderos web components renderizados en el servidor: el servidor emite el árbol shadow completo en línea, el navegador lo analiza y lo adjunta antes de ejecutar cualquier JS, y el JS de hidratación puede tomar el control desde una base completamente renderizada. Está en igualdad de condiciones con el SSR de los frameworks.
Modo: abierto o cerrado
Son los mismos modos que en attachShadow imperativo: shadowrootmode="open" expone el shadow como element.shadowRoot; shadowrootmode="closed" lo oculta. El comportamiento es idéntico al de su equivalente adjunto mediante JavaScript.
Se analiza una vez por elemento
El navegador adjunta el shadow root la primera vez que encuentra <template shadowrootmode>. Una vez adjunto, template se consume; si se consulta más adelante, no se devuelve nada. Esto coincide con el ciclo de vida de attachShadow: un shadow existe durante toda la vida del elemento.
Los slots funcionan con normalidad
Los hijos light (el <p> situado fuera de <template> en el ejemplo) se proyectan en los elementos <slot> dentro del árbol shadow, igual que con Shadow DOM imperativo. La composición es idéntica; solo cambia el mecanismo de adjunción.
Combinación con Custom Elements
Si <my-card> es un custom element registrado, el proceso de actualización recoge el shadow root ya adjunto en lugar de volver a llamar a attachShadow. La clase del custom element puede leer this.shadowRoot en su connectedCallback sin necesidad de crearlo.
Compatibilidad con herramientas de servidor
Lit-html's render, los componentes de Astro y varios frameworks más ya emiten Declarative Shadow DOM como parte de su salida de SSR. Crear una solución propia es viable: cualquier sistema de plantillas basado en cadenas puede escribir el template con shadowrootmode.
Compatibilidad de los navegadores
Declarative Shadow DOM está disponible en Chrome, Edge, Safari y Firefox. Los navegadores antiguos ignoran silenciosamente el elemento <template>; el contenido dentro de template permanece invisible, lo que proporciona una degradación progresiva adecuada en entornos que no lo admiten.
Estrategia de polyfill
Para ampliar la compatibilidad, un script pequeño puede recorrer el DOM y convertir template[shadowrootmode] en shadow roots reales. Ejecútelo antes de registrar cualquier custom element para garantizar que las actualizaciones posteriores de los componentes encuentren el árbol shadow esperado.
Compensaciones
Declarative Shadow DOM duplica la estructura: el contenido de <template> está presente en el HTML aunque también esté integrado en la clase del componente. En páginas con muchos componentes iguales, esto aumenta el tamaño del payload. Los frameworks eliminan duplicados; en una implementación de SSR propia quizá le convenga hacer lo mismo.
Cuándo adoptarlo
Si distribuye web components y le importan el renderizado desde el primer byte o el SEO, adóptelo ahora. La función es estable, cuenta con compatibilidad y mejora enormemente el SSR de las aplicaciones basadas en web components. No se aplica a aplicaciones que no utilizan Shadow DOM.
Comprobación de conocimientos
¿Qué problema resuelve Declarative Shadow DOM en comparación con attachShadow imperativo?
Resumen
Declarative Shadow DOM utiliza <template shadowrootmode="open"> dentro de un custom element para adjuntar un shadow root durante el análisis, sin necesidad de JS. Permite un SSR real para web components: el árbol shadow, los estilos encapsulados y los slots funcionan antes de la hidratación. Es compatible con todos los navegadores modernos y hay un polyfill disponible para los más antiguos. Los frameworks (Lit, Astro) lo emiten automáticamente.
Preguntas frecuentes
¿La lección «Shadow DOM declarativo» es gratis?
Sí — el texto completo de «Shadow DOM declarativo» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de HTML Academy, actualiza a CoddyKit PRO. El curso de HTML Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Shadow DOM declarativo»?
Adjunte Shadow DOM desde HTML sin JavaScript mediante shadowrootmode Practicas HTML Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar HTML Academy?
No se requiere experiencia previa. HTML Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Shadow DOM declarativo»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de HTML Academy?
Sí. Cada lección de HTML Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Shadow DOM declarativo
- La Popover API
- El elemento selectlist
- Interest Invokers y el atributo Command