[Next.js] Pages Routerでコロケーションを意識したディレクトリを実現する
3 min read
概要
Next.jsでPages Routerを利用している環境でコロケーションを意識したディレクトリ構造を実現したい。
コロケーションとは
原則
コロケーションの概念はこの基本的な原則に集約されます:
可能な限り関連性が高いものの近くにコードを置いてください。
こうも言えます: “一緒に変化するものは、合理的な範囲で近くに置くべきです。“と。( Dan Abramov氏がかつて私にこのような話をしました。)
引用元: コロケーション
Next.jsのPages Routerでいえば、src/pages/tags
というルーティングがある場合、このtagsだけに関連するコードは関心として近くに置いておくべきということである。
環境
- Next.js - 14.1.4
pageExtensionsが利用できるバージョンであれば問題ない(v5あたりで導入)。
方法
Next.jsのPages Routerはpagesディレクトリへ置かれたファイルに応じてルーティングが行われる。そのためルーティングに関係のないファイルは基本的に置くことができない。
ただ、以下のようにpageExtensions
にpage.tsx
を設定することでルーティング対象の拡張子をpage.tsx
に限定できる。それによって、ただの.ts
ファイルはルーティング対象外となる。
// next.config.js
module.exports = {
pageExtensions: ['page.tsx'],
};
上記の設定したうえで、ルーティングに関係のないファイルはそのまま(.tsx|ts
)、ルーティング対象のファイルは.page.tsx
とすることでコロケーションを意識したディレクトリ構造を実現できる。下記の例では、_layouts
や_components
などのディレクトリを作成し、その中に関係するコンポーネントを配置している。
.
├── 404.page.tsx
├── _app.page.tsx
├── _document.page.tsx
├── index.page.tsx
├── _components
├── _layouts
│ ├── AppLayout.tsx
│ ├── ArchivePageLayout.tsx
│ ├── SinglePageLayout.tsx
│ └── TopPageLayout.tsx
├── _libs
│ ├── getPopularPost.ts
│ └── index.ts
├── about
│ └── index.page.tsx
├── archive
│ ├── _components
│ │ └── index.ts
│ ├── _libs
│ │ ├── getStaticPropsArchive.ts
│ │ └── index.ts
│ └── index.page.tsx
└── tags
├── _libs
│ ├── getStaticPathsTagDetail.ts
│ ├── getStaticPropsTagDetail.ts
│ └── index.ts
├── [slug].page.tsx
└── index.page.tsx