プロジェクトセットアップ & 設定
プロジェクト作成
最新のNext.jsプロジェクトをインタラクティブにセットアップします。
特定のテンプレートを使用する場合:
TypeScriptでプロジェクトを開始:
開発サーバー起動
ビルド
本番用のアプリケーションをビルドします。
本番サーバー起動
ビルドされたアプリケーションを起動します。
next.config.js
の設定例
基本的な設定ファイルです。様々なオプションを追加できます。
ルーティング
Next.jsはファイルシステムベースのルーティングを採用しています。
App Router (推奨)
app
ディレクトリ内にファイルやフォルダを作成してルートを定義します。
app/page.js
→/
app/about/page.js
→/about
app/blog/[slug]/page.js
→/blog/:slug
(例:/blog/my-post
)app/shop/[[...slug]]/page.js
→/shop/*
(オプショナルキャッチオールルート 例:/shop
,/shop/a
,/shop/a/b
)app/(marketing)/about/page.js
→/about
(ルートグループ、URLパスには影響しない)app/@auth/login/page.js
→ パラレルルート (同じレイアウト内で複数の独立したページを表示)app/default.js
→ パラレルルートのフォールバックUIapp/layout.js
→ ルートレイアウト (必須)app/template.js
→ テンプレート (再レンダリング時に状態を保持しないレイアウト)app/loading.js
→ ローディングUI (Suspense境界)app/error.js
→ エラーUI (Client Componentである必要あり)app/global-error.js
→ グローバルエラーUI (ルートレイアウトのエラーをキャッチ)app/not-found.js
→ Not Found UIapp/route.js
→ APIエンドポイント (旧pages/api
相当)
ナビゲーション (App Router):
ルートパラメータの取得 (App Router):
検索パラメータの取得 (App Router):
Pages Router
pages
ディレクトリ内にファイルやフォルダを作成してルートを定義します。
pages/index.js
→/
pages/about.js
→/about
pages/posts/[id].js
→/posts/:id
(例:/posts/123
)pages/docs/[...slug].js
→/docs/*
(キャッチオールルート 例:/docs/a/b
)pages/_app.js
→ カスタムApp (全ページ共通のレイアウト)pages/_document.js
→ カスタムDocument (<html>
,<head>
,<body>
タグのカスタマイズ)pages/404.js
→ カスタム404ページpages/500.js
→ カスタム500ページpages/api/hello.js
→/api/hello
(APIルート)
ナビゲーション (Pages Router):
ルート/検索パラメータの取得 (Pages Router):
データフェッチング
App Router
Server Componentsでは、async/await
を直接使用してデータを取得できます。
キャッシュ制御:
fetch
関数のオプションやルートセグメント設定でキャッシュ戦略を制御します。
Client Componentでのデータフェッチ:
従来通り useEffect
と fetch
や、SWR、React Queryなどのライブラリを使用します。
Server Actions (フォーム送信やMutation):
Client Componentからサーバー側の関数を直接呼び出せます。
Pages Router
ページごとに特定のデータフェッチ関数を使用します。
関数 | 実行タイミング | 主な用途 | 備考 |
---|---|---|---|
getStaticProps |
ビルド時 | SSG (Static Site Generation) | revalidate オプションで ISR に対応。context オブジェクトでパラメータ (params ) を受け取れる。 |
getStaticPaths |
ビルド時 | 動的ルートのSSGパス生成 | getStaticProps と併用必須。fallback オプション (true , false , 'blocking' ) でビルド時未指定パスの挙動を制御。 |
getServerSideProps |
リクエスト毎 (サーバーサイド) | SSR (Server-Side Rendering) | 常に最新のデータが必要なページ。context オブジェクトでリクエスト情報 (req , res , query など) を受け取れる。 |
getStaticProps
の例 (SSG):
getServerSideProps
の例 (SSR):
クライアントサイドフェッチ (Pages Router):
App RouterのClient Componentと同様に、useEffect
や SWR、React Queryを使用します。
コンポーネント (App Router)
App Routerでは、コンポーネントはデフォルトで Server Components です。
Server Components
- サーバーサイドでのみレンダリングされる。
- JavaScriptバンドルに含まれず、クライアントへの送信量が少ない。
- 直接データフェッチ (
async/await
) が可能。 - Node.jsのAPIやサーバーサイド専用ライブラリにアクセス可能 (データベース接続など)。
useState
,useEffect
などのフックや、ブラウザAPI (window
,document
) は使用不可。- イベントハンドラ (
onClick
など) は直接記述できない (Client Componentに渡す必要がある)。
Client Components
- ファイルの先頭に
'use client';
ディレクティブを記述する。 - 従来のReactコンポーネントと同様に動作し、クライアントサイドでレンダリング・ハイドレーションされる。
useState
,useEffect
,useContext
などのフックを使用可能。- イベントハンドラ (
onClick
,onChange
など) を使用可能。 - ブラウザAPI (
window
,localStorage
など) にアクセス可能。 - データフェッチは
useEffect
やSWR/React Queryなどで行う。
Server Components と Client Components の連携
- Server Components は Client Components をインポートして使用できる。
- Client Components は Server Components を直接インポートできない (propsとして渡すことは可能)。
- Server Components から Client Components へはシリアライズ可能な props (文字列、数値、オブジェクトなど、関数やDateオブジェクトは注意) を渡す。
- イベントハンドラなどのインタラクティブな要素は Client Component に実装する。
APIルート
サーバーサイドで実行されるAPIエンドポイントを作成します。
App Router (app/api/.../route.js
)
route.js
(または route.ts
) というファイル名を使用し、HTTPメソッドに対応する関数 (GET
, POST
, PUT
, DELETE
など) をエクスポートします。
レスポンス:
NextResponse
オブジェクトを使用してJSON、テキスト、リダイレクトなどを返します。
Pages Router (pages/api/...
)
pages/api
ディレクトリ内にファイルを作成し、デフォルトエクスポートとしてリクエストハンドラ関数を定義します。
リクエストオブジェクト (req
):
req.query
: クエリパラメータを含むオブジェクトreq.body
: パースされたリクエストボディ (Content-Type
に基づく)req.cookies
: クッキーを含むオブジェクトreq.method
: HTTPメソッド ('GET'
,'POST'
など)req.headers
: ヘッダー情報
レスポンスオブジェクト (res
):
res.status(code)
: HTTPステータスコードを設定res.json(body)
: JSONレスポンスを送信res.send(body)
: テキスト、Bufferなどのレスポンスを送信res.redirect([status,] url)
: リダイレクトres.setHeader(name, value)
: レスポンスヘッダーを設定res.end()
: レスポンスを終了
ミドルウェア連携:
APIルートの前段で共通処理 (認証、ロギングなど) を行いたい場合は、Next.js Middleware (下記参照) や、next-connect
のようなライブラリを利用できます。
スタイリング
Next.jsは様々なスタイリング手法に対応しています。
-
グローバルCSS:
pages/_app.js
(Pages Router) または ルートのlayout.js
(App Router) でグローバルなCSSファイル (例:styles/globals.css
) をインポートします。 -
CSS Modules:
ファイル名を*.module.css
(または.scss
/.sass
) とし、コンポーネントにインポートして使用します。クラス名は自動的に一意になります。 -
Sass/SCSS:
sass
パッケージをインストール (npm install sass
) すれば、.scss
や.sass
ファイルを直接インポートできます (CSS Modulesとしても利用可能)。 -
Tailwind CSS:
非常に人気のあるユーティリティファーストのCSSフレームワーク。 公式ドキュメントに従ってセットアップします (create-next-app
でも選択可能)。 -
CSS-in-JS ライブラリ:
Styled Components, Emotion など。App Routerでの利用には追加設定が必要な場合があります (特にServer Componentsとの連携)。- App Router + Emotion/Styled Components: Client Component内で使用し、公式ガイドに従ってレジストリ設定を行う必要があります。
画像最適化
next/image
コンポーネントを使用して、画像を自動的に最適化します。
- 最新フォーマット (WebPなど) への自動変換
- リサイズと最適化
- CLS (Cumulative Layout Shift) の防止
- 遅延読み込み (Lazy Loading)
注意点:
width
とheight
は、画像のアスペクト比を保つために重要です (fill
を除く)。- 外部ドメインの画像を使用するには、
next.config.js
のimages.domains
またはimages.remotePatterns
で設定が必要です。 - SVGファイルは通常、
next/image
を使わず、直接<img>
タグやReactコンポーネントとしてインポートして使用します。
スクリプト最適化
next/script
コンポーネントを使用して、サードパーティスクリプトの読み込み戦略を制御します。
strategy 値 |
読み込みタイミング | 主な用途 |
---|---|---|
beforeInteractive |
ページのハイドレーション前 (サーバー、クライアント) | サイト全体で必須のスクリプト (Cookie同意管理など) |
afterInteractive (デフォルト) |
ページのハイドレーション後 (クライアント) | インタラクティブ性が求められるスクリプト (分析ツール、広告タグなど) |
lazyOnload |
ブラウザのアイドル時 (クライアント) | バックグラウンドで実行される優先度の低いスクリプト (チャットウィジェットなど) |
worker (実験的) |
Web Worker内 (クライアント) | メインスレッドをブロックしたくない重い処理 (オフロード可能なもの) |
onLoad
, onError
, onReady
コールバック:
スクリプトの読み込み完了時やエラー時に処理を実行できます (strategy="beforeInteractive"
では onLoad
, onError
は使えません)。onReady
はスクリプトがロードされ、コンポーネントがマウントされた後に実行されます。
環境変数
Next.jsは .env
ファイルによる環境変数管理をサポートしています。
.env
: 全環境でのデフォルト値。.env.local
: ローカル環境での上書き。Gitで追跡しないこと。.env.development
: 開発環境 (next dev
) での値。.env.production
: 本番環境 (next start
) での値。.env.test
: テスト環境 (NODE_ENV=test
) での値。
優先順位: .env.{environment}.local
> .env.local
(test
除く) > .env.{environment}
> .env
サーバーサイドでのアクセス
Node.js 環境 (getServerSideProps
, APIルート, Server Components, getStaticProps
, ミドルウェアなど) では、process.env.YOUR_VARIABLE_NAME
で直接アクセスできます。
クライアントサイドでのアクセス
ブラウザで実行されるコード (通常のコンポーネント、Client Components) で環境変数を利用するには、変数名の先頭に NEXT_PUBLIC_
を付ける必要があります。
注意: NEXT_PUBLIC_
が付いた変数は、ビルド時にJavaScriptバンドルに埋め込まれます。機密情報 (APIキー、シークレットなど) には絶対に使用しないでください。
next.config.js
内の env
プロパティでもクライアントサイドで利用可能な変数を定義できますが、NEXT_PUBLIC_
プレフィックスの方が推奨されます。
ミドルウェア
リクエストが完了する前にコードを実行できます。認証、リダイレクト、ヘッダーの書き換え、A/Bテストなどに利用されます。
プロジェクトのルート (pages
や app
と同じ階層) に middleware.js
(または middleware.ts
) ファイルを作成します。
特徴:
- Edge Runtime で実行されるため、Node.js API の一部は利用できません (
fs
など)。 NextRequest
オブジェクトでリクエスト情報 (URL, ヘッダー, クッキー, geo情報など) にアクセスできます。NextResponse
オブジェクトを使って、リダイレクト (NextResponse.redirect
)、書き換え (NextResponse.rewrite
)、ヘッダー操作、レスポンスの生成が可能です。NextResponse.next()
を返すと、リクエスト処理が続行されます。config
オブジェクトのmatcher
で、ミドルウェアを適用するパスを指定します。
デプロイ
Next.jsアプリケーションのデプロイ方法はいくつかあります。
-
Vercel (推奨): Next.js の開発元であり、最もシームレスなデプロイ体験を提供します。
- Gitリポジトリ (GitHub, GitLab, Bitbucket) と連携して自動デプロイ。
- グローバルCDN、サーバーレス関数、画像最適化などを自動設定。
- 無料プランあり。
- コマンドラインツール:
vercel deploy
-
Node.js サーバー:
npm run build
でビルドし、npm start
で起動するNode.jsサーバーを自分でホストします。- AWS EC2, Google Cloud Run, DigitalOcean App Platform, Heroku などのプラットフォーム。
- インフラ管理 (スケーリング、ロギング、監視など) が必要。
-
静的エクスポート (Static HTML Export):
next.config.js
にoutput: 'export'
を設定し、npm run build
を実行すると、out
ディレクトリに静的なHTML/CSS/JSファイルが生成されます。- 画像最適化 (
next/image
) の一部機能、APIルート、ミドルウェア、ISR、SSRなどの動的な機能は利用できません。 - CDN (Netlify, Cloudflare Pages, AWS S3 + CloudFront など) に簡単にデプロイできます。
-
Docker:
- アプリケーションをコンテナ化して、Dockerをサポートする任意の環境 (Kubernetes, AWS ECS, etc.) にデプロイします。
- 公式ドキュメントに Dockerfile の例があります。
-
サーバーレスプラットフォーム (AWS Lambda, Google Cloud Functionsなど):
- アダプター (例: Serverless Framework, AWS CDK) を使用してデプロイすることが可能です。設定が複雑になる場合があります。
- Vercel や Netlify は内部的にサーバーレスアーキテクチャを利用しています。
デプロイ先を選ぶ際は、アプリケーションの要件 (動的機能の有無、スケーラビリティ、コスト、管理の手間など) を考慮してください。
その他の便利な機能
-
フォント最適化 (
next/font
):
Google Fontsやローカルフォントを効率的に読み込み、CLSを防ぎ、プライバシーを向上させます。ビルド時にフォントファイルを自己ホストします。 -
絶対インポートとパスエイリアス:
jsconfig.json
またはtsconfig.json
でパスエイリアスを設定し、深い階層からのインポートを簡潔にします。 -
ドラフトモード (Draft Mode):
ヘッドレスCMSなどから下書きコンテンツをプレビューするための機能。特定のCookieを設定することで、getStaticProps
や App Router のキャッシュをバイパスし、リクエスト時に最新データを取得します。- Pages Router:
res.setPreviewData({})
/res.clearPreviewData()
- App Router:
draftMode().enable()
/draftMode().disable()
(cookies()
を介して) - APIルートで有効化/無効化エンドポイントを作成するのが一般的です。
- Pages Router:
-
メタデータ (App Router):
layout.js
やpage.js
でmetadata
オブジェクトをエクスポートするか、generateMetadata
関数を使用して動的にメタデータ (<title>
,<meta>
など) を設定できます。