Welcome to Tech Athletes | テック・アスリート   Click to listen highlighted text! Welcome to Tech Athletes | テック・アスリート

【2026年版】Next.js 15完全ガイド|App Router・Server Components・最新機能を徹底解説

Next.js 15はReactベースのフルスタックWebフレームワークで、2026年のフロントエンド開発のデファクトスタンダードとなっています。App Router・Server Components・Streaming・Turbopackなど革新的な機能を持つNext.jsを完全解説します。

Next.js 15の主要な新機能

  • Turbopack(安定版):Webpackの約700倍高速なバンドラー。開発サーバーの起動が劇的に高速化
  • React 19完全対応:Server Actions・use()フック・最適化されたハイドレーション
  • 部分的プリレンダリング(PPR):静的と動的コンテンツを同一ルートで最適化
  • 改善されたキャッシュ動作:より直感的なデフォルト設定

プロジェクトのセットアップ

npx create-next-app@latest my-app --typescript --tailwind --eslint --app

cd my-app
npm run dev

App Routerの基本構造

app/
├── layout.tsx          # ルートレイアウト
├── page.tsx            # ホームページ
├── blog/
│   ├── page.tsx        # /blog
│   ├── [slug]/
│   │   └── page.tsx    # /blog/[記事スラッグ]
│   └── layout.tsx      # ブログセクションのレイアウト
├── api/
│   └── posts/
│       └── route.ts    # /api/posts エンドポイント
└── globals.css

Server ComponentsとClient Componentsの使い分け

// Server Component(デフォルト)
// データベースへの直接アクセス可能・クライアントにJSを送らない
async function BlogList() {
  const posts = await db.query('SELECT * FROM posts ORDER BY created_at DESC');
  
  return (
    <ul>
      {posts.map(post => (
        <li key={post.id}>
          <a href={`/blog/${post.slug}`}>{post.title}</a>
        </li>
      ))}
    </ul>
  );
}

// Client Component(インタラクティブな処理が必要な場合)
'use client';
import { useState } from 'react';

function SearchBar({ onSearch }: { onSearch: (q: string) => void }) {
  const [query, setQuery] = useState('');
  
  return (
    <input
      value={query}
      onChange={e => {
        setQuery(e.target.value);
        onSearch(e.target.value);
      }}
      placeholder="記事を検索..."
    />
  );
}

Server Actions(フォーム処理の新しい方法)

'use server';

// Server Actionの定義
async function submitContactForm(formData: FormData) {
  const name = formData.get('name') as string;
  const email = formData.get('email') as string;
  const message = formData.get('message') as string;
  
  // バリデーション
  if (!name || !email || !message) {
    return { error: '全項目を入力してください' };
  }
  
  // DBへの保存(サーバーサイドで実行)
  await db.insert('contacts', { name, email, message });
  
  return { success: true };
}

// コンポーネントでの使用
function ContactForm() {
  return (
    <form action={submitContactForm}>
      <input name="name" placeholder="お名前" required />
      <input name="email" type="email" placeholder="メール" required />
      <textarea name="message" placeholder="メッセージ" required />
      <button type="submit">送信</button>
    </form>
  );
}

メタデータとSEO最適化

import type { Metadata } from 'next';

// 静的メタデータ
export const metadata: Metadata = {
  title: 'Tech Athletes | テック・アスリート',
  description: 'エンジニア・プログラマーのための技術情報メディア',
  openGraph: {
    type: 'website',
    locale: 'ja_JP',
    url: 'https://tech-athletes.com',
    images: [{ url: '/og-image.jpg', width: 1200, height: 630 }]
  },
  twitter: {
    card: 'summary_large_image'
  }
};

// 動的メタデータ(ブログ記事ページ)
export async function generateMetadata({ params }: { params: { slug: string } }): Promise<Metadata> {
  const post = await getPost(params.slug);
  
  return {
    title: post.title,
    description: post.excerpt,
    openGraph: {
      title: post.title,
      description: post.excerpt,
      images: [{ url: post.thumbnail }]
    }
  };
}

パフォーマンス最適化のベストプラクティス

  • next/imageの活用:自動的なWebP変換・遅延読み込み・サイズ最適化
  • next/fontの活用:Googleフォントをセルフホスティングしてレイアウトシフトを防止
  • PPR(部分的プリレンダリング)の活用:静的シェル+動的ストリーミング
  • Route Segment Config:動的・静的・再検証の細かい制御

まとめ

Next.js 15はApp RouterとServer Componentsにより、パフォーマンスとDXを両立した次世代のWebフレームワークです。Turbopackの安定化でさらに開発体験が向上しており、新規プロジェクトにはNext.js 15を選択することを強く推奨します。

投稿者 kasata

IT企業でエンジニアとして勤務後、テクノロジー情報メディア「Tech Athletes(テック・アスリート)」を運営。プログラミング、クラウドインフラ(AWS/GCP/Azure)、AI活用、Webサービス開発を専門とする。エンジニア・ビジネスパーソン向けに、実際に使ってみた経験をもとに信頼できる技術情報を発信中。資格:AWS認定ソリューションアーキテクト、Python 3 エンジニア認定試験合格。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Click to listen highlighted text!