プロジェクト構造と構成

このページでは、Next.jsにおけるすべてのフォルダとファイルの規約の概要と、プロジェクトを構成するための推奨事項を提供します。

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

トップレベルフォルダ

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

ルートセグメントからパスセグメントへ
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の設定ファイル
.gitignoreGitで無視するファイルとフォルダ
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 .tsx404 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
ファイル規約のコンポーネント階層

コンポーネントはネストされたルートで再帰的にレンダリングされるため、ルートセグメントのコンポーネントはその親セグメントのコンポーネントの内側にネストされます。

ネストされたファイル規約のコンポーネント階層

コロケーション (Colocation)

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

ただし、ルート構造がフォルダで定義されていても、ルートセグメントにpage.jsまたはroute.jsファイルが追加されるまで、そのルートは公開アクセス可能になりません

ルートセグメントにpage.jsまたはroute.jsファイルが追加されるまでルートが公開されないことを示す図

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

page.jsとroute.jsファイルがルートを公開アクセス可能にする仕組みを示す図

これは、appディレクトリ内のルートセグメントに**プロジェクトファイルを安全にコロケーション(同居)**させても、誤ってルーティング可能にならないことを意味します。

セグメントにpage.jsやroute.jsファイルがあっても、コロケーションされたプロジェクトファイルはルーティングされないことを示す図

知っておくと便利: app内にプロジェクトファイルをコロケーションすることは可能ですが、必須ではありません。必要に応じてappディレクトリの外に保管することもできます。

プライベートフォルダ (Private folders)

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

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

プライベートフォルダを使用したフォルダ構造の例

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

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

知っておくと便利:

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

ルートグループ (Route groups)

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

これは、そのフォルダが整理目的であり、ルートのURLパスに含まれないことを示します。

ルートグループを使用したフォルダ構造の例

ルートグループは以下の用途に便利です:

srcフォルダ

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

`src`フォルダを使用したフォルダ構造の例

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

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

appの外にプロジェクトファイルを保管

この戦略では、すべてのアプリケーションコードをプロジェクトルートの共有フォルダに保管し、appディレクトリは純粋にルーティング目的のみに使用します。

プロジェクトファイルをappの外に保管したフォルダ構造の例

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

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

プロジェクトファイルをapp内に保管したフォルダ構造の例

機能やルートごとにプロジェクトファイルを分割

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

機能やルートごとにプロジェクトファイルを分割したフォルダ構造の例

URLパスに影響を与えずにルートを整理

URLに影響を与えずにルートを整理するには、関連するルートをまとめて保持するグループを作成します。括弧内のフォルダはURLから除外されます(例: (marketing)(shop))。

ルートグループを使用したルート整理

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

複数のレイアウトを持つルートグループ

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

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

オプトインレイアウトを持つルートグループ

特定のルートにローディングスケルトンを適用

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

ルートグループ内のloading.tsxとpage.tsxを示すフォルダ構造

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

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

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

複数のルートレイアウトを持つルートグループ

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