- Só com HTML não existe um recurso de
include para incluir o mesmo elemento em várias páginas*
- CSS consegue carregar CSS, e JavaScript consegue carregar JS, mas é estranho que HTML não consiga trazer HTML
- Para resolver isso, vêm sendo usados vários JavaScript, linguagens de template e geradores de sites estáticos
- Problemas complexos de performance, segurança, atraso de renderização e includes circulares atuam como barreiras para a adoção
- Muitos desenvolvedores querem um recurso de include declarativo e puro no HTML, mas isso ainda não foi incorporado ao padrão da web
A dúvida sobre por que não existe um recurso de Include no HTML
A questão
- Há o incômodo de repetir o mesmo cabeçalho comum em várias páginas, como
index.html, about.html e contact.html
- Os desenvolvedores querem reutilizar um cabeçalho definido uma vez só, sem duplicação
Métodos alternativos que já existem
- A forma de carregar HTML externo com a fetch API do JavaScript e inseri-lo no DOM
- Server Side Includes (SSI),
include do PHP, geradores de sites estáticos e linguagens de template já existem como solução
- Elementos HTML como
<iframe> e <object> também podem ser usados, mas são inadequados por causa de acessibilidade, performance e isolamento de estilos
- No fim das contas, o próprio HTML não tem uma sintaxe simples de include
Por que o HTML não tem esse recurso?
- CSS e JS têm suas próprias sintaxes
@import e import, mas o HTML não
- Os padrões da web em geral incorporaram recursos muito usados pelos desenvolvedores, mas o include em HTML não seguiu esse caminho
- Motivos levantados na discussão:
- Possível interferência no funcionamento do preload scanner
- Problemas de layout shift/piscadas durante carregamento assíncrono
- Complexidade no tratamento de includes aninhados ou circulares
- Resistência ao aumento de tráfego em hospedagens web
- Questões de segurança (CORS, CSP etc.) e conflitos de timing nos eventos de carregamento do documento
- Ou simplesmente porque a prioridade era baixa e não havia uma proposta clara
Discussões relacionadas
- O assunto está sendo discutido ativamente na issue #2791 do WHATWG no GitHub
- No passado, o Chrome chegou a ter HTML Imports, mas o recurso foi descontinuado por causa da falta de suporte dos outros navegadores
- Estão sendo compartilhadas abordagens alternativas como HTMX, Web Components, XSLT e SSI
Resumo da reação da comunidade
- Como a evolução do HTML continua centrada em markup estático, a filosofia de excluir recursos de lógica ainda segue forte
- Muita gente quer esse recurso, mas a maioria são desenvolvedores individuais que têm dificuldade de fazer sua voz chegar ao processo de padronização
- Também há análises de que a adoção seria difícil sem resolver problemas complexos de performance, segurança, processamento de renderização e prevenção de ciclos
- Alguns desenvolvedores acham simplesmente que o recurso ficou de fora por causa da ideia de que o HTML deveria cuidar apenas do “resultado”
Conclusão
- O HTML ainda não tem um recurso puro de include, e é preciso recorrer a várias ferramentas e linguagens externas para substituir isso
- Ainda assim, muitos desenvolvedores continuam esperando uma estrutura simples de reutilização baseada em HTML
1 comentários
Comentários do Hacker News
iframejá basta,iframenão se expande para se ajustar ao conteúdo. Soluções do lado do servidor exigem um servidor. Por que não existe uma forma simples do lado do cliente? Acho que essa é uma pergunta válidaiframe, foi pensado há muito tempo para fazer esse tipo de coisa. Pelo menos o redimensionamento automático funcionava bem e o usuário podia ajustar o tamanhomain.htmlincluichild/include1.html, echild/include1.htmltem um linksrc="include2.html", para onde o usuário deve ir ao clicar no link? Se for parainclude2.html, essa página ficará sem todo o resto. Se for paramain.html, como indicar que desta vez deve usarinclude2.htmle nãoinclude1.html?article1.html,article2.html,article3.htmletc. podem cada um incluirheader.html,footer.htmlenavi.html. Mas, se você quiser adicionarcomments.htmla todos os artigos, terá de editar todos eles, e aí acaba gerando os artigos a partir de um template, sem que o navegador precise dar suporte a includes