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ファイル
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.jsroute.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ファイル規則との潜在的な命名の競合を回避する。

補足:

  • フレームワークの規則ではありませんが、プライベートフォルダ外のファイルも同じアンダースコアパターンを使って「プライベート」としてマークすることを検討できます。
  • フォルダ名の先頭に%5F(アンダースコアのURL符号化形式)を付けることで、アンダースコアで始まる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

以下のセクションでは、一般的な戦略の非常に高レベルな概要を示します。最も簡単なポイントは、自分とチームに合った戦略を選択し、プロジェクト全体で一貫性を持たせることです。

補足: 以下の例では、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)の両方が独自のルートレイアウトを持っています。