مرکزی مواد پر جائیں
友田 陽大
Frontend
Next.js
パフォーマンス
フロントエンド
React
アクセシビリティ
アーキテクチャ設計

Core Web Vitals 最適化ガイド【2026年版】— Next.js で INP・LCP・CLS を改善し、SEO と CV を伸ばす

2026年の Core Web Vitals(INP・LCP・CLS)を Next.js で改善する実践ガイド。最も失敗しやすい INP の潰し方、LCP を 2.5 秒未満にする画像・フォント・SSR 最適化、CLS をゼロに近づける寸法予約、フィールド計測(web-vitals / RUM)まで、本番品質の手法を実コードで解説します。

Published
Reading time
9 min read
Author
友田 陽大
شیئر کریں

「速い」は感想ではなく測れる品質です。本記事は Next.js を前提に、推測ではなく数値で改善する手順を示します。


1. 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超

重要な前提が2つあります。

  • 75パーセンタイルで判定。 「訪問の75%が良好」でなければ合格しません。平均値が良くても、低速端末・低速回線のユーザーが足を引っ張ると落ちます。
  • フィールドデータが正。 Google が見るのは実ユーザー(CrUX)です。手元の Lighthouse スコアが100でも、現場が遅ければ不合格になります。

2. INP を潰す(2026年・最重要)

INP は「クリック・タップ・キー入力をしてから、画面が次に描画されるまで」の遅延を測ります。原因はほぼ常にメインスレッドを塞ぐ JavaScriptです。

2-1. そもそも JS を送らない(最大のレバー)

React Server Components(RSC)は、サーバーで完結する処理のJSをクライアントへ送りません。"use client" を最小の葉に閉じ込めることが INP 改善の本丸です。

// ❌ ページ全体をクライアント化:不要な JS が大量にハイドレーションされる
"use client";
export default function Page() { /* 重い */ }

// ✅ 静的部分は RSC のまま。対話する葉だけ client にする
export default function Page() {
  return (
    <>
      <ProductInfo />        {/* RSC:JS ゼロ */}
      <AddToCartButton />    {/* "use client" の小さな葉だけ */}
    </>
  );
}

2-2. 長いタスクを分割し、メインスレッドに譲る

重い更新は useTransition / useDeferredValue で「緊急でない」と印を付け、入力の応答性を守ります。

"use client";
import { useState, useDeferredValue } from "react";

function Search({ items }: { items: Item[] }) {
  const [query, setQuery] = useState("");
  // 入力は即時反映、重いフィルタリングは「遅延」させて応答性を確保
  const deferred = useDeferredValue(query);
  const results = useMemo(() => filterItems(items, deferred), [items, deferred]);

  return (
    <>
      <input value={query} onChange={(e) => setQuery(e.target.value)} aria-label="検索" />
      <ResultList results={results} />
    </>
  );
}

さらに効く手:

  • イベントハンドラを軽く。 ハンドラ内で重い計算をせず、必要なら scheduler.yield()(対応環境)や setTimeout でチャンクに分ける。
  • デバウンス / スロットル。 連続入力・スクロール・リサイズはレート制限する。
  • サードパーティ JS を遅延。 解析・チャット・広告は next/scriptstrategy="lazyOnload" などで後ろへ。
  • DOM を小さく。 巨大リストは仮想化(ウィンドウイング)し、描画コストを抑える。

補足:リアルタイム編集や頻繁な再描画があるアプリ(共同編集・スコア入力など)では INP がそのまま「サクサク感」になります。状態更新の粒度設計が UX を左右します。


3. LCP を 2.5秒未満にする

LCP は「最大の要素(多くはヒーロー画像か見出し)」が見えるまでの時間です。効く順に。

3-1. 画像:next/imagepriority

import Image from "next/image";

// LCP になるヒーロー画像には priority を付け、プリロードさせる
<Image
  src="/hero.webp"
  alt="サービスのヒーロー画像"
  width={1200}
  height={630}
  priority            // ← LCP 画像に必須遅延読み込みを無効化しプリロード
  sizes="100vw"
/>

next/image は自動で WebP/AVIF 変換・レスポンシブ生成・遅延読み込みを行います。ただし LCP 画像にだけは priority を付けます(付け忘れが頻出の不具合)。逆に、画面外の画像に priority を付けてはいけません。

3-2. フォント:next/font で FOUT/FOIT を消す

import { Noto_Sans_JP } from "next/font/google";

const noto = Noto_Sans_JP({
  subsets: ["latin"],
  display: "swap",      // テキストを即表示(不可視待ちを避ける)
  preload: true,
});

next/font はビルド時にフォントをセルフホストし、外部リクエストを消します。display: "swap" で「文字が見えない時間(FOIT)」を避けつつ、size-adjust 相当の調整で字形差によるズレ(CLS)も抑えます。

3-3. サーバー:TTFB と SSR/ストリーミング

  • 静的化・キャッシュ。 可能な限り静的生成(SSG)/ ISR / PPR でサーバー処理を前倒しする。
  • ストリーミングと <Suspense> 重いデータを待たずに、まず骨組み(とLCP要素)を流す。
  • preconnect / dns-prefetch 必須の外部オリジン(CDN・計測)への接続を前倒しする。

4. CLS をゼロに近づける

CLS は「読み込み中に要素がガタッと動く量」です。原因は「寸法を予約していない後から現れる要素」に集約されます。

  • 画像・動画・iframe・広告に明示寸法。 width/height(または aspect-ratio)を必ず指定し、領域を先に確保する。
  • フォント差し替えのズレ対策。 next/fontdisplay: swap + メトリクス調整。
  • スクロールバーのズレ対策。 scrollbar-gutter: stable で出現時の横ズレを防ぐ(Tailwind v4 ガイド参照)。
  • 動的挿入は上から押し下げない。 バナー・通知は領域を予約するか、レイアウトを動かさないオーバーレイにする。
  • スケルトン UI を実コンテンツと同じ寸法で出す。
/* 後から入る要素も含め、領域を先に確保する */
.thumb {
  aspect-ratio: 16 / 9; /* 画像読込前から高さが確定し、ズレない */
}

5. 計測:推測をやめ、現場の数値で改善する

5-1. フィールド計測(実ユーザー)を自前で取る

web-vitals ライブラリで実ユーザーの値を収集し、分析基盤へ送ります。Next.js では useReportWebVitals が使えます。

"use client";
import { useReportWebVitals } from "next/web-vitals";

export function WebVitals() {
  useReportWebVitals((metric) => {
    // 例:計測ビーコンで送信(sendBeacon は離脱時も送れる)
    const body = JSON.stringify({ name: metric.name, value: metric.value, id: metric.id });
    navigator.sendBeacon?.("/api/vitals", body);
  });
  return null;
}
  • ラボ(Lighthouse / PageSpeed Insights) は再現・デバッグ用。CI に組み込み回帰を検出する。
  • フィールド(CrUX / 自前 RUM) が合否の正。端末・回線・地域の分布を見て、75パーセンタイルを改善する。

5-2. 可観測性として運用する

  • リリースごとに3指標を記録し、劣化したら気づけるようにする(回復性)。
  • 指標をルート別・端末別に分解し、ボトルネックの局在を掴む。
  • 「速さ」をダッシュボード化すると、改善が継続します。計測なき最適化は YAGNI 違反になりがちです。

6. Next.js 固有の効きどころ(早見表)

課題手段
不要な JS が多い(INP)RSC 化、"use client" を葉に限定、next/dynamic で遅延読み込み
LCP 画像が遅いnext/imagepriority + 適切な sizes
フォントで遅延・ズレnext/fontdisplay: swap
サーバー応答が遅いSSG / ISR / PPR、<Suspense> ストリーミング、キャッシュ
サードパーティが重いnext/scriptstrategy 調整、必要時のみ読み込み
レイアウトのズレ寸法予約、aspect-ratioscrollbar-gutter: stable

「とりあえず全部最適化」ではなく、計測で特定したボトルネックから順に潰すのが KISS です。


7. アンチパターン

  • Lighthouse 100 で満足する。 合否はフィールド(実ユーザー75%ile)。ラボだけ見ない。
  • ページ全体に "use client" INP 悪化の主因。対話する葉だけに限定する。
  • LCP 画像に priority を付け忘れる/画面外画像に付ける。
  • 画像・広告枠の寸法を指定しない。 CLS が跳ね上がる。
  • サードパーティ JS を <head> で同期読み込み。 メインスレッドを塞ぐ。
  • アクセシビリティを犠牲に速度を取る。 仮想化やスケルトンでも、フォーカスと読み上げ順は維持する。

8. FAQ(よくある質問)

Q. INP と FID は何が違う? A. FID は「最初の操作の遅延」だけを測りましたが、INP はページ滞在中の全操作の応答性を測ります。2024年3月に INP が FID を正式に置き換えました。

Q. Core Web Vitals は SEO 順位に影響する? A. ランキング要因の一つです。ただし「良好なら必ず上位」ではなく、コンテンツの質が前提。同等のコンテンツ間での差別化要因、かつ直帰率・CV を通じて間接的にも効きます。

Q. SPA と SSR、どちらが有利? A. 一般に SSR / RSC が LCP・INP に有利です。クライアントへ送る JS が減り、初期描画も速いためです。

Q. 画像最適化は next/image だけで十分? A. 大半はカバーできますが、LCP 画像の priority、適切な sizes、フォーマット(WebP/AVIF)、寸法予約まで含めて初めて効果が出ます。

Q. どこから手を付けるべき? A. まず計測(フィールド)。次に最も失敗しやすい INP(JS削減)、続いて LCP(画像・フォント・SSR)、CLS(寸法予約)の順が費用対効果が高いです。


まとめ:速さは「測れる品質」であり、売上に効く

Core Web Vitals は、ユーザー体験を数値化したものです。改善はそのまま、検索流入・直帰率・コンバージョンの改善につながります。

  1. 計測(フィールド)から始める。 ラボだけを信じない。
  2. INP は JS を減らす。 RSC 化と "use client" の局所化が本丸。
  3. LCP は画像・フォント・SSR。 prioritynext/font を確実に。
  4. CLS は寸法予約。 aspect-ratioscrollbar-gutter でズレを消す。
  5. 可観測性として運用する。 劣化に気づける仕組みを持つ。

体感の速さは、プロダクトへの信頼そのものです。遅いサイトは、どれだけ機能が優れていても評価されません。

サイトの表示速度・Core Web Vitals の改善、あるいは高速で応答性の高いアプリの新規開発が必要な場合は、お気軽にご相談ください。 下記の事例では、複数人が同時に操作してもサクサク動く、応答性重視のリアルタイムアプリを設計・実装した過程を紹介しています。

友田

友田 陽大

وزیر (METI) ایوارڈ یافتہ پروڈکٹ کے ڈویلپر۔ TypeScript + Python + AWS کے ساتھ میں SaaS، صنعتی ڈیجیٹل تبدیلی اور پروڈکشن کے قابل جنریٹو اے آئی (RAG) تنہا ابتدا سے انتہا تک فراہم کرتا ہوں — تقاضوں کی تعیین سے انفراسٹرکچر اور آپریشن تک۔

Got a challenge?

From design to implementation and operations — solo × generative AI

Implementation like this article's, end to end from requirements to production. Start with a free 30-minute technical consult and tell me about your situation.

پروجیکٹ کی بنیاد پر کام اور تکنیکی مشاورت دونوں کے لیے دستیاب ہوں۔ 30 منٹ کی مفت مشاورت سے آغاز کریں۔

最短ルート:カレンダーから直接予約

相談内容が固まっている方は、フォーム送信よりその場で日程を確定する方がスムーズです。下記から空き時間をお選びください。

  • 30分のオンライン無料相談
  • Google Meet / Zoom / Microsoft Teams
  • NDA 商談前締結可・無理な営業はいたしません
無料相談の空き枠を予約する

یہ بھی پڑھنے کے قابل