NEKO BLOG

generateStaticParamsでSSGの仕組みが見えてきた

前回の記事で、SSGはビルド時に静的HTMLを生成しておき、 アクセス時には事前に生成されていたHTMLを返すだけなので、 本番環境では爆速表示ができる。 逆にローカル環境ではその速さの恩恵が受けられない、ということを学びました。

sakurasou-blog.vercel.apphttps://sakurasou-blog.vercel.app/posts/next-ssg

では次に、Next.jsは何を見てビルド時にHTMLを生成しているのか。

この記事ではそれを深掘りしていきます。

きっかけ

このブログでは、一覧画面はアクセスのたびにNotion APIにアクセスして記事一覧を取得しています。 SSGを使っているのはブログの詳細画面、つまり記事のHTMLとタグ別記事一覧のみです。

(余談) 逆に言うと、トップ画面からは記事が見えているのにクリックすると404ページになる場合。 これは主がブログ公開後にリデプロイを失念しております、、ご了承ください😅 きっと数日後には見られるようになります笑

ただしブログ記事もタグ一覧も動的パスで、/posts/[slug]のように実装しています。 そう、動的に変化するパスなんです。 だとすると、Next.jsはどうやってあらかじめ生成するページを見分けているのでしょうか。

ここで登場するのが、generateStaticParamsという関数です。

React民からすると、 「誰やねん、君。長ったらしい名前だな。勝手に補完もされないし、覚えにくい、、」 なのですが、この人、SSGにおいてめちゃ大事な人でした。

具体的な実装

generateStaticParams は、このブログではこう実装しています。

typescript

export async function generateStaticParams() {
  // 一覧画面と同じ情報を取得
  const posts = await getPublishedPosts()
  // 取得できたpostsから、slugのみをピックアップして配列で返す
  return posts.map((post) => ({ slug: post.slug }))
}

/** 公開済み記事の詳細ページを生成する。 */
export default async function PostPage({ params }: PostPageProps) {
  const { slug } = await params
...

ここでもう一度再確認です。

generateStaticParams は、ビルド時にNext.jsから実行されます。

つまり、ここでgetPublishedPostsを呼び出して有効なslug情報を取得して初めて、 生成すべきslugの記事を認識できるわけです。

あとは返されたslugごとにPostPageが生成され、静的HTMLが出力される。 こんな流れになっています。

今回の学び

SSGはビルド時に静的HTMLを生成する。 どんなページのHTMLを生成すべきかは、generateStaticParams を通じて教えてあげる。

これは実感しないと理解が難しかっただろうなと感じました。 今回体験できてよかったです!