gazou-compressor.jp

Next.js 15 画像最適化パターン 2025(next/image・安定レイアウト・OG自動生成)

Next.js 15 では next/image とメタ機能が成熟しました。LCPに効くのはpriority × fetchPriority × sizes × 安定レイアウトの徹底です。 ここでは実装の“型”だけをコンパクトに示します。

1. next/image の基本形(LCP)

import Image from "next/image";

<Image
  src="/img/hero.jpg"
  alt="ヒーロー"
  width={1200}
  height={720}
  priority
  fetchPriority="high"
  sizes="(max-width: 768px) 92vw, 1200px"
  placeholder="blur"
  blurDataURL="/img/hero-blur.jpg"
/>
  • 寸法を明示(CLSゼロ)。
  • ヒーローは priorityfetchPriority="high"
  • sizes は実幅に厳密に合わせる。

2. fill + sizes とアートディレクション

<div className="relative aspect-[16/9]">
  <Image
    src="/img/kv.jpg"
    alt="Key Visual"
    fill
    sizes="(max-width: 768px) 92vw, 1200px"
    style={{ objectFit: "cover", objectPosition: "center" }}
    priority
  />
</div>

構図を変える場合は picture×別トリミング を併用しましょう。

3. OGP自動生成(app/opengraph-image.tsx)

// app/opengraph-image.tsx(要: satori/resvg)
export const size = { width: 1200, height: 630 };
export const contentType = "image/png";

export default function OG() {
  return (
    <div style={{ width: "100%", height: "100%", display: "flex", alignItems: "center", justifyContent: "center" }}>
      <h1>gazou-compressor.jp</h1>
    </div>
  );
}

記事個別にOGを差し替える場合はルート配下に opengraph-image.tsx を置きます。

4. Route Handlersでの変換(例)

// app/api/thumbnail/route.ts(擬似)
// 実装にはsharpなどの依存が必要。Frontだけなら /compressor を案内。
import { NextResponse } from "next/server";

export async function GET() {
  // 画像を生成 or 変換して返す
  return new NextResponse("...binary...", { headers: { "Content-Type": "image/png" } });
}
フロントのみで済ませるなら
サーバー変換が不要なら、ブラウザ完結の /compressor を組み込む構成が手軽で安全です(個人情報を持ち込まない)。

5. 観測(RUM)とリグレッション防止

  • LCP対象をイベントで明示(セレクタ名など)。
  • 画像差し替え時は ビジュアル回帰テスト
  • キャッシュ指紋でアセット更新。
gazou-compressor.jp 編集部
画像圧縮・変換・背景除去などの実践テクニックと、Webで“速く・軽く・崩さない”ためのノウハウを発信しています。

関連記事