コンテンツにスキップ
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とインストルメンテーションファイル
proxy.tsNext.jsリクエストプロキシ
.env環境変数
.env.localローカル環境変数
.env.production本番環境変数
.env.development開発環境変数
.eslintrc.jsonESLintの設定ファイル
.gitignore無視するGitファイルとフォルダ
next-env.d.tsNext.jsのTypeScript宣言ファイル
tsconfig.jsonTypeScriptの設定ファイル
jsconfig.jsonJavaScriptの設定ファイル

ルーティングファイル

ルートを公開するにはpage、ヘッダー、ナビゲーション、フッターなどの共有UIにはlayout、スケルトンにはloading、エラー境界にはerror、APIにはrouteを追加します。

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

ネストされたルート

フォルダはURLセグメントを定義します。フォルダをネストするとセグメントがネストされます。任意のレベルのレイアウトが子セグメントをラップします。pageまたはrouteファイルが存在すると、ルートは公開されます。

パスURLパターン注釈
app/layout.tsxルートレイアウトはすべてのルートをラップします
app/blog/layout.tsx/blogおよびその子孫をラップします
app/page.tsx/公開ルート
app/blog/page.tsx/blog公開ルート
app/blog/authors/page.tsx/blog/authors公開ルート

動的ルート

角括弧でセグメントをパラメータ化します。単一のパラメータには[segment]、キャッチオールには[...segment]、オプションのキャッチオールには[[...segment]]を使用します。paramsプロップ経由で値にアクセスします。

パスURLパターン
app/blog/[slug]/page.tsx/blog/my-first-post
app/shop/[...slug]/page.tsx/shop/clothing/shop/clothing/shirts
app/docs/[[...slug]]/page.tsx/docs/docs/layouts-and-pages/docs/api-reference/use-router

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

ルートグループ (group) でURLを変更せずにコードを整理し、プライベートフォルダ _folder でルーティング不可能なファイルをコロケーションします。

パスURLパターン注釈
app/(marketing)/page.tsx/URLから除外されるグループ
app/(shop)/cart/page.tsx/cart(shop)内でレイアウトを共有する
app/blog/_components/Post.tsxルーティング不可。UIユーティリティの安全な場所
app/blog/_lib/data.tsルーティング不可。ユーティリティの安全な場所

並列ルートとインターセプトルート

これらの機能は、スロットベースのレイアウトやモダールルーティングなどの特定のUIパターンに適合します。

親レイアウトによってレンダリングされる名前付きスロットには@slotを使用します。URLを変更せずに現在のレイアウト内で別のルートをレンダリングするには、インターセプトパターンを使用します。たとえば、リストの上に詳細ビューをモダールとして表示するなどです。

パターン (ドキュメント)意味典型的な使用例
@folder名前付きスロットサイドバー + メインコンテンツ
(.)folder同レベルをインターセプトモダールで兄弟ルートをプレビューする
(..)folder親をインターセプト親の子をオーバーレイとして開く
(..)(..)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 Suspense境界)
  • not-found.js ("見つからない"UIのための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.

知っておくと良いこと: 以下の例では、componentsおよびlibフォルダを一般的なプレースホルダーとして使用していますが、その名前付けには特別なフレームワークの意味はありません。プロジェクトではuiutilshooksstylesなど、他のフォルダを使用する場合があります。

プライベートフォルダ

プライベートフォルダは、フォルダ名の前にアンダースコアを付けて作成できます: _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は、オプションのsrcフォルダ内にアプリケーションコード(appを含む)を格納することをサポートしています。これにより、アプリケーションコードと、ほとんどがプロジェクトのルートに配置されるプロジェクト設定ファイルが分離されます。

An example folder structure with the `src` folder

次のセクションでは、一般的な戦略の非常に高レベルな概要をリストします。最も単純な要点は、あなたとあなたのチームにとって機能する戦略を選択し、プロジェクト全体で一貫性を保つことです。

知っておくと良いこと: 以下の例では、componentslibフォルダを一般的なプレースホルダーとして使用していますが、それらの名前付けには特別なフレームワークの意味はありません。プロジェクトではuiutilshooksstylesなどの他のフォルダを使用する場合があります。

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))を作成し、同じレイアウトを共有するルート(例:accountcart)をグループに移動します。グループ外のルートはレイアウトを共有しません(例: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やエクスペリエンスを持つセクションに分割する場合に役立ちます。<html>および<body>タグは、各ルートレイアウトに追加する必要があります。

Route Groups with Multiple Root Layouts

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