実装ノウハウ 2026.06.26

Lighthouse CI は点数を上げない ― 「番人」と「改善ループ」を分けて考える

Lighthouse CI は点数を上げない ― 「番人」と「改善ループ」を分けて考える

この記事で分かること

  • Lighthouse CI の「番人(Gate)」と「改善ループ」の違い
  • render-blocking の解消・color-contrast のブランド色を壊さない修正・守備範囲の広げ方、3つの実例
  • 機械でやること・人が決めることの線引き

「Lighthouse で 90 点でました」の次に考えること

Lighthouse のスコアを出すこと自体は、ツールの使い方を覚えれば難しくはありません。問題はその後です。開発が続くにつれて、不要なライブラリが増え、色の修正が重なり、ページが追加される。気づいたら点数が下がっていた——そういうことは普通に起きます。

一度のスコアは写真、品質は動画です。

このサイト(teraone.site)では、Lighthouse のスコアを「気合い」ではなく仕組みで守るようにしました。この記事は、その仕組みを実際に組んだときの記録です。


まず誤解を解く:Lighthouse CI は点数を”上げない”

Lighthouse CI(lhci)は、測って・基準を割ったらビルドを止めるツールです。点数そのものを上げてはくれません。

// lighthouserc.json(抜粋)
"categories:accessibility": ["error", { "minScore": 0.9 }],
"categories:seo":           ["error", { "minScore": 0.9 }]

これは「90 点を下回ったら CI を赤くして、マージを止める」という守りの設定です。いわば番人(Gate)。点数を上げるのは、あくまで別の作業です。ここを混同すると「CI 入れたのにスコアが上がらない」と悩むことになります。

仕組みは、この 2 つの役割で組み立てます。

役割 何をするか 誰が動くか
番人(Gate) 基準を割ったら CI を止める 完全自動
改善ループ(Loop) 下がった原因を読んで直す 半自動(人の判断が要る所だけ人が入る)

改善ループの 4 ステップ

点数は、次のサイクルで上がります。

  1. 測る — CI 上の Chrome が全ページを実測する
  2. 読む — レポートから「どの項目が何点引いているか」を抽出する
  3. 直す — 該当箇所を修正する
  4. 再測定 — もう一度測って、上がったか確認する

抽象論ではつまらないので、このサイトで実際に回した 3 つの修正を紹介します。


実例 1:使っていない JS を消すだけで、表示の足かせが消えた

レポートを読むと、render-blocking-resources905ms ブロックしている JavaScript がありました。中身を確認すると、カルーセル用ライブラリが読み込まれているのに、サイト内で一度も使われていないことが分かりました。

→ 読み込みを丸ごと削除。905ms の描画ブロックがゼロになりました。リスクなしで一番効いた改善でした。

教訓: パフォーマンスの敵は「重い処理」より、まず“載っているのに使っていないもの”。依存関係の棚卸しを先に。


実例 2:アクセシビリティを、ブランドの色を壊さずに直す

アクセシビリティの失点は、ほぼ全ページで color-contrast(文字色のコントラスト不足)でした。WCAG の基準は 4.5:1。ボタンや、淡い背景のカテゴリチップの文字色が、この基準を下回っていました。

安易に「色を全部濃くする」とブランドの世界観が壊れます。そこで採った方針が——背景の色味はそのまま、文字色だけを”一段濃いシェード”に差し替える。しかもベタ書きしていた色を変数化して、将来の再発も防ぎました。

修正した箇所(代表例):

対象 状況 対応
プライマリボタン文字 WCAG 基準(4.5:1)を下回っていた 一段濃いシェードに変更し基準を満たすよう調整
青カテゴリチップ文字 WCAG 基準を下回っていた 濃いシェードに変更
黄カテゴリチップ文字 WCAG 基準を下回っていた 濃いシェードに変更

結果、アクセシビリティは全ページ 100 点に。見た目の印象はほぼ変えずに、です。

教訓: アクセシビリティとブランドは対立しない。「地の色」と「文字の色」を分けて考えると両立できます。


実例 3:「測れていない」は「守れていない」

最初、番人は全ページのうち 5 ページしか測っていませんでした。自動検出が主要ページを取りこぼしていたのです。取りこぼしていたのは、サービス・実績・お問い合わせ——一番見られるページでした。

→ 測定対象を明示リストに書き直し、各テンプレートを確実に測る 9 ページ体制に。

// lighthouserc.json — 明示リストに変更
"urls": [
  "http://localhost:4321/",
  "http://localhost:4321/service/",
  "http://localhost:4321/works/",
  "http://localhost:4321/blog/",
  "http://localhost:4321/contact/",
  // ... 全テンプレートを列挙
]

教訓: 品質ゲートは「何を測っていないか」を必ず確認する。測っていないページは、守られていない。


結果を「見える化」する

改善ループが回り続けるよう、CI に 2 つ足しました。

  • レポートを成果物として保存 — ダウンロードしてあとから読み返せる
  • スコア表を CI 画面に自動表示 — マージごとに全ページのスコアが一覧で見える

外部の公開ストレージには送らず、CI の中で完結させています。以後は、スコア表を眺めるだけで品質の現在地が分かります。


正直な話:機械で詰める所と、人が決める所

全部を自動化できたわけではありません。アクセシビリティを詰める最後の段階で、ブランドのカテゴリ配色をどこまで変えるかは、機械ではなく人が決めるべき判断でした。

カテゴリチップの配色は UI 上の情報コードを担っています。「コントラスト比を上げるためにブランドカラーを全部変えていいか」は、数値だけでは答えが出ません。今回は、背景色は温存して文字色のみを調整する方針を取りました。

良い品質自動化は、「全部を自動でやる」ことではなく、“機械で潰せる所”と”人が決める所”の線引きがはっきりしていること。番人とレポートが前者を引き受けるから、人は後者に集中できます。


このサイトの現在地(実測値・執筆時点)

指標 スコア
パフォーマンス 98〜100
アクセシビリティ 100(全ページ)
ベストプラクティス 96〜100
SEO 100(サンキューページのみ意図的に noindex)

数字は飾りではなく、仕組みで維持されているのがポイントです。


まとめ

  • Lighthouse CI は点数を上げない。「番人(Gate)」と「改善ループ(Loop)」を分けるのが出発点
  • 改善サイクルは 測る → 読む → 直す → 再測定 の 4 ステップ
  • パフォーマンスはまず未使用リソースの除去から。効果がいちばん大きくリスクがほぼない
  • アクセシビリティとブランドは「地の色」と「文字の色」を分ければ両立できる
  • 品質ゲートは「測っていないページ」を疑う。守れていないページは必ずある

teraone では、こうした「速くて、人にも AI にも伝わる」サイトを、ヘッドレス構成のパッケージとして提供しています。→ サービス紹介

ホームページの「困った」、聞かせてください

お見積もりは無料です。内容が固まっていなくても大丈夫。