Next.js 15はReactをベースにしたフルスタックWebフレームワークの最新版です。App Router・React Server Components・Turbopackなど革新的な機能により、2026年のフロントエンド開発の標準となっています。本記事ではNext.js 15の全機能を実践コード付きで解説します。
Next.js 15の新機能まとめ
- ⚡ Turbopack(Stable):Webpackの最大10倍速いバンドラーが安定版に
- 🔧 React 19サポート:新しいReact Compiler・Server Actions改善
- 📦 Partial Prerendering(PPR):静的・動的コンテンツの最適な組み合わせ
- 🎯 Form Component:ネイティブのフォーム処理
- 🔐 改善されたキャッシュ制御:より細かいキャッシュ管理
プロジェクトのセットアップ
# Next.js 15プロジェクト作成
npx create-next-app@latest my-app --typescript --tailwind --app
# プロジェクト構造
my-app/
├── app/
│ ├── layout.tsx # ルートレイアウト
│ ├── page.tsx # ホームページ
│ ├── (blog)/ # ルートグループ
│ │ ├── layout.tsx
│ │ └── [slug]/
│ │ └── page.tsx
│ └── api/
│ └── posts/
│ └── route.ts
├── components/
├── lib/
└── public/
App RouterとServer Components
// app/blog/[slug]/page.tsx(Server Component)
import { getPost } from '@/lib/posts';
import { notFound } from 'next/navigation';
// 静的パラメータの生成(SSG)
export async function generateStaticParams() {
const posts = await getAllPosts();
return posts.map((post) => ({
slug: post.slug,
}));
}
// メタデータの動的生成(SEO最適化)
export async function generateMetadata({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug);
if (!post) return {};
return {
title: post.title + ' | Tech Athletes',
description: post.excerpt,
openGraph: {
title: post.title,
description: post.excerpt,
type: 'article',
publishedTime: post.publishedAt,
},
};
}
// ページコンポーネント
export default async function BlogPost({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug);
if (!post) notFound();
return (
<article>
<h1>{post.title}</h1>
<div dangerouslySetInnerHTML={{ __html: post.content }} />
</article>
);
}
Server Actionsでフォーム処理
// app/contact/actions.ts
'use server';
import { z } from 'zod';
import { revalidatePath } from 'next/cache';
const ContactSchema = z.object({
name: z.string().min(1),
email: z.string().email(),
message: z.string().min(10),
});
export async function submitContact(formData: FormData) {
const validatedFields = ContactSchema.safeParse({
name: formData.get('name'),
email: formData.get('email'),
message: formData.get('message'),
});
if (!validatedFields.success) {
return { error: 'バリデーションエラー' };
}
// DBへの保存・メール送信などの処理
await saveToDatabase(validatedFields.data);
revalidatePath('/contact');
return { success: true };
}
// app/contact/page.tsx
export default function ContactPage() {
return (
<form action={submitContact}>
<input name="name" placeholder="お名前" required />
<input name="email" type="email" placeholder="メール" required />
<textarea name="message" placeholder="メッセージ" required />
<button type="submit">送信</button>
</form>
);
}
パフォーマンス最適化テクニック
1. 画像最適化
import Image from 'next/image';
// 自動的にWebP変換・遅延読み込み・サイズ最適化
export function HeroImage() {
return (
<Image
src="/hero.jpg"
alt="Tech Athletes ヒーロー画像"
width={1200}
height={630}
priority // LCPに影響する画像はpriorityを設定
placeholder="blur"
blurDataURL="data:image/jpeg;base64,..."
/>
);
}
2. フォント最適化
import { Noto_Sans_JP } from 'next/font/google';
// 自動的にself-hostingされレイアウトシフトを防止
const notoSansJP = Noto_Sans_JP({
subsets: ['latin'],
weight: ['400', '700'],
display: 'swap',
});
export default function RootLayout({ children }) {
return (
<html lang="ja" className={notoSansJP.className}>
<body>{children}</body>
</html>
);
}
Vercelでのデプロイ
# Vercel CLIでのデプロイ
npm install -g vercel
# ログイン
vercel login
# デプロイ(本番)
vercel --prod
まとめ
Next.js 15はApp Router・Server Components・Turbopackの組み合わせで、従来のSPAと比較して圧倒的なパフォーマンスを実現します。SEO対応・Core Web Vitals最適化・TypeScript完全対応と、2026年のWebフロントエンド開発の最強の選択肢です。VercelやAWS Amplifyを使えば簡単に本番デプロイも可能です。