静的サイト生成 (SSG)
使用例
- Agility CMS の例 (デモ)
- Builder.io の例 (デモ)
- ButterCMS の例 (デモ)
- Contentful の例 (デモ)
- Cosmic の例 (デモ)
- DatoCMS の例 (デモ)
- DotCMS の例 (デモ)
- Drupal の例 (デモ)
- Enterspeed の例 (デモ)
- GraphCMS の例 (デモ)
- Keystone の例 (デモ)
- Kontent.ai の例 (デモ)
- Makeswift の例 (デモ)
- Plasmic の例 (デモ)
- Prepr の例 (デモ)
- Prismic の例 (デモ)
- Sanity の例 (デモ)
- Sitecore XM Cloud の例 (デモ)
- Storyblok の例 (デモ)
- Strapi の例 (デモ)
- TakeShape の例 (デモ)
- Tina の例 (デモ)
- Umbraco の例 (デモ)
- Umbraco Heartcore の例 (デモ)
- Webiny の例 (デモ)
- WordPress の例 (デモ)
- ブログスターターの例 (デモ)
- Static Tweet (デモ)
ページが静的生成 (Static Generation) を使用している場合、ページのHTMLはビルド時に生成されます。つまり、本番環境では next build
を実行した時にページHTMLが生成されます。このHTMLは各リクエストで再利用され、CDNによってキャッシュされる可能性があります。
Next.jsでは、データあり/なしで静的生成を行うことができます。それぞれの場合を見てみましょう。
データなしの静的生成
デフォルトでは、Next.jsはデータを取得せずに静的生成を使用してページを事前レンダリングします。以下はその例です:
このページは事前レンダリングするために外部データを取得する必要がないことに注意してください。このような場合、Next.jsはビルド時にページごとに単一の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
の動作について詳しくは、データ取得のドキュメントを参照してください。
静的生成を使用するべきタイミング
可能な限り静的生成(データあり/なし)を使用することをお勧めします。なぜなら、ページを一度ビルドしてCDNから配信できるため、リクエストごとにサーバーがページをレンダリングするよりもはるかに高速だからです。
静的生成は以下のような多くの種類のページに使用できます:
- マーケティングページ
- ブログ投稿やポートフォリオ
- 電子商取引の商品一覧
- ヘルプとドキュメント
「このページをユーザーのリクエストに先立って事前レンダリングできるか?」と自問してください。答えが「はい」なら、静的生成を選択すべきです。
一方、ユーザーのリクエストに先立ってページを事前レンダリングできない場合、静的生成は適していません。ページに頻繁に更新されるデータが表示され、ページコンテンツがリクエストごとに変化する場合などが該当します。
このような場合は、以下のいずれかの方法を選択できます:
- クライアントサイドデータ取得を伴う静的生成:ページの一部を事前レンダリングせず、クライアントサイドのJavaScriptでそれらを埋めることができます。このアプローチについて詳しくは、データ取得のドキュメントを参照してください。
- サーバーサイドレンダリングを使用:Next.jsは各リクエストでページを事前レンダリングします。CDNによるキャッシュができないため遅くなりますが、事前レンダリングされたページは常に最新の状態になります。このアプローチについては後述します。