Comment repérer les différences entre deux fichiers HTML
Deux fichiers HTML peuvent s'afficher de manière identique dans un navigateur et pourtant différer à des dizaines d'endroits dans le code source. Les espaces autour des balises, l'ordre des attributs, les entités HTML et la syntaxe de fermeture automatique sont les coupables habituels. Un diff texte brut signale chacun d'eux comme un changement, ce qui noie ce qui vous intéresse vraiment. Ce guide vous montre comment obtenir un résultat propre.
Si vous voulez aller directement à l'outil, notre page de comparaison HTML vous permet de coller deux fichiers et de voir le diff dans votre navigateur, sans installation. Le reste de cet article explique quoi chercher une fois que vous avez le résultat.
Pourquoi les diffs HTML produisent autant de bruit
HTML n'est pas un format orienté lignes. Un paragraphe peut tenir sur une seule longue ligne ou s'étendre sur dix lignes, les deux sont valides. La plupart des éditeurs, formateurs de code et CMS reformatent le HTML à l'enregistrement, ce qui signifie qu'un simple changement de mot peut entraîner des dizaines de lignes reformatées. Le diff les voit comme des lignes modifiées, pas comme "un seul mot changé."
Le Standard HTML de WHATWG spécifie comment les navigateurs analysent le HTML, mais ne dit pas comment il doit être sérialisé en texte. Deux outils peuvent produire un HTML structurellement identique qui ne se ressemble pas du tout en texte brut.
Quatre éléments expliquent la majeure partie du bruit :
- Les espaces entre et dans les balises
- L'ordre des attributs (les navigateurs n'exigent pas d'ordre particulier)
- Les entités HTML par rapport aux caractères littéraux
- La syntaxe des éléments vides (
<br>par rapport à<br />)
Les espaces : la principale source de faux positifs
Dans la plupart des contextes, les espaces consécutifs en HTML se réduisent à un seul espace lors du rendu par le navigateur. Cela signifie que ces deux extraits s'affichent de manière identique :
<!-- Version 1 -->
<p>Free text comparison tool.</p>
<!-- Version 2 -->
<p>
Free text comparison tool.
</p>
Un diff texte brut marque les deux lignes comme modifiées. Elles n'ont pas changé dans un sens significatif. Avant de comparer, décidez si les espaces importent pour votre cas d'usage. Pour les modèles d'e-mail ou les renderers PDF, c'est parfois le cas. Pour la plupart des pages web, non.
La meilleure solution est de passer les deux fichiers par un formateur comme Prettier avec la même configuration avant de faire le diff. Cela normalise l'indentation, la longueur des lignes et les espaces en une seule étape. Une fois que les deux fichiers partagent le même style de formatage, un diff texte brut ne signale que les vrais changements de contenu.
Ordre des attributs
La spécification HTML n'exige pas que les attributs apparaissent dans
un ordre particulier.
<div id="main" class="container"> et
<div class="container" id="main"> sont le même
élément. Mais un diff de lignes les traite comme des lignes différentes.
C'est particulièrement courant lorsque les templates sont générés par
différents outils ou lorsqu'un auto-formateur trie les attributs par
ordre alphabétique.
Selon la spécification d'analyse de WHATWG, les attributs sur le même élément sont non ordonnés par définition. Un diff qui signale un réordonnancement d'attributs comme un changement est techniquement correct mais rarement utile. Normalisez l'ordre des attributs dans les deux fichiers avant de comparer si cela crée du bruit.
Entités HTML
&, <, >,
, les références numériques comme —
— ce sont toutes des façons d'encoder des caractères dans le code source
HTML. Deux fichiers peuvent encoder le même caractère différemment et
afficher la même page. Un diff texte voit & et
& comme des chaînes différentes, même si les deux
produisent une esperluette dans le navigateur.
Si les différences d'entités encombrent votre diff, passez les deux
fichiers par un analyseur HTML qui normalise les entités avant de
comparer. La propre
API DOMParser du navigateur
est un moyen fiable de le faire en JavaScript : analysez les deux
chaînes, sérialisez-les avec innerHTML et comparez le
résultat.
Éléments vides
En HTML5, les éléments vides (éléments sans enfants) n'ont pas besoin
d'une barre de fermeture. <br>,
<br/> et <br /> sont tous valides
et tous analysés de manière identique. Il en va de même pour
<img>, <input>,
<meta> et les autres. Si un fichier utilise des barres
de fermeture automatique de style XHTML et l'autre la syntaxe HTML5
simple, un diff texte signalera chacun de ces éléments.
La liste complète des
éléments vides sur MDN
couvre les 14. Une recherche rapide de /> dans votre
résultat de diff vous indiquera quelle part du bruit provient de la
syntaxe de fermeture automatique.
Un exemple concret
Voici un avant-après réaliste pour l'en-tête d'un site. Trois choses ont changé : une classe CSS a été ajoutée à l'en-tête, la cible du lien d'accueil a été corrigée et un lien de contact a été ajouté.
<!-- Version 1 -->
<header class="site-header">
<nav>
<a href="/home" class="nav-link active">Home</a>
<a href="/about" class="nav-link">About</a>
</nav>
</header>
<!-- Version 2 -->
<header class="site-header sticky-top">
<nav>
<a href="/" class="nav-link active">Home</a>
<a href="/about" class="nav-link">About</a>
<a href="/contact" class="nav-link">Contact</a>
</nav>
</header>
Collez les deux dans l'outil de comparaison HTML et le diff met en évidence exactement ces trois lignes : l'attribut de classe de l'en-tête, le href d'accueil et la nouvelle balise d'ancre. Pas de bruit, car l'indentation et le formatage sont cohérents entre les deux versions.
| Élément | Version 1 | Version 2 | Type de changement |
|---|---|---|---|
<header> |
class="site-header" |
class="site-header sticky-top" |
Classe ajoutée |
| Lien d'accueil | href="/home" |
href="/" |
Chemin corrigé |
| Lien de contact | Absent | <a href="/contact">Contact</a> |
Ajouté |
Quand normaliser avant de comparer
Toute comparaison HTML ne nécessite pas de normalisation. Si vous comparez deux fichiers que vous avez écrits vous-même avec les mêmes paramètres d'éditeur, un diff texte brut suffit généralement. La normalisation est utile quand :
- Un fichier provient d'un export CMS et l'autre de votre éditeur
- Un outil de build a reformaté un fichier mais pas l'autre
- Vous comparez du HTML minifié avec du HTML formaté
- Vous révisez un modèle d'e-mail HTML d'un expéditeur externe
Le Service de validation du balisage W3C est utile pour vérifier que les deux fichiers s'analysent correctement avant de les comparer. Un fichier avec une structure de balises cassée produira un diff trompeur car l'analyseur récupère les erreurs à sa façon, et deux analyseurs peuvent récupérer différemment.
Comparer du HTML généré
Les frameworks de rendu côté serveur (Angular, Next.js, Rails) intègrent souvent des horodatages, des nonces ou des identifiants aléatoires dans la sortie HTML. Deux rendus de la même page produiront des différences sur ces lignes même si le contenu est identique. Si vous comparez du HTML généré, supprimez ou normalisez ces champs avant de faire le diff.
Le moteur de diff sous-jacent de ce site est diff-match-patch de Google (Apache 2.0), qui fonctionne sur du texte brut. Il n'analyse pas le HTML, donc il signalera les différences de formatage en plus des différences de contenu. C'est pourquoi normaliser d'abord est important. Pour la plupart des usages, coller les deux fichiers directement donne un résultat suffisamment utile en quelques secondes. Notre outil de comparaison XML vaut aussi la peine d'être essayé si votre HTML est du XHTML bien formé, car le diff XML gère correctement les espaces de noms et l'ordre des attributs.
Questions fréquentes
- Pourquoi mon diff HTML affiche-t-il des centaines de changements quand je n'ai modifié qu'une seule ligne ?
- C'est presque toujours un changement de formatage. Si votre éditeur ou un outil de build a reformaté le fichier (changé l'indentation, coupé des longues lignes ou réordonné des attributs) lors de l'enregistrement, un diff texte brut voit chaque ligne reformatée comme un changement. Passez les deux fichiers par le même formateur d'abord, puis comparez. Le vrai changement sera la seule ligne restante.
- L'ordre des attributs est-il important en HTML ?
- Pas pour le navigateur. Le Standard HTML n'exige pas que les attributs apparaissent dans un ordre spécifique, et les navigateurs les analysent correctement quelle que soit leur position. Certains linters et formateurs trient les attributs par ordre alphabétique comme règle de style, ce qui peut rendre deux fichiers sémantiquement identiques différents dans un diff texte. Si l'ordre des attributs crée du bruit, normalisez les deux fichiers avec le même formateur avant de comparer.
- Quelle est la différence entre &amp; et & dans le code source HTML ?
- Les deux produisent un caractère esperluette lorsque le navigateur affiche la page. Dans le code source HTML,
&est la forme encodée en entité et&est le caractère littéral. Techniquement,&dans les valeurs d'attributs devrait être encodé en&selon la spécification, mais les navigateurs acceptent les deux. Un diff texte les traite comme des chaînes différentes. Si l'encodage des entités crée du bruit, analysez les deux fichiers avec une bibliothèque ou le DOMParser du navigateur et sérialisez avant de comparer. - Puis-je comparer du HTML minifié avec du HTML formaté ?
- Oui, mais vous devriez d'abord formater le fichier minifié. Comparer du minifié avec du formaté produit un résultat où presque chaque ligne semble modifiée, car la minification supprime tous les espaces que le formateur avait ajoutés. Passez le fichier minifié par Prettier ou un formateur équivalent, puis comparez. Les changements significatifs seront visibles sans le bruit des espaces.
- Comment comparer seulement une partie d'un fichier HTML, comme un composant spécifique ?
- Extrayez la section pertinente des deux fichiers et collez seulement celle-ci dans l'outil de diff. Par exemple, si vous révisez des modifications d'un composant de navigation, copiez seulement le bloc
<nav>de chaque fichier. Comparer le document entier quand vous ne vous intéressez qu'à une section ajoute du bruit venant de parties non liées de la page. - Les commentaires HTML apparaissent-ils dans un diff ?
- Oui. Un diff basé sur le texte inclut tout ce qui se trouve dans le fichier, y compris les commentaires. Si une version a un bloc de commentaires que l'autre a supprimé, ou si un développeur a mis à jour un commentaire, le diff le montrera. C'est généralement utile : un commentaire supprimé signale souvent un nettoyage intentionnel. Si vous voulez ignorer les commentaires, supprimez-les des deux fichiers avant de comparer.
Prêt à comparer vos fichiers HTML ? Collez les deux dans l'outil de comparaison HTML gratuit et voyez les différences mises en évidence côte à côte, sans compte requis.