デフォルトのファイル配置や命名を整理していたところ、routingが効かなくなったり、layoutが存在しないと怒られたりしたので調べてみたことのメモ。

参考: https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts

NextのRouter

Next.js uses a file-system based router

app(Pages Routerの場合はpages)ディレクトリ配下のディレクトリ構造がrouteになる。
ディレクトリ名、ファイル名がrouteへ反映される。

これを知って以下の疑問が出てきた。

ディレクトリ配下にページ以外のもの(ページ内で使うコンポーネントなど)を配置していると、意図しないrouteが作られたりするかもしれないからやめたほうがいい?

appまたはpagesディレクトリ配下にページ以外のものを置かないほうがよいか

AppRouter, Pages Routerにより異なる。

App Routerの場合、意図しないrouteが作られるような事故は防がれる仕組みになっているので、置いてもよい。
Pages Routerの場合はそうではないので、pagesディレクトリ配下にページ以外のものを置かないほうがよい。

App Routerの場合、page.jsや、route.jsという名前のファイルに対してのみrouting可能。
(僕が実装していた際は、この規則に違反していたためroutingが効かなくなり、404エラーが出た。)

参考: https://nextjs.org/docs/app/building-your-application/routing/colocation#safe-colocation-by-default

Layout

ページへレイアウトを適用するためのファイル。
App Routerの場合、appディレクトリ配下にRoot Layoutが必要。 page.jsに対応するLayout(Nesting Layouts)を個別定義することもできる。
Nesting Layoutsは、上位ディレクトリに定義されたlayout.js内部にネストする形で適用される。

以下、Root Layout, Nesting Layoutsを用意した場合のディレクトリ、ファイル配置の例

  • app
    • layout.js (Root Layout)
    • dashboard
      • layout.js (dashboard用のNesting Layout)
      • page.js (app/layout.jsを適用した上で、app/dashboard/layout.jsを適用)
    • home
      • page.js (app/layout.jsを適用)

(僕が実装していた際は、Root Layoutがなく、Nesting Layoutsもなかったため、以下のエラーが出た。)

page.tsx doesn’t have a root layout. To fix this error, make sure every page has a root layout.