Next.js

React ベースのフルスタックフレームワークで、SSR、SSG、API Routes を統合的に提供する

フロントエンドReact

Next.js とは

Next.js は、Vercel が開発する React ベースのフルスタック Web フレームワークである。SSR (サーバーサイドレンダリング)、SSG (静的サイト生成)、ISR (増分静的再生成)、App Router、React Server Components を統合的に提供する。2016 年にリリースされ、React アプリケーションのデファクトスタンダードになっている。

レンダリング戦略

戦略 タイミング 用途
SSG (Static Site Generation) ビルド時 ブログ、ドキュメント、LP
SSR (Server-Side Rendering) リクエスト時 ダッシュボード、検索結果
ISR (Incremental Static Regeneration) バックグラウンドで再生成 EC サイト、ニュース
CSR (Client-Side Rendering) ブラウザで実行 インタラクティブな UI

App Router (Next.js 13+)

app/
├── layout.tsx          # 共通レイアウト
├── page.tsx            # / ルート
├── about/
│   └── page.tsx        # /about ルート
├── blog/
│   ├── page.tsx        # /blog ルート
│   └── [slug]/
│       └── page.tsx    # /blog/:slug ルート (動的ルート)
└── api/
    └── users/
        └── route.ts    # API Route: /api/users

Server Components と Client Components

// Server Component (デフォルト): サーバーで実行、JS がクライアントに送られない
async function UserList() {
  const users = await db.users.findMany(); // サーバーで直接 DB アクセス
  return <ul>{users.map(u => <li key={u.id}>{u.name}</li>)}</ul>;
}

// Client Component: ブラウザで実行、インタラクティブ
'use client';
function Counter() {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}

Server Components はサーバーで実行されるため、DB アクセスや API キーの使用が安全にできる。JavaScript がクライアントに送られないため、バンドルサイズが削減される。

静的エクスポート

// next.config.ts
const config: NextConfig = {
  output: 'export',  // 静的 HTML を生成 (S3 + CloudFront でホスティング)
};

output: 'export' で全ページを静的 HTML に出力し、S3 + CloudFront でホスティングできる。サーバーが不要なため、コストが最小限だ。

AWS でのホスティング

方式 特徴 コスト
S3 + CloudFront (静的エクスポート) サーバーレス、最安 ほぼ無料
Lambda@Edge + S3 SSR 対応 低〜中
ECS / Fargate フル機能 中〜高
Amplify Hosting マネージド、CI/CD 統合 低〜中

静的サイトなら S3 + CloudFront が最もコスト効率が良い。SSR が必要な場合は Amplify Hosting か Lambda@Edge を検討する。

詳しくは関連書籍を参照。

関連用語