getStaticPaths
ダイナミックルートを使用するページから getStaticPaths
という関数をエクスポートすると、Next.js は getStaticPaths
で指定されたすべてのパスを静的に事前レンダリングします。
getStaticPaths の戻り値
getStaticPaths
関数は以下の 必須 プロパティを持つオブジェクトを返す必要があります:
paths
paths
キーはどのパスが事前レンダリングされるかを決定します。例えば、ダイナミックルートを使用する pages/posts/[id].js
というページがあるとします。このページから getStaticPaths
をエクスポートし、paths
に対して以下を返す場合:
Next.js は next build
時に pages/posts/[id].js
のページコンポーネントを使用して /posts/1
と /posts/2
を静的に生成します。
各 params
オブジェクトの値はページ名で使用されるパラメータと一致する必要があります:
- ページ名が
pages/posts/[postId]/[commentId]
の場合、params
にはpostId
とcommentId
を含める必要があります。 - ページ名が
pages/[...slug]
のようなキャッチオールルートを使用している場合、params
にはslug
(配列)を含める必要があります。この配列が['hello', 'world']
の場合、Next.js は/hello/world
でページを静的に生成します。 - ページがオプショナルキャッチオールルートを使用している場合、ルートパスをレンダリングするには
null
、[]
、undefined
またはfalse
を使用します。例えば、pages/[[...slug]]
に対してslug: false
を指定すると、Next.js は/
ページを静的に生成します。
params
の文字列は 大文字と小文字を区別 し、パスが正しく生成されるように正規化することが理想的です。例えば、パラメータとして WoRLD
が返された場合、実際に訪問されるパスが WoRLD
でなければ一致せず、world
や World
とは一致しません。
params
オブジェクトとは別に、i18nが設定されている場合、生成されるパスのロケールを設定する locale
フィールドを返すことができます。
fallback: false
fallback
が false
の場合、getStaticPaths
で返されないパスは 404ページ になります。
next build
が実行されると、Next.js は getStaticPaths
が fallback: false
を返したかどうかをチェックし、getStaticPaths
で返されたパスのみをビルドします。このオプションは、作成するパスの数が少ない場合や、新しいページデータが頻繁に追加されない場合に便利です。より多くのパスを追加する必要があり、fallback: false
を設定している場合、新しいパスを生成するために next build
を再度実行する必要があります。
次の例では、pages/posts/[id].js
というページごとに1つのブログ投稿を事前レンダリングします。ブログ投稿のリストはCMSから取得され、getStaticPaths
によって返されます。その後、各ページに対して、getStaticProps
を使用してCMSから投稿データを取得します。
fallback: true
fallback
が true
の場合、getStaticProps
の動作は以下のように変化します:
getStaticPaths
から返されたパスは、ビルド時にgetStaticProps
によってHTML
にレンダリングされます。- ビルド時に生成されなかったパスは 404ページ になりません。代わりに、Next.js はそのようなパスへの最初のリクエストに対してページの「フォールバック」バージョンを提供します。Googleなどのウェブクローラーにはフォールバックが提供されず、代わりに
fallback: 'blocking'
と同じように動作します。 fallback: true
のページがnext/link
またはnext/router
(クライアントサイド)を介してナビゲートされると、Next.js はフォールバックを提供せず、ページはfallback: 'blocking'
と同じように動作します。- バックグラウンドで、Next.js はリクエストされたパスの
HTML
とJSON
を静的に生成します。これにはgetStaticProps
の実行が含まれます。 - 完了すると、ブラウザは生成されたパスの
JSON
を受け取ります。これは必要なpropsでページを自動的にレンダリングするために使用されます。ユーザーの視点では、ページはフォールバックページからフルページに切り替わります。 - 同時に、Next.js はこのパスを事前レンダリングされたページのリストに追加します。同じパスへの後続のリクエストは、ビルド時に事前レンダリングされた他のページと同様に、生成されたページを提供します。
知っておくと良い:
fallback: true
はoutput: 'export'
を使用する場合にはサポートされていません。
fallback: true
が役立つ場合
fallback: true
は、アプリにデータに依存する非常に多くの静的ページ(非常に大きなeコマースサイトなど)がある場合に役立ちます。すべての商品ページを事前レンダリングしたい場合、ビルドに非常に長い時間がかかります。
代わりに、ページの小さなサブセットを静的に生成し、残りに fallback: true
を使用することができます。まだ生成されていないページがリクエストされると、ユーザーはローディングインジケーターやスケルトンコンポーネントを含むページを見ることになります。
その後すぐに、getStaticProps
が完了し、リクエストされたデータでページがレンダリングされます。これ以降、同じページをリクエストするすべての人は静的に事前レンダリングされたページを受け取ります。
これにより、ユーザーは常に高速な体験を得ながら、高速なビルドと静的生成の利点を維持できます。
fallback: true
は生成されたページを 更新 しません。それにはIncremental Static Regeneration(増分的静的再生成)を参照してください。
fallback: 'blocking'
fallback
が 'blocking'
の場合、getStaticPaths
で返されない新しいパスは、HTML
が生成されるのを待ちます(SSRと同じため ブロッキング と呼ばれます)。その後、将来のリクエストのためにキャッシュされるため、パスごとに1回だけ発生します。
getStaticProps
は以下のように動作します:
getStaticPaths
から返されたパスは、ビルド時にgetStaticProps
によってHTML
にレンダリングされます。- ビルド時に生成されなかったパスは 404ページ になりません。代わりに、Next.js は最初のリクエストでSSRを実行し、生成された
HTML
を返します。 - 完了すると、ブラウザは生成されたパスの
HTML
を受け取ります。ユーザーの視点では、「ブラウザがページをリクエストしている」状態から「フルページがロードされた」状態に移行します。ローディング/フォールバック状態のフラッシュはありません。 - 同時に、Next.js はこのパスを事前レンダリングされたページのリストに追加します。同じパスへの後続のリクエストは、ビルド時に事前レンダリングされた他のページと同様に、生成されたページを提供します。
fallback: 'blocking'
はデフォルトでは生成されたページを 更新 しません。生成されたページを更新するには、fallback: 'blocking'
と一緒にIncremental Static Regeneration(増分的静的再生成)を使用します。
知っておくと良い:
fallback: 'blocking'
はoutput: 'export'
を使用する場合にはサポートされていません。
フォールバックページ
ページの「フォールバック」バージョンでは:
- ページのpropsは空になります。
- router を使用すると、フォールバックがレンダリングされているかどうかを検出できます。
router.isFallback
がtrue
になります。
次の例は isFallback
の使用を示しています:
バージョン履歴
バージョン | 変更点 |
---|---|
v13.4.0 | App Router が安定版になり、generateStaticParams() を含む簡素化されたデータ取得が可能に |
v12.2.0 | オンデマンド増分的静的再生成 が安定版に |
v12.1.0 | オンデマンド増分的静的再生成 が追加(ベータ) |
v9.5.0 | 増分的静的再生成 が安定版に |
v9.3.0 | getStaticPaths が導入 |