Static Site Generation (SSG)
例
- WordPressの例(デモ)
- markdownファイルを使用したブログスターター (デモ)
- DatoCMSの例 (デモ)
- TakeShapeの例 (デモ)
- Sanityの例 (デモ)
- Prismicの例 (デモ)
- Contentfulの例 (デモ)
- Strapiの例 (デモ)
- Preprの例 (デモ)
- Agility CMSの例 (デモ)
- Cosmicの例 (デモ)
- ButterCMSの例 (デモ)
- Storyblokの例 (デモ)
- GraphCMSの例 (デモ)
- Kontentの例 (デモ)
- Builder.ioの例 (デモ)
- TinaCMSの例 (デモ)
- Static Tweet (デモ)
- Enterspeedの例 (デモ)
ページがStatic Generationを使用している場合、ページのHTMLはビルド時に生成されます。つまり、本番環境では、next build
を実行したときにページのHTMLが生成されます。このHTMLは、その後の各リクエストで再利用され、CDNによってキャッシュできます。
Next.jsでは、ページをデータの有無に関わらず静的に生成できます。それぞれのケースを見ていきましょう。
データなしの静的生成
デフォルトでは、Next.jsはデータフェッチなしでStatic Generationを使用してページを事前レンダリングします。以下は例です:
このページは事前レンダリングのために外部データをフェッチする必要がないことに注意してください。このようなケースでは、Next.jsはビルド時に各ページに対して1つのHTMLファイルを生成します。
データありの静的生成
一部のページは事前レンダリングのために外部データのフェッチが必要です。2つのシナリオがあり、1つまたは両方が適用される可能性があります。各ケースで、Next.jsが提供する以下の関数を使用できます:
- ページのコンテンツが外部データに依存している:
getStaticProps
を使用します。 - ページのパスが外部データに依存している:
getStaticPaths
を使用します(通常はgetStaticProps
と組み合わせて使用)。
シナリオ1:ページのコンテンツが外部データに依存している
例: ブログページがCMS(コンテンツ管理システム)からブログ投稿のリストをフェッチする必要がある場合。
事前レンダリング時にこのデータをフェッチするために、Next.jsでは同じファイルからgetStaticProps
というasync
関数をexport
できます。この関数はビルド時に呼び出され、フェッチしたデータを事前レンダリング時にページのprops
に渡すことができます。
getStaticProps
の詳細については、データフェッチングのドキュメントを参照してください。
シナリオ2:ページのパスが外部データに依存している
Next.jsでは、動的ルートを持つページを作成できます。たとえば、pages/posts/[id].js
というファイルを作成して、id
に基づいて単一のブログ投稿を表示できます。これにより、posts/1
にアクセスしたときにid: 1
のブログ投稿を表示できます。
動的ルーティングの詳細については、動的ルーティングのドキュメントを参照してください。
しかし、ビルド時に事前レンダリングするid
は外部データに依存する可能性があります。
例: データベースに1つのブログ投稿(id: 1
)しか追加していない場合を想定します。この場合、ビルド時にposts/1
のみを事前レンダリングしたいでしょう。
後に、id: 2
の2番目の投稿を追加するかもしれません。その場合、posts/2
も事前レンダリングしたくなります。
つまり、事前レンダリングするページのパスが外部データに依存しているのです。これを処理するために、Next.jsでは動的ページ(この場合はpages/posts/[id].js
)からgetStaticPaths
というasync
関数をexport
できます。この関数はビルド時に呼び出され、事前レンダリングするパスを指定できます。
pages/posts/[id].js
では、このid
に関するデータをフェッチしてページを事前レンダリングするために、getStaticProps
もエクスポートする必要があります:
getStaticPaths
の詳細については、データフェッチングのドキュメントを参照してください。
Static Generationをいつ使用すべきか
ページを1回だけビルドしてCDNで提供できるため、サーバーが各リクエストでページをレンダリングするよりもはるかに高速になります。そのため、可能な限りStatic Generation(データの有無に関わらず)の使用をお勧めします。
以下のようなタイプのページに対してStatic Generationを使用できます:
- マーケティングページ
- ブログ投稿とポートフォリオ
- Eコマース商品リスト
- ヘルプとドキュメント
ページを「ユーザーのリクエストの前に」事前にレンダリングできるかどうかを自問すべきです。答えがイエスであれば、Static Generationを選択すべきです。
一方、ユーザーのリクエストの前にページを事前にレンダリングできない場合、Static Generationは適していません。おそらく、頻繁に更新されるデータを表示するページや、リクエストごとにページのコンテンツが変更されるページの場合です。
このような場合、以下のいずれかを行うことができます:
- クライアントサイドデータ取得を使用したStatic Generation: ページの一部の事前レンダリングをスキップし、クライアントサイドのJavaScriptを使用してそれらを埋めることができます。このアプローチの詳細については、データ取得のドキュメントを確認してください。
- サーバーサイドレンダリングの使用: Next.jsは各リクエスト時にページを事前レンダリングします。CDNでキャッシュできないためページの読み込みは遅くなりますが、事前レンダリングされたページは常に最新の状態になります。このアプローチについては後述します。