output export で generateStaticParams が無いと言われる
実際に出るエラー
output export の設定で、動的なパスのページに generateStaticParams が無いと出るビルドエラーです。
何が起きているか
next.config.ts に output: 'export' を書くと、ビルドの時点で全ページを HTML にして書き出します。書き出したファイルは、静的なファイルを配るだけの場所に置けます。
その代わり、書き出したあとはページを描くサーバーがいません。
動的なパス(app/blog/[slug]/page.tsx)は、slug に何が来るかが分からないと書き出せません。その一覧を返すのが generateStaticParams です。無いと、書き出すものが決まらないので止まります。
- BuildgenerateStaticParams を呼ぶ
作る slug の一覧を受け取る。無ければここで止まる。
- Buildslug ごとにページを描く
受け取った数だけ HTML を作る。
- Buildout/ に書き出す
あとは静的なファイルとして配るだけ。
直し方
作る slug をすべて返します。
// app/blog/[slug]/page.tsx
export function generateStaticParams() {
return [{ slug: 'hello' }, { slug: 'world' }]
}
export default async function Post({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params
return <h1>{slug}</h1>
}
実機で確かめました。ビルドが通り、out/ の下に hello.html と world.html が書き出されました。
開発サーバーでは、開くまで分からない
| 開発(next dev) | 本番ビルド | |
|---|---|---|
| 起動 | する | — |
| そのページ | 開くと 500 | ビルドが止まる |
| 文言 | missing exported function ... | is missing ... so it cannot be used ... |
開発サーバーは起動し、そのページを開いたときに初めて 500 になります。ログの文言も少し違います。
Error: Page "/[slug]/page" is missing exported function "generateStaticParams()", which is required with "output: export" config.
開いていないページの誤りは、ビルドするまで分かりません。
そもそも静的書き出しが合っているか
静的書き出しは、ページを描くサーバーを持たない配り方です。開かれたときに描く必要があるページ(ログインした人ごとに中身が違う、など)とは両立しません。
そうしたページがあるなら、output: 'export' をやめて、サーバーで動かす形を選びます(自分のサーバーに置く)。generateStaticParams を書けば解決する、という話ではありません。
output: 'export' を書いていないなら、generateStaticParams は必須ではありません。無いページは、開かれたときにサーバーで描かれます(この問題)。
出典
- nextjs.org/docs/app/guides/static-exports
- nextjs.org/docs/app/api-reference/functions/generate-static-params
このページの内容は上記の一次情報を基準に書いています。個人ブログや二次情報を根拠にしていません。