ドキュメントサイトのLighthouseスコア改善:フォント最適化・アクセシビリティ修正・プロモ改善

shoelace-style/webawesome

WebAwesomeのドキュメントサイトを対象に、レンダーブロッキングフォントの解消、Lighthouse a11y監査の3項目クリア、プロモーションダイアログの不要リソース読み込み抑制を一括実施しました。これにより、ページの初期表示速度とアクセシビリティが改善されます。

背景

ドキュメントサイトのLighthouseスコアを引き下げる要因が複数存在していました。フォント読み込み・アクセシビリティ・コントラスト比・不要リソースの事前読み込みという4つの独立した問題が積み重なり、パフォーマンスとアクセシビリティの両スコアを圧迫していた状況です。

cera-typeface.css は287 KBのスタイルシートで、4つの.woff2ファイルをBase64インライン化していました。Base64エンコードはバイナリサイズを約33%増加させ、さらにスタイルシートはレンダーブロッキングリソースであるためブラウザの並列プリロードも妨げ、通常のフォントキャッシュの恩恵も受けられないという三重の問題を抱えていました。

アクセシビリティ面では、アイコンのみで構成されたボタンへのラベル付けが不十分で、Lighthouseのaria-prohibited-attrbutton-name・ナビゲーションリンクの識別名に関する監査で失敗していました。またプロモーションダイアログは、ユーザーが一度閉じた後も149 KBのポスター画像を毎回読み込んでいました。

技術的な変更

フォントの分割・サブセット化

CeraフォントをBase64インライン埋め込みから実ファイル配信に移行し、CSSサイズを287 KBから723バイトに削減しました。docs/assets/fonts/配下にcera-round-pro-400.woff2cera-round-pro-500.woff2cera-round-pro-700.woff2cera-round-pro-900.woff2の4ファイルを追加し、cera-typeface.css@font-faceブロックはファイル参照に書き換えています。すべての@font-facefont-display: swapを適用し、フォント読み込み中もテキストが表示されるようになっています。

グリフはラテン文字・句読点・通貨記号(U+0000-024F,U+2000-206F,U+20A0-20CF)にサブセット化されています。英語のドキュメントサイトでは不要なキリル文字・ギリシャ文字・ベトナム語拡張・CJK文字を除外し、emダッシュ・スマートクォート・省略記号・通貨記号は維持することで、フォントの総バイナリサイズを220 KBから103 KBに削減しています。

head.njkでは、初期表示に使用する400ウェイトのみを<link rel="preload">で優先読み込みするよう変更されました。

変更後(head.njk):

<link rel="preload" as="font" type="font/woff2" href="/assets/fonts/cera-round-pro-400.woff2" crossorigin>
{% if pageClass == 'home' %}
  <link rel="preload" as="image" type="image/svg+xml" href="/assets/images/bg-wa-pattern-light.svg" media="(prefers-color-scheme: light)">
  <link rel="preload" as="image" type="image/svg+xml" href="/assets/images/bg-wa-pattern-dark.svg" media="(prefers-color-scheme: dark)">
{% endif %}

ホームページ限定でSVG背景画像もプリロードするよう追加されており、400ウェイト以外のフォントはCSSの@font-face定義により実際に使用されたタイミングで遅延読み込みされます。

アクセシビリティの修正

Lighthouseのa11y監査で失敗していた3箇所を修正しました。各修正の対応は以下のとおりです。

  • Font Awesomeナビリンク#product-font-awesome): <a>タグにaria-label="{{ site.siblings.fontAwesome.name }}"を追加。ツールチップのfor=によるアクセシブル名はツールチップのShadow DOMがレンダーされるまで信頼できないため、明示的なラベルで解決しています。
  • カラースキームセレクターcolor-scheme-selector.njk): アイコンのみの<wa-button>内の<wa-icon>label="Select Color Scheme"を追加。
  • テーマセレクターtheme-selector.njk): 同様に<wa-icon name="brush">label="Select Theme"を追加。

<wa-button>のアイコンのみパターンでは、ホスト要素のaria-*属性とツールチップによるラベル付けがaria-prohibited-attr違反を引き起こしていたため、スロット内の<wa-icon>label属性を付与する方式に統一されています。

変更前:

<wa-icon name="sun-bright" variant="regular" class="only-light"></wa-icon>
<wa-icon name="moon-stars" variant="regular" class="only-dark"></wa-icon>

変更後:

<wa-icon name="sun-bright" variant="regular" class="only-light" label="Select Color Scheme"></wa-icon>
<wa-icon name="moon-stars" variant="regular" class="only-dark" label="Select Color Scheme"></wa-icon>

プロモーションダイアログの最適化

プロモーションダイアログのポスター画像を遅延読み込みに変更し、dismissedユーザーへの不要なリソース配信を防止しました。dialog-ba-kickstarter.njkでは2点の変更が行われています。

まず、テンプレートの条件分岐が{% if isBuildAwesomePromoActive %}から{% if isBuildAwesomePromoActive and not isBuildAwesomePromoDismissed %}に変更され、LocalStorageでdismissedと記録されたユーザーにはダイアログHTMLそのものが出力されなくなりました。次に、ポスター画像placeholder-ba-video.png(149 KB)がsrc属性からdata-src属性に変更され、Vimeo iframeと同様にinitDialog()内でのみ実際に読み込まれるようになっています。

変更前:

<img src="/assets/images/placeholder-ba-video.png" alt="" />

変更後:

<img data-src="/assets/images/placeholder-ba-video.png" alt="" />

コントラスト比の修正

utils.css内の.brand-build-awesomeスコープで--wa-color-brand-50var(--brand-build-awesome-green)#00a776)から#198560に変更されました。#00a776の白色テキストに対するコントラスト比は3.09:1でWCAGのAA基準(4.5:1)を下回っていましたが、#198560では4.59:1となり基準を満たしています。バナー・ダイアログCTAのボタン・本文リンクに適用される一方、ロゴ・ナビゲーションは視覚的ブランドカラーを維持するため引き続き--brand-build-awesome-green#00a776)を使用します。

設計判断

フォント配信の方針として、CDNではなくドキュメントサイト自身のオリジンからの配信が選択されています。CDN配信ではCORS設定やキャッシュコントロールのコントロールが難しくなる一方、自ホスト配信はHTTPキャッシュヘッダーの完全なコントロールを可能にします(1年間のキャッシュ設定は関連PRで実施予定)。Base64インラインからファイル参照への変換により、4ウェイトの並列プリロードが可能になるという副次的な利点もあります。

アクセシビリティの修正方針として、ツールチップのShadow DOM依存を避け、<wa-icon>label属性という確実な手段が採用されています。ツールチップは視覚的な補足情報として維持しつつ、スクリーンリーダー向けのアクセシブル名は独立して提供するという分離が明確です。

ポスター画像の遅延読み込みはdismissedユーザーへの効果が主目的とPR本文で明記されており、Lighthouse測定中は500msの自動オープンが依然として動作するため初回ユーザーへの影響は限定的です。PR本文では「auto-openの遅延またはサーバーサイドでのダイアログHTML出力の制御」が今後の課題として言及されており、今回の変更はその前段階の対処となっています。

まとめ

本PRは、フォント配信戦略の根本的な見直し(Base64インライン→実ファイル)、アイコンボタンのアクセシブル名付与パターンの統一、条件付きリソース読み込みの徹底という3つの独立した改善を組み合わせることで、Lighthouseのパフォーマンス・アクセシビリティ双方のスコアに寄与しています。特にフォントのサブセット化とファイル分割は、287 KBのレンダーブロッキングリソースを723バイトのCSSと103 KBのフォントファイル群に置き換えるという質的な転換であり、ブラウザキャッシュの活用も含めた持続的な改善効果が期待されます。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
81e688b8

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)、背景、技術的な変更、設計判断、まとめ(結論)の3部構成が明確に守られており、非常に理解しやすい構成です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```言語:ファイルパス)およびPRへのリンク記法が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

「レンダーブロッキング」「サブセット化」「コントラスト比」などの技術用語を前提として話が進んでおり、専門知識を持つエンジニアという対象読者に完全に適合しています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション、各パラグラフが「総論→各論」の構造で書かれており、段落の冒頭にトピックセンテンスが配置されているため、要点を素早く把握できます。1段落1トピックの原則も守られています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているすべてのコードブロック(head.njk, color-scheme-selector.njk, dialog-ba-kickstarter.njk)は、提供されたDiff情報と完全に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「Base64インライン化」「レンダーブロッキングリソース」「サブセット化」「WCAG」など、PRで言及されている技術用語が正確かつ適切な文脈で使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

フォント最適化、アクセシビリティ修正、コントラスト比の改善に関する技術的な説明は、すべてPR情報とDiffによって裏付けられており、論理的で正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(CSSのサイズ削減、フォントのバイナリサイズ削減、コントラスト比の具体的な数値など)は、PRのDescriptionで提供された情報と完全に一致しており、ハルシネーションは認められません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2420)、ファイルサイズ(287 KB→723バイト)、コントラスト比(3.09:1→4.59:1)などの数値や固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルは、元のPRのタイトル「Docs: Improve Lighthouse Score」の内容をより具体的に説明しており、主題と完全に一致しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事内の情報はすべてPRのTitle, Description, Diffに記載されている範囲内に収まっています。WCAG基準への言及はPR内のコントラスト比の数値から直接導かれる妥当な文脈補足であり、根拠のない外部知識の追加ではありません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「今後の課題」「関連PRで実施予定」といった時間表現は、PR Description内の「Future: ...」「ships in the companion ... PR」といった記述を正確に反映しており、歪曲はありません。