メインコンテンツまでスキップ

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

このページでは、Next.jsにおけるフォルダとファイルの規約の概要と、プロジェクトを組織化するためのヒントを提供します。

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

トップレベルフォルダ

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

ルートセグメントからパスセグメントへの変換ルートセグメントからパスセグメントへの変換
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 .tsx見つからない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レベル上でのインターセプト
(...)folderrootからのインターセプト

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

アプリアイコン

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.txtロボットファイル
robots.js .ts生成されたロボットファイル

コンポーネントの階層

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

  • layout.js
  • template.js
  • error.js(React error boundary)
  • loading.js(React suspense boundary)
  • not-found.js(React error boundary)
  • page.jsまたはネストされたlayout.js
ファイル規約のためのコンポーネント階層ファイル規約のためのコンポーネント階層

ネストされたルートでは、セグメントのコンポーネントは親セグメントのコンポーネントの内側にネストされます。

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

プロジェクトの組織化

フォルダとファイルの規約とは別に、Next.jsはプロジェクトファイルの組織化や配置について特に意見を持っていません。しかし、プロジェクトを組織化するためのいくつかの機能を提供しています。

コロケーション

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

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

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

そして、ルートが公開されるときでも、クライアントに送信されるのはpage.jsまたはroute.jsによって返されるコンテンツのみです。

page.jsとroute.jsファイルがルートを公開可能にする方法を示す図。page.jsとroute.jsファイルがルートを公開可能にする方法を示す図。

これは、appディレクトリ内のルートセグメント内に安全にプロジェクトファイルを配置でき、誤ってルーティングされることがないことを意味します。

セグメントにpage.jsまたはroute.jsファイルが含まれていても、配置されたプロジェクトファイルがルーティングされないことを示す図。セグメントにpage.jsまたはroute.jsファイルが含まれていても、配置されたプロジェクトファイルがルーティングされないことを示す図。

Good to know:

プライベートフォルダ

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

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

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

appディレクトリ内のファイルはデフォルトで安全に配置できるため、コロケーションにはプライベートフォルダは必要ありません。しかし、以下のような場合に役立ちます:

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

Good to know:

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

ルートグループ

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

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

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

ルートグループは以下のような場合に役立ちます:

srcディレクトリ

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

`src`ディレクトリを使用したフォルダ構造の例`src`ディレクトリを使用したフォルダ構造の例

一般的な戦略

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

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

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

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

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

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

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

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

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

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

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