İki HTML Dosyası Arasındaki Farkları Nasıl Bulursunuz
İki HTML dosyası tarayıcıda aynı şekilde görüntülenebilir ancak kaynakta onlarca yerde farklı olabilir. Etiketler etrafındaki boşluklar, özniteliklerin sırası, HTML varlıkları ve kendi kendini kapatan sözdizimi en yaygın sorun kaynaklarıdır. Düz metin diff'i bunların hepsini değişiklik olarak işaretler ve gerçekten önemli olanları gizler. Bu rehber temiz bir sonuç almanızı sağlar.
Doğrudan araca geçmek istiyorsanız, HTML karşılaştırma sayfamız iki dosyayı yapıştırmanıza ve diff'i tarayıcınızda görmenize olanak tanır, kurulum gerekmez. Bu makalenin geri kalanı, çıktıyı aldıktan sonra nelere bakmanız gerektiğini açıklar.
HTML diff'leri neden bu kadar çok gürültü üretir
HTML satır yönelimli bir format değildir. Bir paragraf tek uzun bir satır olabilir ya da on satıra yayılabilir; her ikisi de geçerlidir. Çoğu editör, kod biçimlendirici ve CMS, dosyayı kaydederken HTML'yi yeniden biçimlendirir; bu da tek bir kelime değişikliğinin onlarca yeniden biçimlendirilmiş satıra yol açabileceği anlamına gelir. Diff bunları değişmiş satırlar olarak görür, "bir kelime değişti" olarak değil.
WHATWG HTML Living Standard, tarayıcıların HTML'yi nasıl ayrıştıracağını belirtir, ancak metnin nasıl serileştirileceğini söylemez. İki araç, ham metin olarak hiç birbirine benzemeyen ama yapısal olarak özdeş HTML üretebilir.
Gürültünün büyük bölümünden dört şey sorumludur:
- Boşluklar etiketler arasında ve içinde
- Öznitelik sırası (tarayıcılar belirli bir sıra gerektirmez)
- HTML varlıkları ile gerçek karakterler arasındaki fark
- Void öğe sözdizimi (
<br>ile<br />)
Boşluklar: en büyük yanlış pozitif kaynağı
Çoğu bağlamda HTML'deki art arda gelen boşluklar, tarayıcı tarafından görüntülenirken tek bir boşluğa indirgenir. Bu, aşağıdaki iki parçanın aynı şekilde görüntüleneceği anlamına gelir:
<!-- Version 1 -->
<p>Free text comparison tool.</p>
<!-- Version 2 -->
<p>
Free text comparison tool.
</p>
Düz metin diff'i her iki satırı da değişmiş olarak işaretler. Ancak bunlar anlamlı bir şekilde değişmemiştir. Karşılaştırmadan önce, kullanım durumunuz için boşluğun önemli olup olmadığına karar verin. E-posta şablonları veya PDF oluşturucular için bazen önemlidir. Çoğu web sayfası için önemli değildir.
En iyi çözüm, karşılaştırmadan önce her iki dosyayı da aynı yapılandırmayla Prettier gibi bir biçimlendiriciden geçirmektir. Bu, girintileri, satır uzunluğunu ve boşlukları tek adımda normalleştirir. Her iki dosya da aynı biçimlendirme stilini paylaştığında, düz metin diff'i yalnızca gerçek içerik değişikliklerini işaretler.
Öznitelik sırası
HTML spec'i, özniteliklerin belirli bir sırada görünmesini gerektirmez.
<div id="main" class="container"> ile
<div class="container" id="main"> aynı öğedir.
Ancak satır diff'i bunları farklı satırlar olarak ele alır. Bu durum
özellikle şablonlar farklı araçlar tarafından oluşturulduğunda veya
birisi öznitelikleri alfabetik olarak sıralayan bir otomatik biçimlendirici
çalıştırdığında ortaya çıkar.
WHATWG ayrıştırma spec'ine göre, aynı öğedeki öznitelikler tanım gereği sırasızdır. Öznitelik yeniden sıralamayı değişiklik olarak bildiren bir diff teknik olarak doğrudur ancak nadiren yararlıdır. Bu gürültüye yol açıyorsa, karşılaştırmadan önce her iki dosyada da öznitelik sırasını normalleştirin.
HTML varlıkları
&, <, >,
, — gibi sayısal referanslar
— bunlar HTML kaynağındaki karakterleri kodlamanın yollarıdır. İki dosya
aynı karakteri farklı şekilde kodlayabilir ve yine de aynı sayfayı
görüntüleyebilir. Metin diff'i, her ikisi de tarayıcıda ve işareti
üretmesine rağmen & ile &'yi
farklı dizeler olarak görür.
Varlık farklılıkları diff'inizi kirletiyorsa, karşılaştırmadan önce her
iki dosyayı da varlıkları normalleştiren bir HTML ayrıştırıcısından geçirin.
Tarayıcının kendi
DOMParser API'si
bunu JavaScript'te yapmanın güvenilir bir yoludur: her iki dizgiyi ayrıştırın,
innerHTML ile geri serileştirin ve sonucu karşılaştırın.
Void öğeler
HTML5'te, void öğelerin (alt öğesi olmayan öğeler) kapanış eğik çizgisine
ihtiyacı yoktur. <br>, <br/> ve
<br /> hepsi geçerlidir ve aynı şekilde ayrıştırılır.
Aynı durum <img>, <input>,
<meta> ve diğerleri için de geçerlidir. Bir dosya
XHTML stili kendi kendini kapatan eğik çizgiler kullanıyor, diğeri düz
HTML5 sözdizimi kullanıyorsa, metin diff'i bu öğelerin her birini işaretler.
MDN'deki void öğelerin
tam listesi 14'ünü kapsar. Diff çıktınızda /> için hızlı
bir arama, gürültünün ne kadarının kendi kendini kapatan sözdiziminden
kaynaklandığını gösterir.
Gerçek bir örnek
Site başlığı için gerçekçi bir önce-sonra örneği. Üç şey değişti: başlığa bir CSS sınıfı eklendi, Ana Sayfa bağlantısı hedefi düzeltildi ve bir İletişim bağlantısı eklendi.
<!-- 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>
Her ikisini de HTML karşılaştırma aracına yapıştırın; diff tam olarak o üç satırı vurgular: başlık sınıfı özniteliği, Ana Sayfa href'i ve yeni bağlantı etiketi. Gürültü yok, çünkü iki sürüm arasında girinti ve biçimlendirme tutarlı.
| Öğe | Sürüm 1 | Sürüm 2 | Değişiklik türü |
|---|---|---|---|
<header> |
class="site-header" |
class="site-header sticky-top" |
Sınıf eklendi |
| Ana Sayfa bağlantısı | href="/home" |
href="/" |
Yol düzeltildi |
| İletişim bağlantısı | Mevcut değil | <a href="/contact">Contact</a> |
Eklendi |
Karşılaştırmadan önce ne zaman normalleştirme yapmalı
Her HTML karşılaştırması normalleştirme gerektirmez. Aynı editör ayarlarıyla kendiniz yazdığınız iki dosyayı karşılaştırıyorsanız, düz metin diff'i genellikle yeterlidir. Normalleştirme şu durumlarda faydalıdır:
- Bir dosya CMS dışa aktarımından, diğeri editörünüzden geliyorsa
- Bir derleme aracı bir dosyayı yeniden biçimlendirdiyse ama diğerini biçimlendirmediyse
- Küçültülmüş HTML'yi güzel biçimlendirilmiş HTML ile karşılaştırıyorsanız
- Harici bir göndericiden gelen HTML e-posta şablonunu inceliyorsanız
W3C Biçimlendirme Doğrulama Hizmeti, karşılaştırmadan önce her iki dosyanın da doğru şekilde ayrıştırıldığını kontrol etmek için kullanışlıdır. Bozuk etiket yapısına sahip bir dosya yanıltıcı bir diff üretir, çünkü ayrıştırıcı hataları kendine özgü bir şekilde telafi eder ve iki ayrıştırıcı farklı şekillerde telafi edebilir.
Oluşturulan HTML'yi karşılaştırma
Sunucu tarafında işleme yapan çerçeveler (Angular, Next.js, Rails) genellikle HTML çıktısına zaman damgaları, nonce'lar veya rastgele tanımlayıcılar yerleştirir. Aynı sayfanın iki ayrı oluşturması, içerik özdeş olsa bile bu satırlarda farklı diff'ler üretir. Oluşturulan HTML'yi karşılaştırıyorsanız, diff'lemeden önce bu alanları kaldırın veya normalleştirin.
Bu sitedeki temel diff motoru, ham metin üzerinde çalışan Google'ın diff-match-patch motorudur (Apache 2.0). HTML ayrıştırmaz, bu nedenle içerik değişikliklerinin yanı sıra biçimlendirme farklarını da işaretler. Bu yüzden önce normalleştirme önemlidir. Bununla birlikte, çoğu amaç için iki dosyayı doğrudan yapıştırmak birkaç saniye içinde yeterince kullanışlı bir sonuç verir. HTML'niz iyi biçimlendirilmiş XHTML ise, XML karşılaştırma aracımız da denemeye değer; XML'e duyarlı diff, ad alanlarını ve öznitelik sırasını doğru şekilde ele alır.
Sıkça sorulan sorular
- HTML diff'im yalnızca bir satırı değiştirdiğimde neden yüzlerce değişiklik gösteriyor?
- Neredeyse her zaman bir biçimlendirme değişikliğidir. Editörünüz veya bir derleme aracı dosyayı kaydederken yeniden biçimlendirdiyse (girinti değiştirdi, uzun satırları sardı veya öznitelikleri yeniden sıraladı), düz metin diff'i yeniden biçimlendirilen her satırı değişiklik olarak görür. Her iki dosyayı önce aynı biçimlendiriciden geçirin, ardından karşılaştırın. Gerçek değişiklik kalan tek satır olacaktır.
- HTML'de öznitelik sırası önemli midir?
- Tarayıcı için değil. HTML Living Standard, özniteliklerin belirli bir sırada görünmesini gerektirmez ve tarayıcılar bunları sıradan bağımsız olarak doğru şekilde ayrıştırır. Bazı lint araçları ve biçimlendiriciler, stil kuralı olarak öznitelikleri alfabetik olarak sıralar; bu durum, anlamsal olarak özdeş iki dosyanın metin diff'inde farklı görünmesine neden olabilir. Öznitelik sırası gürültüye yol açıyorsa, karşılaştırmadan önce her iki dosyayı da aynı biçimlendiricilerle normalleştirin.
- HTML kaynağında &amp; ile & arasındaki fark nedir?
- Her ikisi de tarayıcı sayfayı görüntülediğinde bir ve işareti karakteri üretir. HTML kaynağında,
&varlık kodlu biçim ve&gerçek karakterdir. Teknik olarak öznitelik değerlerindeki&, spec'e göre&olarak kodlanmalıdır, ancak tarayıcılar her ikisini de kabul eder. Metin diff'i bunları farklı dizeler olarak ele alır. Varlık kodlaması gürültüye yol açıyorsa, karşılaştırmadan önce her iki dosyayı bir kütüphane veya tarayıcının DOMParser'ı ile ayrıştırın ve geri serileştirin. - Küçültülmüş HTML'yi güzel biçimlendirilmiş HTML ile karşılaştırabilir miyim?
- Evet, ancak önce küçültülmüş dosyayı güzel biçimlendirmelisiniz. Küçültülmüş ile güzel biçimlendirilmiş arasında diff almak, neredeyse her satırın değişmiş göründüğü bir sonuç üretir; çünkü küçültme, biçimlendiricinin eklediği tüm boşlukları kaldırır. Küçültülmüş dosyayı Prettier veya eşdeğer bir biçimlendiriciden geçirin, ardından karşılaştırın. Anlamlı değişiklikler boşluk gürültüsü olmadan görünür olacaktır.
- Belirli bir bileşen gibi bir HTML dosyasının yalnızca bir bölümünü nasıl karşılaştırabilirim?
- İlgili bölümü her iki dosyadan da çıkarın ve yalnızca bunu diff aracına yapıştırın. Örneğin, bir gezinme bileşenindeki değişiklikleri inceliyorsanız, her dosyadan yalnızca
<nav>bloğunu kopyalayın. Yalnızca bir bölümle ilgilenirken tüm belgeyi karşılaştırmak, sayfanın ilgisiz bölümlerinden gürültü ekler. - HTML yorumları diff'te görünür mü?
- Evet. Metin tabanlı bir diff, yorumlar dahil dosyadaki her şeyi içerir. Bir sürümde diğerinin kaldırdığı bir yorum bloğu varsa veya bir geliştirici bir yorumu güncellediyse, diff bunu gösterir. Bu genellikle yararlıdır: kaldırılan bir yorum çoğunlukla kasıtlı bir temizliğe işaret eder. Yorumları yok saymak istiyorsanız, karşılaştırmadan önce her iki dosyadan da kaldırın.
HTML dosyalarınızı karşılaştırmaya hazır mısınız? Her ikisini de ücretsiz HTML karşılaştırma aracına yapıştırın ve farklılıkları yan yana vurgulanmış olarak görün, hesap gerekmez.