プロジェクト構造と編成
このページでは、Next.jsにおけるフォルダとファイルの規則の概要と、プロジェクトを整理するためのヒントを提供します。
フォルダとファイルの規則
トップレベルフォルダ
トップレベルフォルダは、アプリケーションのコードと静的アセットを整理するために使用されます。
トップレベルファイル
トップレベルファイルは、アプリケーションの設定、依存関係の管理、ミドルウェアの実行、監視ツールの統合、環境変数の定義などに使用されます。
Next.js | |
next.config.js | Next.jsの設定ファイル |
package.json | プロジェクトの依存関係とスクリプト |
instrumentation.ts | OpenTelemetryと計装ファイル |
middleware.ts | Next.jsリクエストミドルウェア |
.env | 環境変数 |
.env.local | ローカル環境変数 |
.env.production | 本番環境の環境変数 |
.env.development | 開発環境の環境変数 |
.eslintrc.json | ESLintの設定ファイル |
.gitignore | Gitで無視するファイルとフォルダ |
next-env.d.ts | Next.js用のTypeScript宣言ファイル |
tsconfig.json | TypeScriptの設定ファイル |
jsconfig.json | JavaScriptの設定ファイル |
ルーティングファイル
layout | .js .jsx .tsx | レイアウト |
page | .js .jsx .tsx | ページ |
loading | .js .jsx .tsx | ローディングUI |
not-found | .js .jsx .tsx | Not found UI |
error | .js .jsx .tsx | エラーUI |
global-error | .js .jsx .tsx | グローバルエラーUI |
route | .js .ts | APIエンドポイント |
template | .js .jsx .tsx | 再レンダリングされるレイアウト |
default | .js .jsx .tsx | 並列ルートのフォールバックページ |
ネストされたルート
folder | ルートセグメント |
folder/folder | ネストされたルートセグメント |
動的ルート
[folder] | 動的ルートセグメント |
[...folder] | キャッチオールルートセグメント |
[[...folder]] | オプショナルキャッチオールルートセグメント |
ルートグループとプライベートフォルダ
並列ルートとインターセプトルート
@folder | 名前付きスロット |
(.)folder | 同じレベルでインターセプト |
(..)folder | 1レベル上でインターセプト |
(..)(..)folder | 2レベル上でインターセプト |
(...)folder | ルートからインターセプト |
メタデータファイルの規則
アプリアイコン
favicon | .ico | ファビコンファイル |
icon | .ico .jpg .jpeg .png .svg | アプリアイコンファイル |
icon | .js .ts .tsx | 生成されたアプリアイコン |
apple-icon | .jpg .jpeg , .png | Appleアプリアイコンファイル |
apple-icon | .js .ts .tsx | 生成されたAppleアプリアイコン |
Open GraphとTwitter画像
opengraph-image | .jpg .jpeg .png .gif | Open Graph画像ファイル |
opengraph-image | .js .ts .tsx | 生成されたOpen Graph画像 |
twitter-image | .jpg .jpeg .png .gif | Twitter画像ファイル |
twitter-image | .js .ts .tsx | 生成されたTwitter画像 |
SEO
コンポーネント階層
ルートセグメントの特殊ファイルで定義されたReactコンポーネントは、特定の階層でレンダリングされます:
layout.js
template.js
error.js
(Reactエラー境界)loading.js
(Reactサスペンス境界)not-found.js
(Reactエラー境界)page.js
またはネストされたlayout.js
ネストされたルートでは、セグメントのコンポーネントは親セグメントのコンポーネントの内部にネストされます。
プロジェクトの整理
フォルダとファイルの規則以外に、Next.jsはプロジェクトファイルの整理と配置について特定の意見を持っていません。しかし、プロジェクトの整理を助けるためのいくつかの機能を提供しています。
コロケーション(併置)
app
ディレクトリでは、ネストされたフォルダがルート構造を定義します。各フォルダはルートセグメントを表し、URLパス内の対応するセグメントにマッピングされます。
しかし、ルート構造はフォルダを通じて定義されますが、ルートセグメントにpage.js
またはroute.js
ファイルが追加されるまで、ルートは公開アクセス可能ではありません。
また、ルートが公開アクセス可能になった場合でも、page.js
またはroute.js
によって返されるコンテンツのみがクライアントに送信されます。
これは、プロジェクトファイルを誤ってルーティング可能にすることなく、app
ディレクトリ内のルートセグメント内に安全に併置できることを意味します。
補足:
- プロジェクトファイルを
app
内に併置できますが、必ずしもそうする必要はありません。必要に応じて、app
ディレクトリの外部にプロジェクトファイルを保存することもできます。
プライベートフォルダ
フォルダ名の先頭にアンダースコアを付けることで、プライベートフォルダを作成できます:_folderName
これは、そのフォルダが非公開の実装詳細であり、ルーティングシステムによって考慮されるべきではないことを示し、そのフォルダとそのすべてのサブフォルダをルーティングから除外します。
app
ディレクトリ内のファイルはデフォルトで安全に併置できるため、併置のためにプライベートフォルダは必須ではありません。しかし、次のような用途に役立ちます:
- UIロジックとルーティングロジックの分離。
- プロジェクト全体とNext.jsエコシステム全体で内部ファイルを一貫して整理する。
- コードエディタでのファイルの並べ替えとグループ化。
- 将来のNext.jsファイル規則との潜在的な命名の競合を回避する。
補足:
- フレームワークの規則ではありませんが、同じアンダースコアパターンを使用して、プライベートフォルダ外のファイルを「プライベート」としてマークすることも検討できます。
- フォルダ名を
%5F
(アンダースコアのURL変換形式)で始めることで、アンダースコアで始まるURLセグメントを作成できます:%5FfolderName
。- プライベートフォルダを使用しない場合は、予期しない命名の競合を防ぐためにNext.jsの特殊ファイル規則を知っておくと役立ちます。
ルートグループ
フォルダを括弧で囲むことでルートグループを作成できます:(folderName)
これは、フォルダが整理目的のものであり、ルートのURLパスに含めるべきではないことを示します。
ルートグループは次のような用途に役立ちます:
- ルートをグループに整理する(サイトのセクション、意図、チームなどによって)。
- 同じルートセグメントレベルでネストされたレイアウトを有効にする:
src
ディレクトリ
Next.jsは、アプリケーションコード(app
を含む)をオプションのsrc
ディレクトリ内に保存することをサポートしています。これにより、アプリケーションコードとプロジェクトのルートに配置されるプロジェクト設定ファイルが分離されます。
一般的な戦略
以下のセクションでは、一般的な戦略の非常に概要的な説明を提供します。最も簡単な結論は、自分とチームに合った戦略を選び、プロジェクト全体で一貫性を保つことです。
補足:以下の例では、
components
とlib
フォルダを一般化されたプレースホルダとして使用しています。これらの命名にはフレームワーク上の特別な意味はなく、プロジェクトによってはui
、utils
、hooks
、styles
などの他のフォルダを使用することもあります。
プロジェクトファイルをapp
の外部に保存する
この戦略では、すべてのアプリケーションコードをプロジェクトのルートにある共有フォルダに保存し、app
ディレクトリを純粋にルーティング目的のために保持します。
プロジェクトファイルをapp
内のトップレベルフォルダに保存する
この戦略では、すべてのアプリケーションコードを**app
ディレクトリのルート**にある共有フォルダに保存します。
プロジェクトファイルを機能またはルートによって分割する
この戦略では、グローバルに共有されるアプリケーションコードをルートのapp
ディレクトリに保存し、より特定のアプリケーションコードをそれらを使用するルートセグメントに分割します。