HTMLファイルの比較とマークアップ変更の検出
2つのHTMLドキュメントを比較して、タグ、属性、コンテンツ、構造の変更を特定します。プレーンテキスト比較を超える意味のあるHTML Diffの手法を学びます。
Code Diff
詳細な説明
HTML Diff比較
HTMLファイルの比較は、同じレンダリング出力が異なるマークアップで表現できるため困難です。空白の違い、属性の順序、自己閉じタグのスタイルはすべて、視覚的に意味のないテキストDiffを生成する可能性があります。
HTML DiffのChallenge
<!-- バージョンA -->
<img src="logo.png" alt="Logo" class="header-img" />
<!-- バージョンB -->
<img class="header-img" src="logo.png" alt="Logo">
これら2行は機能的に同一ですが、プレーンテキストDiffは完全に異なるとマークします。スマートなHTML Diffは比較前にマークアップを正規化する必要があります。
正規化戦略
Diff実行前に両方のHTML入力を正規化します:
- 一貫したフォーマット — 同じインデントと改行を適用
- 属性のソート — 属性をアルファベット順に並べる
- 引用符の正規化 — すべての属性値をダブルクォートに変換
- 自己閉じタグの正規化 — 1つのスタイル(
<br>または<br />)を選択 - 空白のトリム — タグ内の余分なスペースを削除
HTMLの変更タイプ
| 変更タイプ | 例 |
|---|---|
| タグ追加 | 新しい<section>ブロックが挿入 |
| タグ削除 | <div class="deprecated">が削除 |
| 属性変更 | class="old" → class="new" |
| 属性追加 | data-testid="btn"が追加 |
| コンテンツ変更 | 内部テキストが変更 |
| 構造変更 | 要素が別の親に移動 |
レンダリング出力の比較
テンプレートやコンポーネントの変更では、ソースではなくレンダリングされたHTML出力を比較したい場合があります。
セマンティックDiffとテキストDiff
セマンティックなHTML DiffはDOMツリーを理解します:
- 移動された要素は「削除+追加」ではなく「移動」として表示
- 属性のみの変更はコンテンツの変更と分離
- 空白のみの差分はフィルタリング可能
ベストプラクティス
- Diff前に必ず両方のHTMLファイルをフォーマット/整形する
- HTML構造を理解するDiffツールを使用する
- 空白ではなく、属性とコンテンツの変更に焦点を当てる
ユースケース
HTML Diffは、リファクタリング前後のコンポーネント出力を比較するフロントエンド開発者、テンプレート変更が期待通りのマークアップを生成することを検証するQAチーム、CMS生成HTMLの変更をレビューするコンテンツ編集者にとって重要です。異なるバージョン間のメールテンプレートの比較にも有用です。