はじめに
Next.js の App Router では、特定の名前を持つファイルが特殊な役割を果たします。このガイドでは、ファイルシステム規約について、各ファイルの役割と実践的な使い方を学んでいきます。ファイルシステム規約とは
Next.js App Router では、appディレクトリ内の特定のファイル名が予約されており、それぞれが特別な機能を提供します。これにより、ルーティング、レイアウト、エラーハンドリングなどが宣言的に実装できます。
主要なファイル規約一覧
ルーティングファイル
メタデータファイル
その他の設定ファイル
page.tsx - ページの定義
基本的な使い方
page.tsxは、そのディレクトリを公開可能な URL として定義します。このファイルがないディレクトリは、URL としてアクセスできません。
Dynamic Route での使用
layout.tsx - 共有レイアウト
基本的な使い方
layout.tsxは、複数のページで共有される UI を定義します。子ルートに自動的に適用され、ページ遷移時も再レンダリングされません。
ネストされたレイアウト
ネストされたレイアウトとは、親のレイアウトの中に子のレイアウトが入れ子になっている構造のことです。Next.js では、ディレクトリ階層に沿って自動的にレイアウトがネストされます。レイアウトの継承構造
/dashboard/analytics ページは以下の順序でレイアウトが適用されます:
- ルートレイアウト (
app/layout.tsx) - 全体の HTML 構造 - ダッシュボードレイアウト (
app/dashboard/layout.tsx) - ダッシュボード共通 UI - 分析レイアウト (
app/dashboard/analytics/layout.tsx) - 分析セクション固有 UI - ページコンテンツ (
app/dashboard/analytics/page.tsx) - 実際のページ
実装例
レンダリング結果
/dashboard/analytics にアクセスした場合の HTML 構造:
メリット
- 再利用性: 共通の UI を複数のページで共有
- 保守性: レイアウトの変更が該当するセクションのみに影響
- パフォーマンス: ページ遷移時にレイアウトは再レンダリングされない
- ユーザー体験: 状態を保持したままページ間を移動可能
loading.tsx - ローディング UI
基本的な使い方
loading.tsxは、ページやセグメントのロード中に表示される UI を定義します。React Suspense を使用して自動的に適用されます。
スケルトンスクリーンの実装
スケルトンスクリーンとは
スケルトンスクリーン(Skeleton Screen)とは、コンテンツの読み込み中に表示される仮のUIのことです。実際のコンテンツの構造やレイアウトを模倣したグレーや薄い色のボックスで構成され、以下のメリットがあります:- 体感速度の向上: 真っ白な画面や単純なスピナーよりも読み込みが早く感じられる
- レイアウトシフトの防止: コンテンツが読み込まれた際のレイアウトのずれを防ぐ
- ユーザー体験の向上: 何が読み込まれるかを事前に示すことで、ユーザーの不安を軽減
実装例
商品一覧ページのスケルトンスクリーンの例:CSS例
ベストプラクティス
- 実際のレイアウトに近づける: 最終的なコンテンツと同じ構造にする
- 適切な数の要素: 実際に表示される要素数と合わせる
- アニメーション: 微細なパルス効果で読み込み中であることを示す
- 一貫性: アプリケーション全体で統一されたスケルトンデザインを使用
error.tsx - エラーハンドリング
基本的な使い方
error.tsxは、エラーが発生した際のフォールバック UI を提供します。
フォールバック(Fallback)とは自動的に React Error Boundary でラップされます。
何らかの問題が発生した時に代替として表示される UI のことです。通常の処理が失敗した場合に「代わりに」表示されるコンテンツを指します。
セグメント固有のエラー処理
not-found.tsx - 404 ページ
基本的な使い方
not-found.tsxは、特定のルートセグメントが見つからない場合に表示されます。
notFound() 関数との連携
template.tsx - 再マウントされるレイアウト
基本的な使い方
template.tsxは、layout.tsxと似ていますが、ページ間を移動する際(ナビゲーション時)に新しいインスタンスが作成されます。
ナビゲーション時とは
ナビゲーション時とは、ユーザーがページ間を移動する時のことです。具体的には以下のような場面を指します:- リンククリック:
<Link>や<a>タグをクリックして別のページに移動 - ブラウザ操作: 戻る・進むボタンを使用してページを移動
- 直接アクセス: URLバーに直接URLを入力してページにアクセス
- プログラム実行:
router.push()やrouter.replace()などを実行
layout.tsx と template.tsx の違い
両者の主な違いは、ページ遷移時のコンポーネントの扱いです:| ファイル | ページ遷移時の動作 | 状態の保持 | 使用場面 |
|---|---|---|---|
layout.tsx | コンポーネントが再利用される | 状態が保持される | ナビゲーション、サイドバーなど永続的なUI |
template.tsx | 新しいインスタンスが作成される | 状態がリセットされる | ページ遷移アニメーション、毎回リセットしたい状態 |
アニメーション付きテンプレート
route.tsx - API エンドポイント
基本的な使い方
route.tsxは、API エンドポイントを定義します。HTTP メソッドに対応する関数をエクスポートします。
API ルートの配置について
route.ts(または route.js)ファイルは app ディレクトリ内のどこにでも配置できますが、実際の動作は配置場所によって異なります:
| 配置場所 | URL | 動作 | 推奨度 |
|---|---|---|---|
app/api/hello/route.ts | /api/hello | API エンドポイントとして動作 | ✅ 推奨 |
app/hello/route.ts | /hello | API エンドポイントとして動作 | ⚠️ 非推奨 |
route.tsとpage.tsは同じディレクトリに共存できませんapp/hello/route.tsがある場合、app/hello/page.tsは作成できません- 慣例的に API ルートは
app/api/配下に配置することが強く推奨されます
基本的な実装例
api 配下以外に配置した場合の例
- 混乱を招く: ページなのかAPIなのかが不明確
- 保守性の問題: API とページが混在して管理が困難
- チーム開発の問題: 他の開発者が理解しにくい
- Next.js の慣例に反する: 公式ドキュメントでも
api/配下を推奨
Dynamic Route での API
middleware.ts - リクエスト処理
基本的な使い方
middleware.tsは、リクエストが完了する前にコードを実行します。
default.js - 並行ルートのフォールバック
基本的な使い方
default.jsは、並行ルートで初回ロード時やリロード時にマッチするセグメントがない場合のフォールバック(代替コンテンツ)を提供します。
global-error.tsx - グローバルエラーハンドリング
基本的な使い方
global-error.tsxは、ルートレイアウトでのエラーをキャッチします。production 環境でのみ有効です。
メタデータファイル規約
メタデータとは
メタデータ(metadata)とは、「データについてのデータ」を意味します。Web ページにおけるメタデータは、そのページの内容を説明する情報で、主に以下の用途で使用されます:- 検索エンジン最適化(SEO): ページタイトル、説明文、キーワードなど
- ソーシャルメディア共有: OGP(Open Graph Protocol)画像、Twitter Card 情報
- ブラウザ表示: ファビコン、テーマカラー、ビューポート設定
- アプリケーション設定: PWA マニフェスト、アプリアイコン
メタデータファイルとは
Next.js App Router では、特定の名前を持つファイルを配置するだけで、自動的にメタデータが生成・配信されます。これらのファイルは:- 静的ファイル: 画像やテキストファイルを直接配置(例:
favicon.ico、robots.txt) - 動的生成ファイル: TypeScript/JavaScript で動的に生成(例:
sitemap.ts、opengraph-image.tsx)
favicon, icon, apple-icon
アプリケーションのアイコンを設定します。opengraph-image と twitter-image
ソーシャルメディアでの共有時に表示される画像を設定します。manifest.json
PWA(Progressive Web App)の設定を定義します。robots.txt
検索エンジンクローラーの動作を制御します。sitemap.xml
サイトマップを生成して SEO を向上させます。Route Segment Config
ページの動作を制御する設定をエクスポートできます。generateStaticParams
Dynamic Route の静的生成パラメータを定義します。generateMetadata
ページのメタデータを動的に生成します。Route Segment Config オプション
実践例:完全なブログアプリケーション
すべてのファイル規約を使用した例:完全な実装例
ベストプラクティス
1. 適切なファイルの選択
- layout.tsx: ナビゲーションやフッターなど、永続的な UI に使用
- template.tsx: ページ遷移アニメーションが必要な場合に使用
- loading.tsx: データフェッチが必要なページで必ず実装
- error.tsx: セグメント固有のエラー処理に使用
- global-error.tsx: 本番環境でのルートレベルエラーに使用
2. エラーハンドリングの階層
3. メタデータの最適化
- 静的ファイル: 変更頻度が低い場合は画像ファイルを直接配置
- 動的生成: ページごとに異なる画像が必要な場合は
.tsxで生成 - キャッシング: Next.js が自動的にハッシュを付けてキャッシュ
4. SEO とアクセシビリティ
5. パフォーマンスの最適化
6. ミドルウェアの設定
まとめ
Next.js のファイルシステム規約により:- 宣言的な実装: ファイル名で機能が決まる
- 自動的な適用: 設定不要で機能が有効化
- 段階的な拡張: 必要に応じてファイルを追加
- 優れた DX: 直感的で理解しやすい構造