この記事の対象読者
- サイトの表示速度を改善したい人
- Core Web Vitals のスコアを上げたい人
- パフォーマンス最適化の具体的なテクニックを知りたい人
Core Web Vitals とは
Core Web Vitals は、Google が定めた Web ページのユーザー体験を測定する3つの指標 です。2021年から Google 検索のランキング要因に組み込まれています。
| 指標 | 正式名称 | 測定内容 | 良好な値 |
|---|---|---|---|
| LCP | Largest Contentful Paint | 最大コンテンツの描画時間 | 2.5秒以内 |
| CLS | Cumulative Layout Shift | レイアウトのずれの合計 | 0.1以下 |
| INP | Interaction to Next Paint | 操作への応答速度 | 200ms以内 |
計測方法
PageSpeed Insights
最も手軽な方法は PageSpeed Insights です。URL を入力するだけでスコアと改善提案が表示されます。
アクセス: pagespeed.web.dev
Chrome DevTools
- Chrome で対象ページを開く
- F12 で DevTools を開く
- 「Lighthouse」タブを選択
- 「パフォーマンス」にチェックして分析開始
Search Console
Google Search Console の「ウェブに関する主な指標」レポートで、サイト全体の Core Web Vitals を確認できます。
LCP(最大コンテンツの描画)の改善
LCP は、ページの 最大の要素(メイン画像やヘッダーテキスト等)が描画されるまでの時間です。
1. preconnect でリソース取得を高速化
外部サービス(Google Analytics 等)への接続を事前に確立します。
<link rel="preconnect" href="https://www.googletagmanager.com" crossorigin>
<link rel="dns-prefetch" href="https://www.googletagmanager.com">
| 属性 | 効果 |
|---|---|
preconnect | DNS解決 + TCP接続 + TLSハンドシェイクを事前実行 |
dns-prefetch | DNS解決のみ事前実行(preconnect のフォールバック) |
2. JavaScript の defer / async
JavaScript の読み込みがページの描画をブロックしないようにします。
<!-- defer: HTMLパース完了後に実行(順序保証あり) -->
<script src="app.js" defer></script>
<!-- async: ダウンロード完了後すぐに実行(順序保証なし) -->
<script src="analytics.js" async></script>
| 属性 | HTMLパース | 実行タイミング | 順序保証 | 用途 |
|---|---|---|---|---|
| なし | ブロック | 即座 | あり | 使わない |
defer | ブロックしない | パース完了後 | あり | アプリのJS |
async | ブロックしない | DL完了後 | なし | 外部スクリプト |
3. CSS の最適化
不要な CSS はページの描画を遅延させます。
- 使用していない CSS ルールを削除
- CSS ファイルを圧縮(minify)する
- 本番環境で WhiteNoise 等の圧縮ストレージを使用
CLS(レイアウトのずれ)の改善
CLS は、ページ読み込み中に コンテンツが予期せずずれる量 を測定します。画像の読み込みで文章が下に押し出される、広告が挿入されてボタンがずれる、などが CLS を悪化させます。
1. 画像に width / height を指定
画像のサイズを事前に指定することで、ブラウザが読み込み前にスペースを確保します。
<!-- CLS が発生する(サイズ未指定) -->
<img src="photo.jpg" alt="写真">
<!-- CLS を防止(サイズ指定) -->
<img src="photo.jpg" alt="写真" width="600" height="400">
width と height を HTML 属性で指定し、CSS で width: 100%; height: auto; にすると、レスポンシブかつ CLS を防止できます。
2. lazy loading の活用
ファーストビュー外の画像は loading="lazy" で遅延読み込みにします。
<img src="photo.jpg" alt="写真" width="600" height="400" loading="lazy">
3. フォントの読み込み最適化
Web フォントの読み込みでテキストが一瞬消える(FOIT)のを防ぎます。
@font-face {
font-family: "CustomFont";
src: url("font.woff2") format("woff2");
font-display: swap; /* システムフォントで先に表示 */
}
INP(次のペイントまでの応答時間)の改善
INP は、ユーザーがクリックやキー入力をしてから 画面が更新されるまでの時間 を測定します。
改善のポイント
- メインスレッドをブロックしない: 重い JS 処理は
requestAnimationFrameやsetTimeoutで分割 - イベントハンドラを軽量に: click や input のハンドラ内で重い処理をしない
- 不要な JS を削除: 使っていないライブラリやコードを除去
汎用的な高速化テクニック
1. 静的ファイルの圧縮
Django の WhiteNoise を使うと、CSS/JS を gzip/brotli 圧縮して配信できます。
STORAGES = {
"staticfiles": {
"BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
},
}
2. ブラウザキャッシュの活用
Nginx で静的ファイルのキャッシュを長期間に設定します。
location /static/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
3. データベースクエリの最適化
N+1 問題を避け、select_related や prefetch_related で効率的にデータを取得します。
# N+1 問題が発生する
articles = Article.objects.all()
# 改善: 関連データを一括取得
articles = Article.objects.select_related(
"classification__parent"
).all()
まとめ
- Core Web Vitals(LCP・CLS・INP)は Google 検索のランキング要因
- LCP: preconnect、JS の defer、CSS 最適化で改善
- CLS: 画像の width/height 指定、lazy loading で改善
- INP: JS の軽量化、メインスレッドのブロック回避で改善
- PageSpeed Insights で定期的にスコアを計測し、改善を続ける