コンテンツにスキップ
App Routerはじめにプロジェクトの構造

プロジェクトの構造と構成

このページでは、Next.jsにおけるすべてのフォルダとファイルの規約、およびプロジェクトを整理するための推奨事項について概要を説明します。

フォルダとファイルの規約

トップレベルフォルダ

トップレベルフォルダは、アプリケーションのコードと静的アセットを整理するために使用されます。

Route segments to path segments
appApp Router
pagesPages Router
public配信される静的アセット
srcオプションのアプリケーションソースフォルダ

トップレベルファイル

トップレベルファイルは、アプリケーションの設定、依存関係の管理、ミドルウェアの実行、監視ツールの統合、環境変数の定義に使用されます。

Next.js
next.config.jsNext.jsの設定ファイル
package.jsonプロジェクトの依存関係とスクリプト
instrumentation.tsOpenTelemetryおよびインストルメンテーションファイル
middleware.tsNext.jsリクエストミドルウェア
.env環境変数
.env.localローカル環境変数
.env.production本番環境変数
.env.development開発環境変数
.eslintrc.jsonESLintの設定ファイル
.gitignore無視するGitファイルとフォルダ
next-env.d.tsNext.js用TypeScript宣言ファイル
tsconfig.jsonTypeScriptの設定ファイル
jsconfig.jsonJavaScriptの設定ファイル

ルーティングファイル

layout.js .jsx .tsxレイアウト
page.js .jsx .tsxページ
loading.js .jsx .tsxローディングUI
not-found.js .jsx .tsxNot Found UI
error.js .jsx .tsxエラーUI
global-error.js .jsx .tsxグローバルエラーUI
route.js .tsAPIエンドポイント
template.js .jsx .tsx再レンダリングされるレイアウト
default.js .jsx .tsx並列ルーティングのフォールバックページ

ネストされたルーティング

folderルートセグメント
folder/folderネストされたルートセグメント

動的ルーティング

[folder]動的ルートセグメント
[...folder]キャッチオールルートセグメント
[[...folder]]オプションのキャッチオールルートセグメント

ルーティンググループとプライベートフォルダ

(folder)ルーティングに影響を与えずにルーティングをグループ化
_folderフォルダとそのすべての子セグメントをルーティングから除外する

並列およびインターセプトルーティング

@folder名前付きスロット
(.)folder同レベルをインターセプト
(..)folder1つ上のレベルをインターセプト
(..)(..)folder2つ上のレベルをインターセプト
(...)folderルートからインターセプト

メタデータファイルの規約

アプリのアイコン

favicon.icoファビコンファイル
icon.ico .jpg .jpeg .png .svgアプリのアイコンファイル
icon.js .ts .tsx生成されたアプリのアイコン
apple-icon.jpg .jpeg, .pngAppleアプリのアイコンファイル
apple-icon.js .ts .tsx生成されたAppleアプリのアイコン

Open GraphとTwitter画像

opengraph-image.jpg .jpeg .png .gifOpen Graph画像ファイル
opengraph-image.js .ts .tsx生成されたOpen Graph画像
twitter-image.jpg .jpeg .png .gifTwitter画像ファイル
twitter-image.js .ts .tsx生成されたTwitter画像

SEO

sitemap.xmlサイトマップファイル
sitemap.js .ts生成されたサイトマップ
robots.txtRobotsファイル
robots.js .ts生成されたRobotsファイル

プロジェクトの整理

Next.jsはプロジェクトファイルの整理やコロケーション(共存)方法について特に意見を持ちません。しかし、プロジェクトを整理するのに役立ついくつかの機能を提供します。

コンポーネント階層

特殊ファイルで定義されたコンポーネントは、特定の階層でレンダリングされます

  • layout.js
  • template.js
  • error.js (Reactエラー境界)
  • loading.js (Reactサスペンス境界)
  • not-found.js (Reactエラー境界)
  • page.js またはネストされた layout.js
Component Hierarchy for File Conventions

コンポーネントはネストされたルーティングで再帰的にレンダリングされます。これは、ルーティングセグメントのコンポーネントが親セグメントのコンポーネントの内側にネストされることを意味します。

Nested File Conventions Component Hierarchy

コロケーション (共存)

`app` ディレクトリでは、ネストされたフォルダがルーティング構造を定義します。各フォルダは、URLパス内の対応するセグメントにマッピングされるルートセグメントを表します。

しかし、ルーティング構造がフォルダを通じて定義されているにもかかわらず、ルートセグメントに `page.js` または `route.js` ファイルが追加されるまで、ルーティングは公開アクセス可能になりません

A diagram showing how a route is not publicly accessible until a page.js or route.js file is added to a route segment.

そして、ルーティングが公開アクセス可能になった場合でも、`page.js` または `route.js` によって返されるコンテンツのみがクライアントに送信されます。

A diagram showing how page.js and route.js files make routes publicly accessible.

これは、プロジェクトファイルを`app`ディレクトリ内のルートセグメント内に誤ってルーティング可能になることなく、安全にコロケート(共存)できることを意味します。

A diagram showing colocated project files are not routable even when a segment contains a page.js or route.js file.

知っておくと良いこと: `app`内にプロジェクトファイルをコロケートすることはできますが、必須ではありません。もしよろしければ、`app`ディレクトリの外に置いておくことも可能です。

プライベートフォルダ

プライベートフォルダは、フォルダ名の先頭にアンダースコアを付けることで作成できます: _folderName

これは、そのフォルダがプライベートな実装詳細であり、ルーティングシステムによって考慮されるべきではないことを示し、それによってそのフォルダとすべてのサブフォルダがルーティングから除外されます。

An example folder structure using private folders

`app`ディレクトリ内のファイルはデフォルトで安全にコロケートできるため、プライベートフォルダはコロケーションに必須ではありません。ただし、以下の目的で役立ちます。

  • UIロジックをルーティングロジックから分離する。
  • プロジェクト全体およびNext.jsエコシステム全体で内部ファイルを一貫して整理する。
  • コードエディタでファイルをソートおよびグループ化する。
  • 将来のNext.jsファイル規約との潜在的な名前の衝突を回避する。

知っておくと良いこと:

  • フレームワークの規約ではありませんが、プライベートフォルダ外のファイルも同じアンダースコアパターンを使用して「プライベート」としてマークすることを検討することもできます。
  • アンダースコアで始まるURLセグメントは、フォルダ名の先頭に`%5F`(アンダースコアのURLエンコード形式)を付けることで作成できます: `%5FfolderName`。
  • プライベートフォルダを使用しない場合、予期せぬ名前の衝突を防ぐためにNext.jsの特殊なファイル規約を知っておくと役立つでしょう。

ルーティンググループ

ルーティンググループは、フォルダを括弧で囲むことで作成できます: (folderName)

これは、そのフォルダが組織的な目的のものであり、ルーティングのURLパスには含まれるべきではないことを示します。

An example folder structure using route groups

ルーティンググループは以下の目的で役立ちます。

srcディレクトリ

Next.jsは、アプリケーションコード(`app`を含む)をオプションの`src`ディレクトリ内に保存することをサポートしています。これにより、アプリケーションコードが、主にプロジェクトのルートに存在するプロジェクト設定ファイルから分離されます。

An example folder structure with the `src` directory

以下のセクションでは、一般的な戦略の非常に高レベルな概要を示します。最もシンプルな結論は、あなたとあなたのチームに適した戦略を選択し、プロジェクト全体で一貫性を保つことです。

知っておくと良いこと: 以下の例では、`components` と `lib` フォルダを一般的なプレースホルダーとして使用しています。これらの名前にはフレームワーク上の特別な意味はなく、あなたのプロジェクトでは `ui`、`utils`、`hooks`、`styles` などの他のフォルダを使用することもできます。

app 外にプロジェクトファイルを保存する

この戦略では、すべてのアプリケーションコードをプロジェクトのルートにある共有フォルダに保存し、`app` ディレクトリはルーティング専用として維持します。

An example folder structure with project files outside of app

app 内のトップレベルフォルダにプロジェクトファイルを保存する

この戦略では、すべてのアプリケーションコードを`app` ディレクトリのルートにある共有フォルダに保存します。

An example folder structure with project files inside app

機能またはルーティングごとにプロジェクトファイルを分割する

この戦略では、グローバルに共有されるアプリケーションコードをルートの`app`ディレクトリに保存し、より特定のアプリケーションコードは、それらを使用するルートセグメントに分割します。

An example folder structure with project files split by feature or route

URLパスに影響を与えずにルーティングを整理する

URLに影響を与えずにルーティングを整理するには、関連するルーティングをまとめるグループを作成します。括弧内のフォルダはURLから省略されます(例: `(marketing)` または `(shop)`)。

Organizing Routes with Route Groups

(marketing)(shop)内のルーティングは同じURL階層を共有していますが、それぞれのフォルダ内に`layout.js`ファイルを追加することで、各グループに異なるレイアウトを作成できます。

Route Groups with Multiple Layouts

特定のセグメントをレイアウトにオプトインする

特定のルーティングをレイアウトに含めるには、新しいルーティンググループ(例: `(shop)`)を作成し、同じレイアウトを共有するルーティング(例: `account`や`cart`)をそのグループに移動します。グループ外のルーティングはレイアウトを共有しません(例: `checkout`)。

Route Groups with Opt-in Layouts

特定のルーティングでローディングスケルトンをオプトインする

特定のルーティングに`loading.js`ファイル経由でローディングスケルトンを適用するには、新しいルーティンググループ(例:`/(overview)`)を作成し、`loading.tsx`をそのルーティンググループ内に移動します。

Folder structure showing a loading.tsx and a page.tsx inside the route group

これにより、`loading.tsx`ファイルは、URLパス構造に影響を与えることなく、すべてのダッシュボードページではなく、ダッシュボード → 概要ページにのみ適用されるようになります。

複数のルートレイアウトを作成する

複数のルートレイアウトを作成するには、トップレベルの`layout.js`ファイルを削除し、各ルーティンググループ内に`layout.js`ファイルを追加します。これは、アプリケーションを完全に異なるUIやエクスペリエンスを持つセクションに分割するのに役立ちます。``と``タグは各ルートレイアウトに追加する必要があります。

Route Groups with Multiple Root Layouts

上記の例では、`(marketing)`と`(shop)`の両方が独自のルートレイアウトを持っています。