Article

サイト表示速度高速化:Core Web Vitals改善でSEOとUXを両立

高田晃太郎
サイト表示速度高速化:Core Web Vitals改善でSEOとUXを両立

0.1秒の短縮でコンバージョンが8%向上。Deloitteの分析では、小さな速度改善が売上に直結することが示されています[1]。検索面でも、Googleは2024年にCore Web Vitals(CWV)の指標を更新し、FIDに代わってINPが正式に導入されました[2]。しきい値は明確で、LCPは2.5秒以下[3]、INPは200ms以下[4]、CLSは0.1以下[5]が「良好」です。これらは順位を左右する唯一の要因ではないものの、同等のコンテンツ同士では決定打になります[6]。CrUXやHTTP Archiveの公開データの傾向を見ると、**改善は継続的な取り組みとして設計すべき「運用課題」**であり、単発の対症療法では成果が維持できないことが読み取れます[7]。つまり、経営視点ではSEOとUXを別々に最適化するのではなく、CWVを共通KPIに据えて同時に推し進めるのが最短距離です。

Core Web VitalsがSEOと収益に効く理由

検索順位はコンテンツの関連性が主因ですが、同水準で競る場合にページエクスペリエンスが差を生みます。GoogleはCWVをランキングシグナルとして扱いつつも、過度な誇張を避けています[6]。重要なのは、シグナルの強弱よりも、ビジネスKPIに直結する点です。読み込みや操作の遅延は離脱と直結し、ファネルの上流だけでなく下流のCVRにも影響します。Deloitteのレポートでは、0.1秒の短縮で小売は平均8%のコンバージョン増、旅行では10%増という結果が示されました[1]。これは媒体や導線によって振れますが、速度改善が売上の弾性を持つ可能性を定量的に示しています。

さらに2024年からINPが導入され、初回入力に限定されていたFIDよりも実利用に近い操作遅延を測定できるようになりました[2]。スクロール停止後のタップ、検索結果のフィルタ切り替え、モーダルの開閉など、**体感品質を下げる「もっさり」**を正面から可視化します。LCPは初期表示(最大要素の描画)、INPは操作応答(次の描画までの遅延)、CLSは視覚安定性(レイアウトのズレ)という役割を持ち、三位一体でUXと収益を支えます[4]。例えば平均注文額が8,000円、月間セッションが120万、CVRが2.0%のECサイトで、INPの改善によりCVRが2.2%に伸びると仮定すると、月間売上は約1,920万円から2,112万円へと上振れし得ます。メディアに置き換えても、滞在時間やページ/セッションが広告のインプレッション密度やビューアブル率を押し上げ、RPM(収益/1000PV)の底上げが期待できます。

指標としきい値の正しい理解

LCPはビューポート内の最大要素(多くはヒーロー画像や大見出し)が描画されるまでの時間で、2.5秒以下が良好、4.0秒超は不良です[3]。INPはページ内のすべてのインタラクションから最も遅い応答を集計し、200ms以下が良好、500ms超は不良です[4]。CLSはレイアウトの積算シフトで、0.1以下が良好、0.25超は不良です[5]。Googleは原則として**p75(75パーセンタイル=訪問の75%がこの値以下)**を評価対象とするため、ラボ計測のスコアに満足しても、実ユーザーの分布がばらければ合格できません[7]。したがってRUM(Real User Monitoring=実ユーザー計測)を基盤に、CI(継続的インテグレーション)やステージングでのラボ計測を補完的に使うのが実務的です[7]。

計測戦略(RUM+ラボ)とKPI設計

実装前に計測の土台を固めます。まずCrUX APIやPageSpeed Insightsでp75の現状を把握し、参照するURLグループやテンプレート単位でのボトルネックを洗い出します[7]。次にLighthouse CIやWebPageTestを使い、ビルドや依存更新のたびに回帰を検知できるようにします。組織KPIとしては、主要テンプレートのLCP/INP/CLS p75を四半期SLO(達成基準)に設定し、リリースゲートに反映します。これにより「あとで直す」ではなく「合格しないと出せない」という健全な緊張感をプロダクトとマーケで共有できます。

実装ロードマップ:90日で合格ラインへ

効果が出る順番で取り組むことがROIを決めます。最初の30日は診断と即効策に集中し、TTFB(最初のバイト到達時間)、LCP要素、メインスレッドのブロック、視覚シフトの主因を特定して、テンプレートやアセットの粒度で対処します。次の30日は構造の刷新に踏み込み、クリティカルCSSの抽出、ルーティングと分割、CDN最適化、画像パイプラインの再設計を進めます。最後の30日は監視と回帰防止に投資し、バジェットやSLOをCIに統合します。以下に、LCP、INP、CLSそれぞれの実装論点をコードで示します。

LCP短縮の即効策

ヒーロー画像やタイトル要素がLCPになっている場合、先頭でのプリロードと優先度ヒント、サイズの明示、ブロッキングCSSの削減が効きます。TTFBが支配的であればCDNのエッジ配置やキャッシュ鍵の見直し、そしてEarly Hintsによる先行読みも有効です。まずはヒーロー画像を確実に先読みし、レンダリング優先度を最上位に引き上げます。

<!-- LCP候補の先読みと高優先度 -->
<link rel="preload" as="image" href="/images/hero.avif" imagesrcset="/images/hero.avif 1x, /images/hero@2x.avif 2x" imagesizes="(max-width: 768px) 100vw, 1200px">

<img src="/images/hero.avif"
     width="1200" height="630"
     alt="Hero"
     fetchpriority="high"
     decoding="async"
     loading="eager"
     style="content-visibility:auto; contain-intrinsic-size:1200px 630px;" />

サーバからの先行ヒントを付与すれば、ブラウザがHTMLを受け取る前に取得を開始できます。Node.jsではEarly Hintsを使ってプリロードを前倒しできます(対応環境で段階的に適用)。

// Node.js 18+ Early Hints 103の送出例
import http from 'node:http';

const server = http.createServer((req, res) => {
  if (req.url === '/') {
    // 103 Early HintsでLCP画像を先行通知
    if (res.writeEarlyHints) {
      res.writeEarlyHints({
        link: '</images/hero.avif>; rel=preload; as=image',
      });
    }
    res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
    res.end('<!doctype html>...');
  }
});
server.listen(8080);

Next.jsなどのフレームワークを使う場合は、画像コンポーネントの優先度指定と正しいサイズ記述が重要です。CDN側でAVIF/WEBPへの自動変換と適切なキャッシュも合わせて行います。

// Next.js: ヒーロー画像をLCPとして最優先に
import Image from 'next/image';

export default function Hero() {
  return (
    <Image
      src="/images/hero.avif"
      alt="Hero"
      width={1200}
      height={630}
      priority
      sizes="(max-width: 768px) 100vw, 1200px"
    />
  );
}

INP改善の定石

INPはイベントハンドラの重さ、メインスレッドの占有、再レンダリング過多が主因です。遅延読み込みやコード分割で初期負荷を減らし、操作時は軽量な処理だけを同期で実行し、重い処理は分割して遅延させます。Reactなら動的インポートと遅延コンポーネントで初期バンドルを削り、イベント内ではスケジューリングを徹底します。

// React: コード分割と遅延読み込み
import { Suspense, lazy } from 'react';

const HeavyFilterPanel = lazy(() => import('./HeavyFilterPanel'));

export default function Search() {
  return (
    <Suspense fallback={<div aria-busy="true">Loading...</div>}>
      <HeavyFilterPanel />
    </Suspense>
  );
}

インタラクション直後は応答を即時に返し、重い後処理はアイドル時間に寄せます。対応ブラウザが限られるAPIもあるため、フォールバック戦略を持ちながら安全に分割します。

// ユーザー操作の即応 + 後処理の分割
function onApplyFilters() {
  // まずはUI応答を返す(選択状態の反映など)
  updateUIState();

  // 重い集計はフレーム外へ逃がす
  if ('requestIdleCallback' in window) {
    window.requestIdleCallback(() => expensiveAggregation());
  } else {
    setTimeout(() => expensiveAggregation(), 0);
  }
}

CLSの安定化

レイアウトシフトの多くは空き領域の未確保とLate-loadが原因です。画像や広告、埋め込みは必ず寸法を確保し、フォントは事前接続とプリロードでFOITやFOUTを抑えます。CSSのaspect-ratioとfont-displayの使い分けが効果的です。

/**** 画像やカードの寸法確保 ****/
.card-media { aspect-ratio: 4 / 3; }

/**** フォントの視覚安定化 ****/
@font-face {
  font-family: 'Inter';
  src: url('/fonts/Inter.var.woff2') format('woff2');
  font-display: swap; /* CLS低減 */
}
<!-- フォントの先読みと接続 -->
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preload" as="font" type="font/woff2" href="/fonts/Inter.var.woff2" crossorigin>

配信最適化とキャッシュ戦略

アセットを最小化しても、配信が非効率ならLCPとINPは頭打ちになります。HTTP/2以降は同一接続の多重化が効くため、リクエスト数の絶対削減よりも優先度と初動の設計が重要です。圧縮はBrotli優先、キャッシュはimmutableと粒度の最適化、CDNではジオ分散とキャッシュキーの統制でTTFBを押し下げます。画像はAVIF/WEBPの自動配信を基本に、ビューポートに応じたsizesとsrcsetで過剰転送を避けます。

# NGINX: Brotliとキャッシュ制御
brotli on;
brotli_comp_level 5;
brotli_types text/plain text/css application/javascript application/json image/svg+xml;

gzip on; # フォールバック

location ~* \.(js|css|woff2|avif|webp)$ {
  add_header Cache-Control "public, max-age=31536000, immutable";
}

location /api/ {
  add_header Cache-Control "public, max-age=60";
}
// Node/Express: 圧縮と静的キャッシュ
import express from 'express';
import compression from 'compression';
import path from 'node:path';

const app = express();
app.use(compression());
app.use('/_next/static', express.static(path.join(process.cwd(), '.next/static'), {
  immutable: true,
  maxAge: '1y',
}));
app.use('/public', express.static('public', { maxAge: '30d' }));

app.listen(3000);

初期描画の資源は接続前倒しの効果が大きく、preconnectやdns-prefetchを正しく使うとTTFBとLCPが安定します。第三者ドメインは過剰な前倒しを避けつつ、必要最小限で確実に張ります。

<!-- 初期描画に必要なオリジンへの前倒し -->
<link rel="preconnect" href="https://cdn.example.com" crossorigin>
<link rel="dns-prefetch" href="//cdn.example.com">

監視とリグレッション防止の仕組み

改善を継続させるにはRUMの自前実装かSaaSの導入が不可欠です。web-vitalsライブラリでp75を推定し、計測値を分析基盤へ送ります。テンプレートやキャンペーンごとの差を切り分けられるよう、カスタムディメンションを含めて送信します。CIではLighthouse CIのバジェット破りをブロックし、CrUXの週次監視でユーザー実態の回復を確認します[7]。

ベンチマークと効果検証の進め方

影響を明確にするために、テンプレート単位で前後比較を設計します。例えばトップページのLCPをp75で3.2秒から2.1秒へ、検索結果のINPを380msから180msへ、記事ページのCLSを0.18から0.05へ下げたケースでは、モバイルの直帰率が数ポイント改善し、自然検索のCTRとCVRがともに上振れする傾向が見られます。順位シグナル単体では説明できない改善も、ユーザー行動の連鎖として説明できます[6]。広告収益モデルでも、視認性とスクロール深度が向上し、ビューアブル率の底上げやアドリクエストの機会増加という形で回収されます。

経営視点では回収期間の見積もりが重要です。仮に改善プロジェクトの費用が800万円、現状月間自然流入が200万セッション、CVRが1.8%、平均注文額が7,500円、INP改善でCVRが1.8%から2.0%に伸びると仮定すると、月間売上は2,700万円から3,000万円へ約300万円増加する試算になります。順位変動による追加流入を保守的に見て5%と置けば、さらに売上は上積みされます。前提が妥当であれば3〜4ヶ月で投資回収の目処が立つ可能性があります。もちろん実数値は事業ごとに異なるため、初期にA/B計測やトラフィックのセグメント比較を組み込み、ベンチの不確実性を減らすのが堅実です。

最後に、継続の仕組みを整えます。依存パッケージの更新やデザイン改修は常に回帰リスクを伴います。フロントエンドはバンドルサイズ予算、サーバ側はTTFBのSLO、CDNはキャッシュのヒット率のSLOを設定し、PR時に自動チェックを走らせます。CrUXの季節要因(キャンペーン時のトラフィック組成やモバイル比率の変化)も考慮し、ダッシュボードでテンプレート別、デバイス別に分解して追うと、ノイズに振り回されずに意思決定がしやすくなります。

まとめ:CWVを共通KPIにする意思決定

Core Web Vitalsは、検索順位、離脱率、CVR、広告収益という別々の指標を一本化するための共通言語です。LCP/INP/CLSの合格ラインをp75で満たすという単純な目標に、設計、実装、配信、運用を重ねると、組織の意思決定がクリアになります。今日できる第一歩として、CrUXで現状を把握し、ヒーロー画像のプリロードとfetchpriorityの設定、イベント処理の分割、画像とフォントの寸法確保を同時に進めてください。これだけでも体感は変わり、90日で「遅い」を「速い」に裏づけを持って言い換えられるはずです。次の四半期レビューで、速度と収益の関係を数字で語れるよう、チームのKPIにCWVを組み込みましょう。

参考資料として、GoogleのCore Web Vitalsドキュメント、Chrome UX Report、PageSpeed Insights、WebPageTestの各サイトを併読すると、実装と検証の解像度がさらに上がります。環境やフレームワークが異なっても、指標の本質は変わりません。ベースラインを整え、計測と改善を日常業務に組み込むことが、もっとも確実な競争優位になります。

参考文献

  1. Deloitte. Milliseconds make millions
  2. Google Search Central Blog. INP will become a Core Web Vitals metric
  3. web.dev. Optimize LCP
  4. web.dev. Interaction to Next Paint (INP)
  5. web.dev. Optimize Cumulative Layout Shift
  6. Google Search Central Blog. Page experience: a guide for site owners
  7. Chrome Developers. Chrome UX Report (CrUX)