- En HTML seul, il n’existe pas de fonctionnalité d’
include permettant d’inclure le même élément sur plusieurs pages
- Le CSS peut charger du CSS, JavaScript peut charger du JS, mais HTML ne peut pas importer du HTML, ce qui soulève des questions
- Pour résoudre ce problème, on utilise divers JavaScript, langages de template et générateurs de sites statiques
- Les problèmes complexes de performance, sécurité, délai de rendu et inclusions circulaires constituent des freins à son adoption
- De nombreux développeurs souhaitent une fonctionnalité d’include déclarative pure en HTML, mais elle n’a toujours pas été intégrée aux standards du Web
Pourquoi il n’existe pas de fonctionnalité Include en HTML ?
Le problème
- Il est contraignant de répéter un en-tête commun dans plusieurs pages comme
index.html, about.html, contact.html, etc.
- Les développeurs veulent réutiliser un en-tête défini une seule fois sans duplication
Les solutions de contournement déjà existantes
- Utiliser la fetch API de JavaScript pour charger du HTML externe puis l’insérer dans le DOM
- Les Server Side Includes (SSI),
include en PHP, les générateurs de sites statiques et les langages de template constituent déjà des solutions
- Des éléments HTML comme
<iframe> et <object> sont aussi possibles, mais restent inadaptés à cause de problèmes d’accessibilité, de performance et d’isolation des styles
- Au final, HTML lui-même ne dispose pas d’une syntaxe d’include simple
Pourquoi cette fonctionnalité n’existe-t-elle pas en HTML ?
- Le CSS et le JS disposent respectivement de syntaxes comme
@import ou import, mais ce n’est pas le cas du HTML
- Les standards du Web ont généralement intégré les fonctionnalités largement utilisées par les développeurs, mais l’include HTML n’a pas suivi ce chemin
- Raisons avancées dans la discussion :
- risque de perturber le fonctionnement du preload scanner
- problèmes de décalage de mise en page / scintillement lors d’un chargement asynchrone
- complexité du traitement des includes imbriqués ou circulaires
- réticence liée à l’augmentation du trafic côté hébergement Web
- enjeux de sécurité (CORS, CSP, etc.) et conflits de timing avec les événements de chargement du document
- ou simplement une priorité faible et l’absence de proposition claire
Discussions liées
- Le sujet est activement débattu dans le fil d’issue WHATWG sur GitHub #2791
- Dans le passé, Chrome a un temps proposé HTML Imports, mais la fonctionnalité a été abandonnée en raison de l’absence de prise en charge par les autres navigateurs
- Des approches alternatives comme HTMX, Web Components, XSLT ou SSI sont également partagées
Résumé des réactions de la communauté
- L’évolution de HTML est restée centrée sur le balisage statique, avec une philosophie qui écarte encore les fonctionnalités logiques
- Beaucoup de gens souhaitent cette fonctionnalité, mais la plupart des développeurs individuels ont du mal à se faire entendre dans le processus de standardisation
- Certains estiment aussi que son adoption restera difficile tant que ne seront pas résolus les problèmes complexes de performance, sécurité, rendu et prévention des boucles circulaires
- Pour certains développeurs, cette absence s’explique simplement par l’idée que HTML ne devrait s’occuper que du “résultat”
Conclusion
- À ce jour, HTML ne dispose toujours pas d’une fonctionnalité d’include pure, et il faut la remplacer par divers outils et langages externes
- Mais de nombreux développeurs continuent d’espérer une structure de réutilisation simple fondée sur HTML
1 commentaires
Avis Hacker News
main.htmlinclutchild/include1.htmlet quechild/include1.htmlcontient un liensrc="include2.html", où l’utilisateur doit-il aller quand il clique sur ce lien ? S’il va versinclude2.html, il lui manquera tout le reste de la page. S’il va versmain.html, comment indiquer que cette fois il faut utiliserinclude2.htmlet noninclude1.html?article1.html,article2.html,article3.html, etc. peuvent chacun inclureheader.html,footer.htmletnavi.html. Mais si l’on veut ajoutercomments.htmlà tous les articles, il faut modifier tous les articles ; on finit donc par générer les articles à partir d’un template, ce qui rend inutile un support des inclusions par le navigateur