ページの読み込みに3秒以上かかると、モバイルユーザーの53%が離脱するというデータがあります(出典: Google / SOASTA Research, 2016)。Webパフォーマンスは単なる技術的な課題ではなく、ビジネス成果に直結する要素です。

Webパフォーマンスとは、Webサイトやアプリケーションがユーザーのリクエストに対してどれだけ速く・スムーズに応答できるかを示す総合的な品質指標です。表示速度だけでなく、操作への応答性、レイアウトの安定性、そして「体感的な速さ」も含まれます。

Webパフォーマンスを構成する4つの側面

Webパフォーマンスは大きく分けて4つの側面から評価できます。

読み込み速度(Loading Performance)

ブラウザがサーバーからリソースを取得し、画面に描画するまでの時間です。HTML・CSS・JavaScript・画像・フォントなど、必要なリソースをすべてダウンロードして処理する時間が対象となります。

DNS解決、TCP接続、TLSハンドシェイク、サーバー応答、リソース転送という一連のネットワーク処理が順番に実行されるため、各段階での遅延が累積します。

操作応答性(Interactivity)

ユーザーがボタンをクリックしたりフォームに入力したりした際に、どれだけ速くUIが反応するかを示します。JavaScriptの実行がメインスレッドをブロックしていると、操作に対する応答が遅れ、サイトが「固まった」ように感じられます。

表示の安定性(Visual Stability)

ページのコンテンツが読み込み中に予期せず移動しないかどうかです。広告や画像の遅延読み込みによってテキストが突然ずれると、誤タップや読んでいた箇所を見失う原因になります。

知覚的パフォーマンス(Perceived Performance)

実際の速度とは別に、ユーザーが「速い」と感じるかどうかです。プログレスバーやスケルトンスクリーン(コンテンツ領域の仮表示)を使うことで、同じ読み込み時間でも体感速度を向上させることができます。

Core Web Vitals ― Googleが定めた3つの品質指標

GoogleはWebパフォーマンスの評価基準としてCore Web Vitalsを定義しており、検索ランキングのシグナルとしても使用しています。2024年3月12日にFID(First Input Delay)がINP(Interaction to Next Paint)に正式に置き換えられ、現在の3指標は以下のとおりです。

指標測定対象良好改善が必要不良
LCP(Largest Contentful Paint)最大コンテンツの描画時間2.5秒以内2.5〜4.0秒4.0秒超
INP(Interaction to Next Paint)操作から画面更新までの遅延200ms以内200〜500ms500ms超
CLS(Cumulative Layout Shift)レイアウトのずれの累積量0.1以下0.1〜0.250.25超

LCP ― ページの「見た目の速さ」を測る

LCPは、ビューポート内に表示される最も大きなコンテンツ要素(ヒーロー画像、見出しテキスト、動画のサムネイルなど)が描画完了するまでの時間です。ユーザーが「ページが表示された」と感じるタイミングに近い指標であり、2.5秒以内が推奨されています。

LCPの遅延原因として多いのは、サーバー応答時間(TTFB)の長さ、レンダリングブロックするCSS/JS、大容量画像の最適化不足、クライアントサイドレンダリングによる描画遅延の4つです。

INP ― すべての操作の応答性を評価する

INPは、ページ上で行われたすべてのインタラクション(クリック・タップ・キー入力)のうち、応答が最も遅かったもの(正確にはP98 = 98パーセンタイル)の遅延時間を測定します。

以前の指標であるFIDは最初のインタラクションだけを測定していたのに対し、INPはセッション全体を通じた応答性を包括的に評価します。200ms以内に収めることが推奨されています。

CLS ― レイアウトの安定性を数値化する

CLSは、ページのライフサイクル中に発生した予期しないレイアウトシフトのスコアを累積したものです。画像やiframeのサイズ未指定、Webフォントの遅延読み込みによるテキスト再配置、動的に挿入されるコンテンツなどが主な原因です。0.1以下を目標にします。

パフォーマンス測定ツールの選び方と活用法

パフォーマンスの改善には、まず現状を正確に把握する計測が不可欠です。ツールは大きくラボデータ(合成監視)フィールドデータ(RUM) の2種類に分かれます。

ラボデータ(Synthetic Monitoring)

制御された環境でページを読み込み、再現可能な結果を得る方式です。開発中のパフォーマンス検証やデプロイ前後の比較に適しています。

ツール特徴用途
PageSpeed InsightsCore Web VitalsのフィールドデータとLighthouseのラボデータを両方表示手軽な初期診断
Lighthouse(Chrome DevTools内蔵)パフォーマンス・アクセシビリティ・SEOなど5カテゴリのスコアと改善提案を出力開発時の詳細分析
WebPageTest世界各地のロケーションからテスト可能。ウォーターフォールチャートで詳細なリソース読み込み順序を可視化ネットワーク要因の分析
Chrome DevTools Performance パネルメインスレッドのタスク実行状況やフレームレートをタイムラインで表示JavaScript実行のボトルネック特定

フィールドデータ(Real User Monitoring)

実際のユーザーが体験したパフォーマンスデータを収集する方式です。多様なデバイスやネットワーク環境での実態を把握できます。

ツール特徴
Chrome User Experience Report(CrUX)Chromeユーザーから匿名で収集された実測データ。PageSpeed InsightsやSearch Consoleで参照可能
web-vitals ライブラリGoogleが提供するJavaScriptライブラリ。自サイトにCore Web Vitalsの計測コードを数行で組み込める
商用RUMサービス(New Relic、Datadog、SpeedCurveなど)詳細なダッシュボードやアラート機能を備え、継続的な監視に対応

ラボデータは「何が遅いか」を特定するのに優れ、フィールドデータは「実際にユーザーが困っているか」を判断するのに適しています。両方を組み合わせて使うのが効果的です。

フロントエンドのパフォーマンス改善手法

フロントエンド側の最適化は、サーバーの変更なしで実施できるものも多く、費用対効果が高い施策です。

画像の最適化

画像はページ容量の大部分を占めることが多く、最も効果が出やすい改善対象です。

  • 次世代フォーマットの採用: WebPやAVIFを使用すると、JPEG/PNGと比較して30〜50%の容量削減が期待できます。<picture>要素で対応ブラウザに応じた出し分けが可能です
  • レスポンシブ画像: srcset属性とsizes属性でデバイスの画面幅に合った画像を配信し、不必要に大きな画像の転送を避けます
  • 遅延読み込み: ファーストビュー外の画像にはloading="lazy"を指定して、初期表示に必要なリソースを減らします
  • width/heightの明示: 画像要素にwidthheightを指定することでCLSを防止できます
<picture>
  <source srcset="hero.avif" type="image/avif">
  <source srcset="hero.webp" type="image/webp">
  <img src="hero.jpg" alt="説明文" width="1200" height="630" loading="lazy">
</picture>

CSS の最適化

  • クリティカルCSSのインライン化: ファーストビューの描画に必要な最小限のCSSを<style>タグで<head>に直接記述し、外部CSSの読み込みを待たずに描画を開始できるようにします
  • 不要CSSの除去: PurgeCSSなどのツールで使われていないセレクタを除去します
  • メディアクエリ付き読み込み: 印刷用CSSやレスポンシブ用CSSはmedia属性を指定して、該当しない条件ではレンダリングブロックしないようにします
<link rel="stylesheet" href="print.css" media="print">

JavaScript の最適化

JavaScriptはダウンロード・パース・実行のすべてがメインスレッドで行われるため、パフォーマンスへの影響が大きい言語です。

  • defer/asyncの適切な使い分け: deferはHTMLパースをブロックせずにスクリプトを読み込み、DOMContentLoaded前に実行します。asyncは読み込み完了次第実行されるため、依存関係のないスクリプト(アナリティクスなど)に適します
  • コード分割(Code Splitting): ルートごとにJavaScriptバンドルを分割し、現在のページに必要なコードだけを読み込みます
  • Tree Shaking: 使用していないエクスポートをバンドルから除外し、ファイルサイズを削減します
  • 長時間タスクの分割: 50ms以上かかるタスクはrequestIdleCallbackscheduler.yield()で分割し、メインスレッドのブロックを避けます

Webフォントの最適化

  • font-display: swapの指定: フォント読み込み完了までフォールバックフォントで表示し、テキストが見えない時間(FOIT)を防ぎます
  • サブセット化: 日本語フォントは文字数が多いため、使用する文字だけを含むサブセットファイルを作成してファイルサイズを大幅に削減します
  • プリロード: 重要なフォントファイルは<link rel="preload">で先行読み込みを指示します
<link rel="preload" href="/fonts/NotoSansJP-subset.woff2" as="font" type="font/woff2" crossorigin>

バックエンド・インフラのパフォーマンス改善手法

フロントエンドの最適化だけでは解決できないボトルネックもあります。サーバー側の対策も確認しておきましょう。

サーバー応答時間(TTFB)の短縮

Time to First Byte(TTFB)はサーバーがリクエストを受けてから最初の1バイトを返すまでの時間で、800ms以内が推奨されています。

  • アプリケーションレイヤーの最適化: データベースクエリの見直し、ORMのN+1問題の解消、キャッシュレイヤー(Redis、Memcached)の導入
  • サーバー構成の見直し: HTTP/2またはHTTP/3の有効化、Keep-Alive接続の設定、ワーカープロセス数の調整
  • エッジでの処理: CDN(Content Delivery Network)を使ってユーザーに近いサーバーからコンテンツを配信し、ネットワークレイテンシーを減らします

キャッシュ戦略

効果的なキャッシュ設計はパフォーマンス改善の中でも投資対効果が最も高い施策の一つです。

# 静的アセット(変更時にファイル名を変えるハッシュ戦略と併用)
Cache-Control: public, max-age=31536000, immutable

# HTMLドキュメント
Cache-Control: no-cache
  • ブラウザキャッシュ: Cache-Controlヘッダーで適切なキャッシュ期間を設定します。CSSやJSにはコンテンツハッシュをファイル名に含め、長期キャッシュを有効にする手法が一般的です
  • CDNキャッシュ: 静的コンテンツをCDNのエッジサーバーにキャッシュして配信速度を向上させます
  • サーバーサイドキャッシュ: 動的ページの生成結果をRedisなどにキャッシュして、同一リクエストに対するサーバー負荷を軽減します

リソースの事前読み込み

ブラウザにこれから必要になるリソースを事前にヒントとして伝えることで、読み込みの待機時間を短縮できます。

ディレクティブ用途記述例
dns-prefetch外部ドメインのDNS解決を先行実行<link rel="dns-prefetch" href="//cdn.example.com">
preconnectDNS + TCP + TLSを先行完了<link rel="preconnect" href="https://cdn.example.com">
preload現在のページで確実に必要なリソースを先行取得<link rel="preload" href="hero.webp" as="image">
prefetch次ページで必要になりそうなリソースを低優先度で取得<link rel="prefetch" href="/next-page.html">

ブラウザのレンダリングプロセスとパフォーマンスの関係

改善手法を適切に選択するには、ブラウザがHTMLを受け取ってから画面に描画するまでの処理(クリティカルレンダリングパス)を理解しておくことが重要です。

  1. HTMLパース → DOM構築: ブラウザはHTMLをトークンに分解し、DOM(Document Object Model)ツリーを構築します
  2. CSSパース → CSSOM構築: CSSを解析してCSSOM(CSS Object Model)ツリーを構築します。外部CSSファイルの読み込みが完了するまで、この処理はブロックされます
  3. レンダーツリー構築: DOMとCSSOMを統合して、画面に描画すべき要素とそのスタイルを決定します
  4. レイアウト(Reflow): 各要素の位置とサイズを計算します
  5. ペイント: 各要素をピクセルとして描画します
  6. コンポジット: 複数のレイヤーを合成して最終的な画面を生成します

CSSやJavaScriptがレンダリングをブロックする仕組みを理解していれば、deferasyncの使い分け、クリティカルCSSのインライン化といった施策の意義がより明確になります。

パフォーマンス改善の優先順位の決め方

すべてを一度に改善するのは現実的ではありません。以下の手順で優先度を判断します。

  1. PageSpeed Insightsで現状を計測: フィールドデータ(CrUX)でCore Web Vitalsの合否を確認し、スコアが90未満のカテゴリを特定します
  2. 最も影響の大きい指標から着手: LCPが不良ならサーバー応答と画像最適化、INPが不良ならJavaScript実行の見直し、CLSが不良なら画像サイズ指定とフォント表示戦略を優先します
  3. Lighthouseの「Opportunities」を確認: 具体的な改善提案と推定効果が表示されるため、効果の大きいものから実施します
  4. 変更ごとに計測を繰り返す: 改善施策を1つ適用するたびに再計測し、効果を確認します。複数の変更を同時に行うと、どの施策が効果的だったか判別できなくなります

パフォーマンス予算で品質を維持する

一度改善したパフォーマンスを長期的に維持するには、パフォーマンス予算の仕組みが有効です。パフォーマンス予算とは「このページのJavaScript総量は300KB以下」「LCPは2.5秒以内」のように、超えてはならない閾値を事前に設定し、CI/CDパイプラインでチェックする手法です。

{
  "budgets": [
    {
      "resourceType": "script",
      "budget": 300
    },
    {
      "resourceType": "image",
      "budget": 500
    },
    {
      "metric": "lcp",
      "budget": 2500
    }
  ]
}

Lighthouseの設定ファイルや、bundlesizeなどのツールを使うと、予算超過時にビルドを失敗させる自動チェックが可能です。新機能の追加や依存ライブラリの更新時に、意図しないパフォーマンス劣化を防ぐことができます。

まとめ

Webパフォーマンスは読み込み速度・操作応答性・表示安定性・知覚的速度の4側面から成り立つ品質指標です。Googleが定めたCore Web Vitals(LCP・INP・CLS)は、これらを定量的に評価する共通基準として機能しています。

改善に取り組む際は、まず計測ツールで現状を数値化し、影響の大きい指標から順に施策を実施していくのが効果的です。フロントエンドの画像・CSS・JavaScript最適化からバックエンドのTTFB短縮・キャッシュ設計まで、改善手法は多岐にわたりますが、計測→改善→再計測のサイクルを回すことで着実に成果につながります。

パフォーマンス予算やCI/CDとの統合を導入すれば、改善した品質を長期的に維持することも可能です。