ルーティングの基礎

すべてのアプリケーションの骨格はルーティングです。このページでは、ウェブアプリケーションにおけるルーティングの基本的な概念と、Next.jsでのルーティングの扱い方を紹介します。

用語集

まず、ドキュメント全体で使用される以下の用語を簡単に参照できます:

コンポーネントツリーの用語
  • ツリー: 階層構造を視覚化するための慣例。例えば、親子コンポーネントを持つコンポーネントツリーやフォルダ構造など。
  • サブツリー: ツリーの一部で、新しいルート(最初)からリーフ(最後)までを指します。
  • ルート: ツリーまたはサブツリーの最初のノード。例えばルートレイアウト。
  • リーフ: 子を持たないサブツリー内のノード。URLパスの最後のセグメントなど。
URL構造の用語
  • URLセグメント: スラッシュで区切られたURLパスの一部。
  • URLパス: ドメインの後に続くURLの部分(セグメントで構成)。

app ルーター

バージョン13で、Next.jsはReactサーバーコンポーネント上に構築された新しいApp Routerを導入しました。これにより、共有レイアウト、ネストされたルーティング、ローディング状態、エラー処理などがサポートされます。

App Routerはappという新しいディレクトリで動作します。appディレクトリはpagesディレクトリと並行して動作し、段階的な導入が可能です。これにより、アプリケーションの一部のルートを新しい動作にオプトインしながら、他のルートはpagesディレクトリで従来の動作を維持できます。アプリケーションがpagesディレクトリを使用している場合は、Pages Routerのドキュメントも参照してください。

知っておくと良いこと: App RouterはPages Routerよりも優先されます。ディレクトリ間で同じURLパスに解決されるルートは、競合を防ぐためにビルド時エラーが発生します。

Next.js Appディレクトリ

デフォルトでは、app内のコンポーネントはReactサーバーコンポーネントです。これはパフォーマンス最適化であり、簡単に採用できます。また、クライアントコンポーネントも使用できます。

推奨事項: サーバーコンポーネントが初めての場合は、サーバーページを確認してください。

フォルダとファイルの役割

Next.jsはファイルシステムベースのルーターを使用しています:

  • フォルダはルートを定義するために使用されます。ルートは、ルートフォルダから最終的なリーフフォルダまでのファイルシステム階層に従った、ネストされたフォルダの単一のパスです。リーフフォルダにはpage.jsファイルが含まれます。ルートの定義を参照してください。
  • ファイルはルートセグメントに表示されるUIを作成するために使用されます。特殊ファイルを参照してください。

ルートセグメント

ルート内の各フォルダはルートセグメントを表します。各ルートセグメントは、URLパス内の対応するセグメントにマッピングされます。

ルートセグメントからURLセグメントへのマッピング

ネストされたルート

ネストされたルートを作成するには、フォルダを互いに入れ子にします。例えば、appディレクトリに2つの新しいフォルダをネストすることで、新しい/dashboard/settingsルートを追加できます。

/dashboard/settingsルートは3つのセグメントで構成されます:

  • / (ルートセグメント)
  • dashboard (セグメント)
  • settings (リーフセグメント)

ファイル規約

Next.jsは、ネストされたルートで特定の動作を持つUIを作成するための一連の特殊ファイルを提供します:

layoutセグメントとその子のための共有UI
pageルートの固有UIとルートを公開的にアクセス可能にする
loadingセグメントとその子のためのローディングUI
not-foundセグメントとその子のためのNot Found UI
errorセグメントとその子のためのエラーUI
global-errorグローバルエラーUI
routeサーバーサイドAPIエンドポイント
template特殊化された再レンダリングされるレイアウトUI
default並列ルートのためのフォールバックUI

知っておくと良いこと: 特殊ファイルには.js.jsx、または.tsxファイル拡張子を使用できます。

コンポーネント階層

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

  • layout.js
  • template.js
  • error.js (Reactエラー境界)
  • loading.js (Reactサスペンス境界)
  • not-found.js (Reactエラー境界)
  • page.js またはネストされた layout.js
ファイル規約のコンポーネント階層

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

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

同配置

特殊ファイルに加えて、appディレクトリ内のフォルダに独自のファイル(コンポーネント、スタイル、テストなど)を同配置するオプションがあります。

これは、フォルダがルートを定義する一方で、page.jsまたはroute.jsによって返される内容のみが公開的にアクセス可能だからです。

同配置ファイルを含むフォルダ構造の例

プロジェクト組織と同配置について詳しく学びます。

高度なルーティングパターン

App Routerは、より高度なルーティングパターンを実装するための一連の規約も提供します。これらには以下が含まれます:

  • 並列ルート: 同じビューで独立してナビゲート可能な2つ以上のページを同時に表示できます。独自のサブナビゲーションを持つ分割ビューに使用できます。例: ダッシュボード。
  • インターセプトルート: ルートをインターセプトし、別のルートのコンテキストで表示できます。現在のページのコンテキストを維持することが重要な場合に使用します。例: タスクを編集しながらすべてのタスクを表示する、またはフィード内の写真を拡大表示する。

これらのパターンにより、よりリッチで複雑なUIを構築でき、これまで小規模なチームや個人開発者にとって複雑だった機能を民主化します。

次のステップ

Next.jsでのルーティングの基礎を理解したら、以下のリンクをフォローして最初のルートを作成してください:

ルートの定義

Next.jsで最初のルートを作成する方法を学びます。

ページとレイアウト

App Routerを使用して最初のページと共有レイアウトを作成する方法

リンクとナビゲーション

Next.jsにおけるナビゲーションの仕組みと、Linkコンポーネントおよび `useRouter` フックの使用方法を学びます。

ローディングUIとストリーミング

Suspenseを基盤としたローディングUIにより、特定のルートセグメント向けのフォールバックを作成し、コンテンツの準備が整い次第自動的にストリーミングできます。

エラーハンドリング

ルートセグメントとそのネストされた子要素をReactエラー境界で自動的にラップすることで、ランタイムエラーを処理します。

リダイレクト処理

Next.jsでリダイレクトを処理するさまざまな方法について学びます。

ルートグループ

ルートグループを使用すると、Next.jsアプリケーションを異なるセクションに分割できます。

プロジェクト構成

Next.jsプロジェクトの構成方法とファイルの同居配置について学びます。

ダイナミックルート

ダイナミックルートを使用すると、動的なデータからプログラムでルートセグメントを生成できます。

パラレルルート (Parallel Routes)

同じビュー内で独立してナビゲート可能な複数のページを同時にレンダリングする機能。動的なアプリケーション向けのパターンです。

インターセプティングルート (Intercepting Routes)

インターセプティングルートを使用すると、現在のレイアウト内で新しいルートを読み込みつつブラウザのURLをマスキングできます。モーダルなどの高度なルーティングパターンに有用です。

ルートハンドラ

WebのRequestおよびResponse APIを使用して、特定のルートにカスタムリクエストハンドラを作成します。

ミドルウェア

リクエスト完了前にコードを実行するミドルウェアの使用方法を学びます。

国際化 (Internationalization)

国際化ルーティングとローカライズされたコンテンツで多言語対応を追加します。