Menu

プロジェクト構造と組織化

このページでは、Next.jsのすべてのフォルダとファイルの規則、およびプロジェクトを組織化するための推奨事項の概要を示します。

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

トップレベルフォルダ

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

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

トップレベルファイル

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

Next.js
next.config.jsNext.jsの設定ファイル
package.jsonプロジェクトの依存関係とスクリプト
instrumentation.tsOpenTelemetryとInstrumentationファイル
proxy.tsNext.jsリクエストプロキシ
.env環境変数
.env.localローカル環境変数
.env.production本番環境変数
.env.development開発環境変数
eslint.config.mjsESLint 設定ファイル
.gitignoreGitで無視するファイルとフォルダ
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 .tsxLoading UI
not-found.js .jsx .tsxNot Found UI
error.js .jsx .tsxError UI
global-error.js .jsx .tsxGlobal Error UI
route.js .tsAPIエンドポイント
template.js .jsx .tsx再レンダリングされるレイアウト
default.js .jsx .tsxParallel Routeフォールバックページ

ネストされたルート

フォルダは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ルート不可;ユーティリティの安全な場所

Parallel RoutesとIntercepted Routes

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

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

パターン(ドキュメント)意味典型的なユースケース
@folder名前付きスロットサイドバー+メインコンテンツ
(.)folder同じレベルをインターセプト兄弟ルートをモーダルでプレビュー
(..)folder親をインターセプト親の子をオーバーレイとして開く
(..)(..)folder2つのレベルをインターセプト深くネストされたオーバーレイ
(...)folderルートからインターセプト任意のルートを現在のビューに表示

メタデータファイル規則

アプリアイコン

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

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.xmlSitemapファイル
sitemap.js .ts生成されたSitemap
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.

補足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` 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 Skeletonsをオプトインする

Loading Skeletonloading.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)の両方が独自のルートレイアウトを持っています。