getStaticPaths
ページがダイナミックルーティングを使用し、かつgetStaticProps
を使用している場合、静的に生成するパスのリストを定義する必要があります。
ダイナミックルートを使用するページからgetStaticPaths
(静的サイト生成)という関数をエクスポートすると、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
中に実行されます。fallback: true
を使用している場合、getStaticProps
はバックグラウンドで実行されます。fallback: blocking
を使用している場合、getStaticProps
は初回レンダリング前に呼び出されます。
getStaticPaths はどこで使用できますか
getStaticPaths
はgetStaticProps
と併用する必要があります。getServerSideProps
とはgetStaticPaths
を併用できません。getStaticProps
を使用するダイナミックルートからgetStaticPaths
をエクスポートできます。getStaticPaths
をページ以外のファイル(例:components
フォルダ)からエクスポートすることはできません。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 }
}
お役に立ちましたか?