- Solo con HTML no existe una función de
include para incluir el mismo elemento en varias páginas
- CSS puede cargar CSS y JavaScript puede cargar JS, pero resulta curioso que HTML no pueda traer HTML
- Para resolver este problema se usan diversas herramientas de JavaScript, lenguajes de plantillas y generadores de sitios estáticos
- Problemas complejos como rendimiento, seguridad, retrasos de renderizado e inclusiones circulares actúan como obstáculos para su adopción
- Muchos desarrolladores quieren una función declarativa pura de include en HTML, pero todavía no se ha incorporado al estándar web
La duda sobre por qué no existe una función de include en HTML
Planteamiento del problema
- Existe la incomodidad de insertar repetidamente un encabezado común en varias páginas como
index.html, about.html y contact.html
- Los desarrolladores quieren reutilizar un encabezado definido una sola vez sin duplicación
Métodos alternativos que ya existen
- Un método es usar la fetch API de JavaScript para cargar HTML externo e insertarlo en el DOM
- También existen soluciones como Server Side Includes (SSI),
include de PHP, generadores de sitios estáticos y lenguajes de plantillas
- Elementos HTML como
<iframe> y <object> también podrían usarse, pero no son adecuados por problemas de accesibilidad, rendimiento y aislamiento de estilos
- Al final, HTML en sí no tiene una sintaxis simple de include
¿Por qué HTML no tiene esta función?
- CSS y JS tienen respectivamente sintaxis como
@import o import, pero HTML no
- Los estándares web normalmente han incorporado funciones muy utilizadas por los desarrolladores, pero los includes en HTML no han corrido con esa suerte
- Razones planteadas en la discusión:
- Posible interferencia con el funcionamiento del preload scanner
- Problemas de layout shift/parpadeo durante la carga asíncrona
- Complejidad para manejar includes anidados o circulares
- Resistencia por el aumento del tráfico en el web hosting
- Problemas de seguridad (CORS, CSP, etc.) y conflictos de timing con los eventos de carga del documento
- O quizá simplemente porque tenía baja prioridad y no hubo una propuesta clara
Discusión relacionada
- Se está debatiendo activamente en el hilo de issues de WHATWG en GitHub #2791
- En el pasado, Chrome llegó a tener HTML Imports, pero terminó siendo eliminado por la falta de soporte en otros navegadores
- Se comparten enfoques alternativos como HTMX, Web Components, XSLT y SSI
Resumen de la reacción de la comunidad
- Como la evolución de HTML ha seguido centrada en el markup estático, sigue siendo fuerte la filosofía de excluir capacidades lógicas
- Muchas personas quieren esta función, pero la mayoría son desarrolladores individuales a quienes les cuesta hacer oír su voz en el proceso de estandarización
- También hay análisis de que sería difícil adoptarla si no se resuelven problemas complejos de rendimiento, seguridad, procesamiento de renderizado y prevención de ciclos
- Algunos desarrolladores consideran que la función de include quedó fuera simplemente por la idea de que HTML debe encargarse solo del “resultado”
Conclusión
- HTML todavía no cuenta con una función pura de include, y hay que reemplazarla con diversas herramientas y lenguajes externos
- Sin embargo, muchos desarrolladores todavía esperan una estructura de reutilización simple basada en HTML
1 comentarios
Opiniones de Hacker News
iframees suficiente, el problema es queiframeno se expande para ajustarse al contenido. Las soluciones del lado del servidor requieren un servidor. ¿Por qué no existe una forma simple del lado del cliente? Me parece una pregunta válidaiframe) estaba pensado para cumplir esta función hace mucho tiempo. Al menos el autoajuste funcionaba bien y el usuario podía redimensionarlomain.htmlincluyechild/include1.html, ychild/include1.htmltiene un enlacesrc="include2.html", ¿a dónde debería ir el usuario al hacer clic en el enlace? Si va ainclude2.html, esa página carecerá de todo lo demás. Si va amain.html, ¿cómo se especifica entonces que esta vez se useinclude2.htmly noinclude1.html?article1.html,article2.html,article3.html, etc., podrían incluir cada unoheader.html,footer.htmlynavi.html. Pero si quieres agregarcomments.htmla todos los artículos, tendrías que editar todos los artículos, y al final terminarías generándolos a partir de una plantilla, con lo que el navegador ya no necesitaría soportar inclusiones