Cómo detectar diferencias entre dos archivos HTML
Dos archivos HTML pueden renderizarse de forma idéntica en un navegador y aun así diferir en decenas de lugares en el código fuente. Los espacios en blanco alrededor de las etiquetas, el orden de los atributos, las entidades HTML y la sintaxis de autocierre son los culpables habituales. Un diff de texto plano marca cada uno de ellos como un cambio, lo que oculta lo que realmente te importa. Esta guía te muestra cómo obtener un resultado limpio.
Si quieres ir directamente a la herramienta, nuestra página de comparación HTML te permite pegar dos archivos y ver el diff en tu navegador, sin necesidad de instalación. El resto del artículo explica qué buscar una vez que tienes el resultado.
Por qué los diffs de HTML producen tanto ruido
HTML no es un formato orientado a líneas. Un párrafo puede estar en una sola línea larga o distribuido en diez líneas, y ambos son válidos. La mayoría de los editores, formateadores de código y CMS reformatean el HTML al guardarlo, lo que significa que un solo cambio de palabra puede propagarse en decenas de líneas reformateadas. El diff las ve como líneas modificadas, no como "una sola palabra cambiada."
El Estándar de vida HTML de WHATWG especifica cómo los navegadores analizan HTML, pero no dice cómo debe serializarse de vuelta a texto. Dos herramientas pueden producir HTML estructuralmente idéntico que no se parece en nada como texto sin formato.
Cuatro cosas explican la mayor parte del ruido:
- Espacios en blanco entre y dentro de las etiquetas
- Orden de atributos (los navegadores no requieren un orden específico)
- Entidades HTML frente a caracteres literales
- Sintaxis de elementos vacíos (
<br>frente a<br />)
Espacios en blanco: la mayor fuente de falsos positivos
En la mayoría de los contextos, los espacios en blanco consecutivos en HTML se colapsan a un solo espacio cuando el navegador lo renderiza. Eso significa que estos dos fragmentos se muestran de forma idéntica:
<!-- Version 1 -->
<p>Free text comparison tool.</p>
<!-- Version 2 -->
<p>
Free text comparison tool.
</p>
Un diff de texto plano marca ambas líneas como modificadas. No han cambiado en ningún sentido significativo. Antes de comparar, decide si los espacios en blanco importan para tu caso de uso. Para plantillas de correo electrónico o renderizadores de PDF, a veces sí importan. Para la mayoría de las páginas web, no.
La mejor solución es pasar ambos archivos por un formateador como Prettier con la misma configuración antes de hacer el diff. Eso normaliza la sangría, la longitud de línea y el espaciado en un solo paso. Una vez que ambos archivos comparten el mismo estilo de formato, un diff de texto plano solo marca cambios de contenido genuinos.
Orden de atributos
La especificación HTML no requiere que los atributos aparezcan en ningún
orden particular.
<div id="main" class="container"> y
<div class="container" id="main"> son el mismo
elemento. Pero un diff de líneas los trata como líneas diferentes. Esto
es especialmente común cuando las plantillas son generadas por diferentes
herramientas o cuando alguien ejecuta un autoformateador que ordena los
atributos alfabéticamente.
Según la especificación de análisis de WHATWG, los atributos en el mismo elemento no tienen orden definido por definición. Un diff que reporta un reordenamiento de atributos como un cambio es técnicamente correcto pero raramente útil. Normaliza el orden de atributos en ambos archivos antes de comparar si esto está generando ruido.
Entidades HTML
&, <, >,
, referencias numéricas como —
— estas son formas de codificar caracteres en el código fuente HTML. Dos
archivos pueden codificar el mismo carácter de manera diferente y
renderizar la misma página. Un diff de texto ve &
y & como cadenas diferentes, aunque ambas produzcan un
ampersand en el navegador.
Si las diferencias de entidades están saturando tu diff, pasa ambos
archivos por un analizador HTML que normalice las entidades antes de
comparar. La propia
API DOMParser del navegador
es una forma fiable de hacerlo en JavaScript: analiza ambas cadenas,
serialízalas de nuevo con innerHTML y compara el resultado.
Elementos vacíos
En HTML5, los elementos vacíos (elementos sin hijos) no necesitan una
barra de cierre. <br>, <br/> y
<br /> son todos válidos y todos se analizan de forma
idéntica. Lo mismo ocurre con <img>,
<input>, <meta> y el resto. Si un
archivo usa barras de autocierre estilo XHTML y el otro usa la sintaxis
HTML5 simple, un diff de texto marcará cada uno de esos elementos.
La lista completa de
elementos vacíos en MDN
cubre los 14. Una búsqueda rápida de /> en el resultado
del diff te dirá cuánto del ruido es sintaxis de autocierre.
Un ejemplo práctico
Aquí hay un antes y después realista para la cabecera de un sitio. Tres cosas cambiaron: se añadió una clase CSS a la cabecera, se corrigió el destino del enlace de inicio y se añadió un enlace de contacto.
<!-- 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>
Pega ambos en la herramienta de comparación HTML y el diff resalta exactamente esas tres líneas: el atributo de clase de la cabecera, el href de inicio y la nueva etiqueta de anclaje. Sin ruido, porque la sangría y el formato son consistentes entre las dos versiones.
| Elemento | Versión 1 | Versión 2 | Tipo de cambio |
|---|---|---|---|
<header> |
class="site-header" |
class="site-header sticky-top" |
Clase añadida |
| Enlace de inicio | href="/home" |
href="/" |
Ruta corregida |
| Enlace de contacto | No presente | <a href="/contact">Contact</a> |
Añadido |
Cuándo normalizar antes de comparar
No toda comparación de HTML necesita normalización. Si estás comparando dos archivos que escribiste tú mismo con la misma configuración del editor, un diff de texto plano suele ser suficiente. La normalización vale la pena cuando:
- Un archivo proviene de una exportación de CMS y el otro de tu editor
- Una herramienta de compilación reformateó un archivo pero no el otro
- Estás comparando HTML minificado con HTML con formato
- Estás revisando una plantilla de correo electrónico HTML de un remitente externo
El Servicio de validación de marcado W3C es útil para verificar que ambos archivos se analizan correctamente antes de compararlos. Un archivo con una estructura de etiquetas rota producirá un diff engañoso porque el analizador se recupera de los errores a su manera, y dos analizadores pueden recuperarse de forma diferente.
Comparar HTML generado
Los frameworks de renderizado en servidor (Angular, Next.js, Rails) a menudo incorporan marcas de tiempo, nonces o identificadores aleatorios en la salida HTML. Dos renderizados de la misma página producirán diferencias en esas líneas aunque el contenido sea idéntico. Si estás comparando HTML generado, elimina o normaliza esos campos antes de hacer el diff.
El motor de diff subyacente en este sitio es diff-match-patch de Google (Apache 2.0), que trabaja sobre texto sin formato. No analiza HTML, por lo que marcará las diferencias de formato junto con las diferencias de contenido. Por eso importa normalizar primero. Para la mayoría de los propósitos, pegar los dos archivos directamente da un resultado suficientemente útil en unos pocos segundos. Nuestra herramienta de comparación XML también vale la pena probarla si tu HTML es XHTML bien formado, ya que el diff con soporte XML maneja correctamente los espacios de nombres y el orden de atributos.
Preguntas frecuentes
- ¿Por qué mi diff de HTML muestra cientos de cambios cuando solo modifiqué una línea?
- Casi siempre es un cambio de formato. Si tu editor o una herramienta de compilación reformateó el archivo (cambió la sangría, ajustó líneas largas o reordenó atributos) al guardar, un diff de texto plano ve cada línea reformateada como un cambio. Pasa ambos archivos por el mismo formateador primero, luego compara. El cambio real será la única línea que quede.
- ¿Importa el orden de los atributos en HTML?
- No para el navegador. El Estándar de vida HTML no requiere que los atributos aparezcan en ningún orden específico, y los navegadores los analizan correctamente independientemente. Algunos linters y formateadores ordenan los atributos alfabéticamente como regla de estilo, lo que puede hacer que dos archivos semánticamente idénticos se vean diferentes en un diff de texto. Si el orden de atributos genera ruido, normaliza ambos archivos con el mismo formateador antes de comparar.
- ¿Cuál es la diferencia entre &amp; y & en el código fuente HTML?
- Ambos producen un carácter ampersand cuando el navegador renderiza la página. En el código fuente HTML,
&es la forma codificada como entidad y&es el carácter literal. Técnicamente,&en valores de atributos debería codificarse como&según la especificación, pero los navegadores aceptan ambos. Un diff de texto los trata como cadenas diferentes. Si la codificación de entidades crea ruido, analiza ambos archivos con una biblioteca o el DOMParser del navegador y serializa de vuelta antes de comparar. - ¿Puedo comparar HTML minificado con HTML con formato?
- Sí, pero deberías formatear primero el archivo minificado. Comparar minificado con formateado produce un resultado donde casi cada línea parece modificada, porque la minificación elimina todos los espacios en blanco que el formateador añadió. Pasa el archivo minificado por Prettier o un formateador equivalente, luego compara. Los cambios significativos serán visibles sin el ruido de los espacios en blanco.
- ¿Cómo comparo solo una parte de un archivo HTML, como un componente específico?
- Extrae la sección relevante de ambos archivos y pega solo esa en la herramienta de diff. Por ejemplo, si estás revisando cambios en un componente de navegación, copia solo el bloque
<nav>de cada archivo. Comparar el documento completo cuando solo te importa una sección añade ruido de partes no relacionadas de la página. - ¿Los comentarios HTML aparecen en un diff?
- Sí. Un diff basado en texto incluye todo lo que hay en el archivo, incluidos los comentarios. Si una versión tiene un bloque de comentarios que la otra eliminó, o si un desarrollador actualizó un comentario, el diff lo mostrará. Eso suele ser útil: un comentario eliminado a menudo indica una limpieza intencionada. Si quieres ignorar los comentarios, elimínalos de ambos archivos antes de comparar.
¿Listo para comparar tus archivos HTML? Pégalos en la herramienta gratuita de comparación HTML y ve las diferencias resaltadas una al lado de la otra, sin necesidad de cuenta.