Core Web Vitalsとは
Core Web Vitalsは、Googleが定義するWebページのユーザー体験を測る指標です。2021年からGoogle検索のランキング要因に含まれており、SEOに直接影響します。
パフォーマンスがビジネスに与える影響:
- ページ読み込みが1秒遅れると、コンバージョン率が7%低下(Amazon調査)
- モバイルでは3秒以上かかると53%のユーザーが離脱(Google調査)
- 表示速度が0.1秒改善すると、コンバージョンが8%向上(Walmart調査)
各指標の詳細と目標値
3つの主要指標
LCP
Largest Contentful Paint - メインコンテンツの表示速度
INP
Interaction to Next Paint - 操作への応答速度
CLS
Cumulative Layout Shift - レイアウトの安定性
目標値と評価基準
| 指標 | 良好 | 改善が必要 | 不良 |
|---|---|---|---|
| LCP | 2.5秒以下 | 2.5〜4.0秒 | 4.0秒超 |
| INP | 200ms以下 | 200〜500ms | 500ms超 |
| CLS | 0.1以下 | 0.1〜0.25 | 0.25超 |
LCP(Largest Contentful Paint)
ビューポート内で最も大きなコンテンツ(画像、動画、テキストブロック)が表示されるまでの時間です。
INP(Interaction to Next Paint)
ユーザーがクリックやタップをしてから、画面が更新されるまでの時間です。2024年3月にFIDに代わって採用されました。
CLS(Cumulative Layout Shift)
ページ読み込み中に要素が予期せずずれる量を測定します。広告や画像の遅延読み込みでずれが発生しやすいです。
最適化テクニック
1. 画像の最適化(LCP改善)
WebPはJPEGより25-35%軽量。AVIFはさらに20%軽量
表示サイズの2倍(Retina対応)を上限に
ファーストビュー外の画像は後から読み込む
LCPに関わる画像は優先的に読み込む
2. JavaScriptの最適化(INP改善)
| テクニック | 効果 | 実装方法 |
|---|---|---|
| コード分割 | 初期読み込み量を削減 | dynamic import()を使用 |
| 遅延読み込み | メインスレッドのブロックを回避 | defer/async属性を使用 |
| ツリーシェイキング | 未使用コードを除去 | ES Modulesを使用 |
| 長いタスクの分割 | UIのブロックを回避 | setTimeout/requestIdleCallback |
3. CSSの最適化
4. レイアウトシフトの防止(CLS改善)
CLSの主な原因:
- サイズ未指定の画像や動画
- 動的に挿入されるコンテンツ
- 遅延読み込みされる広告
- Webフォントの読み込み
5. サーバー・インフラ最適化
CDNの活用
ユーザーに近いサーバーから配信
キャッシュ設定
静的ファイルを長期キャッシュ
HTTP/2・HTTP/3
多重化で並列ダウンロード
Gzip/Brotli圧縮
転送サイズを70%削減
実装コード例
画像の遅延読み込み
<!-- ファーストビューの画像(プリロード) -->
<link rel="preload" as="image" href="hero.webp">
<img src="hero.webp" alt="ヒーロー画像" fetchpriority="high">
<!-- ファーストビュー外の画像(遅延読み込み) -->
<img src="photo.webp" alt="写真" loading="lazy">
CLSを防ぐ画像の指定
<!-- 必ずwidth/heightを指定 -->
<img
src="photo.webp"
alt="写真"
width="800"
height="600"
style="aspect-ratio: 800/600; width: 100%; height: auto;"
>
JavaScriptの遅延読み込み
<!-- 重要なスクリプトは同期読み込み -->
<script src="critical.js"></script>
<!-- 解析系は遅延読み込み -->
<script src="analytics.js" defer></script>
<!-- 独立したスクリプトは非同期 -->
<script src="widget.js" async></script>
Reactでのコード分割
import { lazy, Suspense } from 'react';
// 動的インポートでコード分割
const HeavyComponent = lazy(() =>
import('./HeavyComponent')
);
function App() {
return (
<Suspense fallback={<Loading />}>
<HeavyComponent />
</Suspense>
);
}
測定ツール
| ツール | 特徴 | 用途 |
|---|---|---|
| PageSpeed Insights | 実際のユーザーデータ(CrUX)を表示 | 本番サイトの評価 |
| Lighthouse | 詳細な改善提案を表示 | 開発中の診断 |
| Chrome DevTools | リアルタイムで計測可能 | デバッグ・検証 |
| Web Vitals Extension | ブラウザで常時表示 | 日常的なモニタリング |
| Search Console | サイト全体のレポート | 長期的な傾向分析 |
改善の優先順位
現状を測定
PageSpeed Insightsで各指標を確認
最も悪い指標から改善
「不良」の指標を優先的に対処
効果を検証
変更後に再度測定して効果を確認
まとめ
サイトの高速化はSEOとユーザー体験の両方に効果があります。まずはPageSpeed Insightsで現状を把握し、「不良」の指標から改善していきましょう。
当サイトもCore Web Vitalsの最適化を行っています。画像のWebP変換、遅延読み込み、コード分割など、この記事で紹介したテクニックを実践しています。
テクノロジーで人々の日常をより便利に。AI、プログラミング、Web開発に関する情報を発信しています。