36
チャプター36
動的ルーティングの詳細
動的ルーティングについて知っておくべき重要な情報です。
外部APIのフェッチまたはデータベースのクエリ
getStaticProps
と同様に、getStaticPaths
はあらゆるデータソースからデータを取得できます。この例では、getAllPostIds
(getStaticPaths
で使用される)が外部APIエンドポイントからデータを取得する場合があります。
export async function getAllPostIds() {
// Instead of the file system,
// fetch post data from an external API endpoint
const res = await fetch('..');
const posts = await res.json();
return posts.map((post) => {
return {
params: {
id: post.id,
},
};
});
}
開発環境 vs. 本番環境
- 開発環境(
npm run dev
またはyarn dev
)では、getStaticPaths
はすべてのリクエストで実行されます。 - 本番環境では、
getStaticPaths
はビルド時に実行されます。
フォールバック
getStaticPaths
からfallback: false
を返したことを思い出してください。これは何を意味するでしょうか?
fallback
がfalse
の場合、getStaticPaths
によって返されないパスはすべて404ページになります。
fallback
がtrue
の場合、getStaticProps
の動作が変わります。
getStaticPaths
から返されたパスは、ビルド時にHTMLにレンダリングされます。- ビルド時に生成されなかったパスは404ページにはなりません。代わりに、Next.jsはそのようなパスへの最初のリクエスト時にページの「フォールバック」バージョンを提供します。
- バックグラウンドで、Next.jsはリクエストされたパスを静的に生成します。同じパスへの以降のリクエストでは、ビルド時にプリレンダリングされた他のページと同様に、生成されたページが提供されます。
fallback
がblocking
の場合、新しいパスはgetStaticProps
でサーバーサイドレンダリングされ、将来のリクエストのためにキャッシュされるため、各パスにつき一度しか発生しません。
これは本レッスンの範囲外ですが、fallback: true
および fallback: 'blocking'
については、fallback
ドキュメントで詳しく学ぶことができます。
キャッチオールルート
動的ルーティングは、括弧内に3つのドット(...
)を追加することで、すべてのパスを捕捉するように拡張できます。例えば
pages/posts/[...id].js
は/posts/a
に一致しますが、/posts/a/b
、/posts/a/b/c
などにも一致します。
これを行う場合、getStaticPaths
では、id
キーの値として次のように配列を返す必要があります。
return [
{
params: {
// Statically Generates /posts/a/b/c
id: ['a', 'b', 'c'],
},
},
//...
];
そしてgetStaticProps
ではparams.id
は配列になります。
export async function getStaticProps({ params }) {
// params.id will be like ['a', 'b', 'c']
}
詳細はキャッチオールルートのドキュメントを参照してください。
ルーター
Next.jsルーターにアクセスしたい場合は、next/router
からuseRouter
フックをインポートすることで可能です。
404ページ
カスタム404ページを作成するには、pages/404.js
を作成します。このファイルはビルド時に静的に生成されます。
// pages/404.js
export default function Custom404() {
return <h1>404 - Page Not Found</h1>;
}
詳細はエラーページのドキュメントをご覧ください。
その他の例
getStaticProps
とgetStaticPaths
を説明するためにいくつかの例を作成しました — 詳細についてはそのソースコードをご覧ください。
- マークダウンファイルを使ったブログスターター (デモ)
- WordPressの例 (デモ)
- DatoCMSの例 (デモ)
- TakeShapeの例 (デモ)
- Sanityの例 (デモ)
これで完了です!
次のレッスンでは、Next.jsのAPIルートについて説明します。
この情報は役立ちましたか?