Come individuare le differenze tra due file HTML
Due file HTML possono essere renderizzati in modo identico in un browser e tuttavia differire in decine di punti nel codice sorgente. Gli spazi intorno ai tag, l'ordine degli attributi, le entità HTML e la sintassi di chiusura automatica sono i colpevoli più comuni. Un diff testuale semplice segnala ciascuno di essi come modifica, nascondendo cio che conta davvero. Questa guida mostra come ottenere un risultato pulito.
Se vuoi passare direttamente allo strumento, la nostra pagina di confronto HTML ti permette di incollare due file e vedere il diff nel browser, senza installazione. Il resto dell'articolo spiega cosa cercare una volta ottenuto il risultato.
Perche i diff HTML producono tanto rumore
HTML non e un formato orientato alle righe. Un paragrafo puo stare su una sola riga lunga o essere distribuito su dieci righe, entrambi validi. La maggior parte degli editor, dei formattatori di codice e dei CMS riformatta l'HTML al salvataggio, il che significa che una singola modifica di una parola puo propagarsi in decine di righe riformattate. Il diff le vede come righe modificate, non come "una parola cambiata."
Il WHATWG HTML Living Standard specifica come i browser analizzano l'HTML, ma non dice come debba essere serializzato di nuovo in testo. Due strumenti possono produrre HTML strutturalmente identico che non si assomiglia affatto come testo grezzo.
Quattro cose spiegano la maggior parte del rumore:
- Spazi tra e all'interno dei tag
- Ordine degli attributi (i browser non richiedono un ordine specifico)
- Entita HTML vs caratteri letterali
- Sintassi degli elementi vuoti (
<br>vs<br />)
Spazi: la principale fonte di falsi positivi
Nella maggior parte dei contesti, gli spazi consecutivi in HTML vengono compressi in un singolo spazio quando il browser esegue il rendering. Cio significa che questi due frammenti vengono visualizzati in modo identico:
<!-- Version 1 -->
<p>Free text comparison tool.</p>
<!-- Version 2 -->
<p>
Free text comparison tool.
</p>
Un diff testuale semplice segna entrambe le righe come modificate. Non sono cambiate in alcun senso significativo. Prima di confrontare, decidi se gli spazi contano per il tuo caso d'uso. Per i template di email o i renderer PDF, a volte si. Per la maggior parte delle pagine web, no.
La soluzione migliore e passare entrambi i file attraverso un formattatore come Prettier con la stessa configurazione prima del diff. Questo normalizza indentazione, lunghezza delle righe e spaziatura in un solo passaggio. Una volta che entrambi i file condividono lo stesso stile di formattazione, un diff testuale segnala solo le modifiche di contenuto genuine.
Ordine degli attributi
La specifica HTML non richiede che gli attributi appaiano in un ordine
particolare.
<div id="main" class="container"> e
<div class="container" id="main"> sono lo stesso
elemento. Ma un diff per righe li tratta come righe diverse. Questo e
particolarmente comune quando i template sono generati da strumenti
diversi o quando qualcuno esegue un formattatore automatico che ordina
gli attributi alfabeticamente.
Secondo la specifica di analisi di WHATWG, gli attributi sullo stesso elemento sono non ordinati per definizione. Un diff che segnala un riordinamento degli attributi come modifica e tecnicamente corretto ma raramente utile. Normalizza l'ordine degli attributi in entrambi i file prima di confrontarli se questo causa rumore.
Entita HTML
&, <, >,
, riferimenti numerici come —
— questi sono tutti modi per codificare caratteri nel codice sorgente
HTML. Due file possono codificare lo stesso carattere in modo diverso e
renderizzare la stessa pagina. Un diff testuale vede &
e & come stringhe diverse, anche se entrambe producono
una e commerciale nel browser.
Se le differenze di entita rendono il diff confuso, passa entrambi i
file attraverso un parser HTML che normalizzi le entita prima di
confrontarli. La propria
API DOMParser del browser
e un modo affidabile per farlo in JavaScript: analizza entrambe le
stringhe, serializzale di nuovo con innerHTML e confronta
il risultato.
Elementi vuoti
In HTML5, gli elementi vuoti (elementi senza figli) non necessitano di
una barra di chiusura. <br>,
<br/> e <br /> sono tutti validi
e tutti analizzati in modo identico. Lo stesso vale per
<img>, <input>,
<meta> e gli altri. Se un file usa barre di
chiusura automatica in stile XHTML e l'altro usa la sintassi HTML5
semplice, un diff testuale segnalera ognuno di questi elementi.
L'elenco completo degli
elementi vuoti su MDN
copre tutti e 14. Una rapida ricerca di /> nel risultato
del diff dira quanta parte del rumore e dovuta alla sintassi di chiusura
automatica.
Un esempio concreto
Ecco un prima e dopo realistico per l'intestazione di un sito. Tre cose sono cambiate: una classe CSS e stata aggiunta all'intestazione, la destinazione del link home e stata corretta e un link di contatto e stato aggiunto.
<!-- 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>
Incolla entrambi nello strumento di confronto HTML e il diff evidenzia esattamente quelle tre righe: l'attributo di classe dell'intestazione, l'href home e il nuovo tag ancora. Nessun rumore, perche l'indentazione e la formattazione sono coerenti tra le due versioni.
| Elemento | Versione 1 | Versione 2 | Tipo di modifica |
|---|---|---|---|
<header> |
class="site-header" |
class="site-header sticky-top" |
Classe aggiunta |
| Link home | href="/home" |
href="/" |
Percorso corretto |
| Link contatti | Non presente | <a href="/contact">Contact</a> |
Aggiunto |
Quando normalizzare prima di confrontare
Non ogni confronto HTML richiede normalizzazione. Se stai confrontando due file che hai scritto tu stesso con le stesse impostazioni dell'editor, un diff testuale semplice e di solito sufficiente. La normalizzazione conviene quando:
- Un file proviene da un'esportazione CMS e l'altro dal tuo editor
- Uno strumento di build ha riformattato un file ma non l'altro
- Stai confrontando HTML minificato con HTML formattato
- Stai esaminando un template di email HTML da un mittente esterno
Il Servizio di Validazione del Markup W3C e utile per verificare che entrambi i file siano analizzati correttamente prima di confrontarli. Un file con una struttura di tag danneggiata produrra un diff fuorviante perche il parser si riprende dagli errori a modo suo e due parser potrebbero recuperare in modo diverso.
Confrontare HTML generato
I framework con rendering lato server (Angular, Next.js, Rails) spesso incorporano timestamp, nonce o identificatori casuali nell'output HTML. Due rendering della stessa pagina produrranno diff diversi su quelle righe anche se il contenuto e identico. Se stai confrontando HTML generato, rimuovi o normalizza quei campi prima del diff.
Il motore di diff sottostante di questo sito e diff-match-patch di Google (Apache 2.0), che lavora su testo grezzo. Non analizza HTML, quindi segnalera le differenze di formattazione insieme alle differenze di contenuto. Ecco perche normalizzare prima e importante. Per la maggior parte degli scopi, pero, incollare direttamente i due file da un risultato sufficientemente utile in pochi secondi. Il nostro strumento di confronto XML vale la pena provarlo se il tuo HTML e XHTML ben formato, poiche il diff XML-aware gestisce correttamente i namespace e l'ordine degli attributi.
Domande frequenti
- Perche il mio diff HTML mostra centinaia di modifiche quando ho cambiato solo una riga?
- Quasi sempre si tratta di una modifica di formattazione. Se il tuo editor o uno strumento di build ha riformattato il file (cambiato l'indentazione, spezzato le righe lunghe o riordinato gli attributi) al momento del salvataggio, un diff testuale semplice vede ogni riga riformattata come una modifica. Passa entrambi i file attraverso lo stesso formattatore prima, poi confronta. La modifica reale sara l'unica riga rimasta.
- L'ordine degli attributi e importante in HTML?
- Non per il browser. Il HTML Living Standard non richiede che gli attributi appaiano in un ordine specifico, e i browser li analizzano correttamente indipendentemente dall'ordine. Alcuni linter e formattatori ordinano gli attributi alfabeticamente come regola di stile, il che puo far sembrare diversi in un diff testuale due file semanticamente identici. Se l'ordine degli attributi causa rumore, normalizza entrambi i file con lo stesso formattatore prima di confrontarli.
- Qual e la differenza tra &amp; e & nel codice sorgente HTML?
- Entrambi producono un carattere e commerciale quando il browser renderizza la pagina. Nel codice sorgente HTML,
&e la forma codificata come entita e&e il carattere letterale. Tecnicamente,&nei valori degli attributi dovrebbe essere codificato come&secondo la specifica, ma i browser accettano entrambi. Un diff testuale li tratta come stringhe diverse. Se la codifica delle entita crea rumore, analizza entrambi i file con una libreria o il DOMParser del browser e serializza prima di confrontare. - Posso confrontare HTML minificato con HTML formattato?
- Si, ma dovresti prima formattare il file minificato. Confrontare minificato con formattato produce un risultato in cui quasi ogni riga sembra modificata, perche la minificazione rimuove tutti gli spazi che il formattatore aveva aggiunto. Passa il file minificato attraverso Prettier o un formattatore equivalente, poi confronta. Le modifiche significative saranno visibili senza il rumore degli spazi.
- Come faccio a confrontare solo una parte di un file HTML, come un componente specifico?
- Estrai la sezione rilevante da entrambi i file e incolla solo quella nello strumento di diff. Ad esempio, se stai esaminando le modifiche a un componente di navigazione, copia solo il blocco
<nav>da ciascun file. Confrontare l'intero documento quando ti interessa solo una sezione aggiunge rumore da parti non correlate della pagina. - I commenti HTML appaiono in un diff?
- Si. Un diff basato su testo include tutto cio che si trova nel file, compresi i commenti. Se una versione ha un blocco di commenti che l'altra ha rimosso, o se uno sviluppatore ha aggiornato un commento, il diff lo mostrera. Di solito e utile: un commento rimosso spesso segnala una pulizia intenzionale. Se vuoi ignorare i commenti, rimuovili da entrambi i file prima di confrontarli.
Pronto a confrontare i tuoi file HTML? Incollali entrambi nello strumento gratuito di confronto HTML e vedi le differenze evidenziate fianco a fianco, senza account necessario.