Skip to content

NextJS 13 フォルダ構成 ​

Next.js 13のApp Routerでは、新しいフォルダ構造やルーティングシステムが導入され、効率的なプロジェクト管理が可能になりました。本記事ではベストプラクティスを紹介します。

重要ポイント

  • /appディレクトリはルート専用に最適化
  • フォルダ命名規則で役割を明確化
  • ルートグループで関連ページを整理

問題点 ​

Next.js 13のApp Router導入時に以下の点で混乱が生じます:

  1. ログイン/登録ページの配置場所
  2. コンポーネントの整理方法
  3. 関連コンポーネントのグルーピング
  4. ルーティング構造の明確化
  5. ファイル配置によるチームメンバーへの意図伝達

解決策 ​

基本原則 ​

bash
my-project/
├── src/                  # 推奨: アプリコードの分離
│   ├── app/              # ルーティング専用
│   ├── components/       # 全コンポーネント
│   ├── lib/              # ユーティリティ
│   └── services/         # API通信(オプション)
├── public/
├── next.config.js
└── package.json

1. /appディレクトリの活用 ​

ルーティング専用に使用し、内部をシンプルに保ちます:

bash
src/app/
├── (auth)/               # ルートグループ
│   ├── login/
│   │   └── page.tsx      # /login
│   ├── register/
│   │   └── page.tsx      # /register
│   └── layout.tsx        # 認証共通レイアウト
├── dashboard/
│   └── page.tsx          # /dashboard
├── (admin)/              # 管理者用グループ
│   └── settings/
│       └── page.tsx      # /admin/settings
└── layout.tsx            # グローバルレイアウト

注意

ルートグループ(括弧()で囲んだフォルダ)はURLパスに含まれず、以下の用途で有用です:

  • 共通レイアウトの共有
  • 関連ルートの論理的分離
  • 認証状態によるルーティング制御

2. コンポーネントの整理方法 ​

bash
src/components/
├── common/               # 汎用コンポンネント
│   ├── Button.tsx
│   └── Card.tsx
├── auth/                 # 認証関連
│   ├── LoginForm.tsx
│   └── RegisterForm.tsx
├── dashboard/            # ダッシュボード固有
│   ├── Widget.tsx
│   └── Chart.tsx
└── ui/                   # UI プリミティブ
    ├── Alert.tsx
    └── Dialog.tsx

3. /libディレクトリの活用 ​

bash
src/lib/
├── constants.ts          # 定数管理
├── types.ts              # TypeScript型定義
├── utils.ts              # 汎用関数
├── validators.ts         # バリデーション
└── fonts.ts              # フォント設定

高度な構成テクニック ​

プライベートフォルダの使用 ​

非ルート関連ファイルには_プレフィックスを付加:

bash
src/app/
├── _components/          # ルート用コンポーネント
├── _hooks/               # カスタムフック
├── _providers/           # プロバイダー
└── (routes)/
    └── marketplace/
        └── page.tsx

ルートグループの活用パターン ​

tsx
export default function AuthLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <div className="auth-container">
      {/* 認証ページ共通のUI */}
      {children}
    </div>
  )
}

推奨構成例 ​

bash
src/
├── app/
│   ├── (auth)/
│   │   ├── login/
│   │   │   └── page.tsx
│   │   ├── register/
│   │   │   └── page.tsx
│   │   └── layout.tsx
│   ├── dashboard/
│   │   └── page.tsx
│   ├── _components/      # ルート固有コンポーネント
│   ├── _test/            # ルート関連テスト
│   └── layout.tsx
├── components/
│   ├── common/
│   ├── ui/
│   └── shared/
├── lib/
│   ├── utils.ts
│   ├── types.ts
│   └── constants.ts
├── services/             # API通信層
├── stores/               # 状態管理(Zustand等)
└── styles/               # グローバルスタイル

ベストプラクティス ​

  1. 一貫性の維持: チームで命名規則を統一
  2. 分離の原則:
    • ルーティング: /app
    • 表示層: /components
    • ビジネスロジック: /lib, /services
  3. スケーラビリティ: 機能追加時に迷いのない配置を
  4. 自己文書化: フォルダ名で意図を明確化

公式ドキュメント:

上記構造で開発効率と保守性を大幅に向上させられます。プロジェクト規模に応じて柔軟に段階適用してください。