getStaticPaths
ページに動的ルートがあり、getStaticProps を使用している場合、静的に生成されるパスのリストを定義する必要があります。
動的ルートを使用するページから getStaticPaths (Static Site Generation) という関数をエクスポートすると、Next.js は getStaticPaths で指定されたすべてのパスを静的に事前レンダリングします。
import type {
InferGetStaticPropsType,
GetStaticProps,
GetStaticPaths,
} from 'next'
type Repo = {
name: string
stargazers_count: number
}
export const getStaticPaths = (async () => {
return {
paths: [
{
params: {
name: 'next.js',
},
}, // See the "paths" section below
],
fallback: true, // false or "blocking"
}
}) satisfies GetStaticPaths
export const getStaticProps = (async (context) => {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo = await res.json()
return { props: { repo } }
}) satisfies GetStaticProps<{
repo: Repo
}>
export default function Page({
repo,
}: InferGetStaticPropsType<typeof getStaticProps>) {
return repo.stargazers_count
}getStaticPaths API リファレンス には、getStaticPaths で使用できるすべてのパラメータとプロパティが記載されています。
getStaticPaths はいつ使用すべきですか?
動的ルートを使用するページを静的に事前レンダリングしていて、かつ以下の条件に当てはまる場合は、getStaticPaths を使用する必要があります。
- データがヘッドレス CMS から取得される
- データがデータベースから取得される
- データがファイルシステムから取得される
- データは公開キャッシュ可能である (ユーザー固有ではない)
- ページは事前レンダリングされる必要があり (SEO のため)、非常に高速である必要があります —
getStaticPropsはHTMLおよびJSONファイルを生成し、どちらも CDN でキャッシュしてパフォーマンスを向上させることができます。
getStaticPaths はいつ実行されますか?
getStaticPaths は、本番環境ではビルド時のみ実行され、実行時に呼び出されることはありません。getStaticPaths 内に記述されたコードがクライアントサイドバンドルから削除されることを、このツール で検証できます。
getStaticProps は getStaticPaths とどのように連携しますか?
getStaticPropsは、ビルド時に返されたpathsに対してnext build中に実行されます。getStaticPropsは、fallback: trueを使用している場合にバックグラウンドで実行されます。getStaticPropsは、fallback: blockingを使用している場合に初期レンダリング前に呼び出されます。
getStaticPaths はどこで使用できますか?
getStaticPathsはgetStaticPropsと共に使用する必要があります。getStaticPathsをgetServerSidePropsと共に使用することはできません。getStaticPropsも使用する動的ルートからgetStaticPathsをエクスポートできます。- 非ページファイル (例:
componentsフォルダ) からgetStaticPathsをエクスポートすることはできません。 getStaticPathsは、ページコンポーネントのプロパティではなく、スタンドアロン関数としてエクスポートする必要があります。
開発中はリクエストごとに実行されます
開発中 (next dev)、getStaticPaths はリクエストごとに呼び出されます。
オンデマンドでのパス生成
getStaticPaths は、ビルド時に生成されるページと、fallback を使用してオンデマンドで生成されるページを制御できます。ビルド時に多くのページを生成すると、ビルド時間が長くなります。
paths に空の配列を返すことで、すべてのページ生成をオンデマンドに遅延させることができます。これは、Next.js アプリケーションを複数の環境にデプロイする場合に特に役立ちます。たとえば、プレビュー (本番ビルドではない) のためにすべてのページをオンデマンドで生成することで、ビルド時間を短縮できます。これは、数百または数千の静的ページを持つサイトに役立ちます。
export async function getStaticPaths() {
// When this is true (in preview environments) don't
// prerender any static pages
// (faster builds, but slower initial page load)
if (process.env.SKIP_BUILD_STATIC_GENERATION) {
return {
paths: [],
fallback: 'blocking',
}
}
// Call an external API endpoint to get posts
const res = await fetch('https://.../posts')
const posts = await res.json()
// Get the paths we want to prerender based on posts
// In production environments, prerender all pages
// (slower builds, but faster initial page load)
const paths = posts.map((post) => ({
params: { id: post.id },
}))
// { fallback: false } means other routes should 404
return { paths, fallback: false }
}役に立ちましたか?