getStaticProps
ページからgetStaticProps
(静的サイト生成)という関数をエクスポートすると、Next.jsはgetStaticProps
が返すpropsを使用して、ビルド時にこのページを事前レンダリングします。
レンダリングタイプに関わらず、すべての
props
がページコンポーネントに渡され、初期HTMLでクライアント側で表示できることに注意してください。これは、ページを正しくハイドレートできるようにするためです。props
で機密情報をクライアントに利用可能にしないように注意してください。
getStaticProps
APIリファレンスでは、getStaticProps
で使用できるすべてのパラメータとpropsについて説明しています。
いつ getStaticProps を使用すべきか
以下の場合にgetStaticProps
を使用すべきです:
- ページをレンダリングするために必要なデータがユーザーのリクエスト前のビルド時に利用可能
- データがヘッドレスCMSから取得される
- ページをSEOのために事前レンダリングし、非常に高速にする必要がある —
getStaticProps
はHTML
とJSON
ファイルを生成し、どちらもパフォーマンスのためにCDNでキャッシュできる - データを公開でキャッシュ可能(ユーザー特有のデータではない)。この条件は、ミドルウェアを使用してパスを書き換えることで、特定の状況で回避できます。
getStaticPropsはいつ実行されるか
getStaticProps
は常にサーバー上で実行され、クライアント上では決して実行されません。getStaticProps
内に記述されたコードがクライアント側のバンドルから削除されることは、このツールで検証できます。
getStaticProps
は常にnext build
中に実行されますgetStaticProps
はfallback: true
を使用する際にバックグラウンドで実行されますgetStaticProps
はfallback: blocking
を使用する際に初期レンダリング前に呼び出されますgetStaticProps
はrevalidate
を使用する際にバックグラウンドで実行されますgetStaticProps
はrevalidate()
を使用する際にバックグラウンドでオンデマンドで実行されます
Incremental Static Regenerationと組み合わせると、getStaticProps
は古いページが再検証されている間にバックグラウンドで実行され、ブラウザに新しいページが提供されます。
getStaticProps
は静的HTMLを生成するため、受信リクエスト(クエリパラメータやHTTPヘッダーなど)にアクセスできません。ページのリクエストにアクセスする必要がある場合は、getStaticProps
に加えてミドルウェアの使用を検討してください。
getStaticPropsを使用してCMSからデータを取得する
次の例は、CMSからブログ記事のリストを取得する方法を示しています。
getStaticProps
APIリファレンスでは、getStaticProps
で使用できるすべてのパラメータとpropsについて説明しています。
サーバー側のコードを直接記述する
getStaticProps
はサーバー側でのみ実行されるため、クライアント側では決して実行されません。ブラウザ用のJSバンドルに含まれることもないため、データベースクエリをブラウザに送信することなく、直接記述できます。
つまり、getStaticProps
からAPIルートを取得する(それ自体が外部ソースからデータを取得する)代わりに、getStaticProps
内にサーバー側のコードを直接記述できます。
次の例を参照してください。APIルートは、CMSからデータを取得するために使用されます。そのAPIルートはgetStaticProps
から直接呼び出されます。これにより追加の呼び出しが発生し、パフォーマンスが低下します。代わりに、CMSからデータを取得するためのロジックは、lib/
ディレクトリを使用して共有できます。その後、getStaticProps
と共有できます。
あるいは、データ取得にAPIルートを使用していない場合、getStaticProps
でデータを取得するために直接fetch()
APIを使用できます。
Next.jsがクライアント側のバンドルから何を削除するかを確認するには、next-code-elimination toolを使用できます。
HTMLとJSONの両方を静的に生成
getStaticProps
を持つページがビルド時に事前レンダリングされると、ページHTMLファイルに加えて、Next.jsはgetStaticProps
の実行結果を含むJSONファイルを生成します。
このJSONファイルは、next/link
またはnext/router
を通じたクライアントサイドルーティングで使用されます。getStaticProps
を使用してプリレンダリングされたページに移動すると、Next.jsはこのJSONファイル(ビルド時に事前計算)をフェッチし、ページコンポーネントのプロップとして使用します。つまり、クライアントサイドのページ遷移では、エクスポートされたJSONのみが使用されるため、getStaticProps
は呼び出されません。
インクリメンタル静的生成を使用する場合、getStaticProps
はクライアントサイドナビゲーションに必要なJSONを生成するためにバックグラウンドで実行されます。同じページに対して複数のリクエストが行われることがありますが、これは意図的なものであり、エンドユーザーのパフォーマンスには影響しません。
getStaticPropsをどこで使用できるか
getStaticProps
はページからのみエクスポートできます。ページ以外のファイル、_app
、_document
、_error
からはエクスポートできません。
この制限の理由の1つは、Reactがページをレンダリングする前にすべての必要なデータを持っている必要があるためです。
また、getStaticProps
はスタンドアロン関数としてエクスポートする必要があります。ページコンポーネントのプロパティとしてgetStaticProps
を追加しても機能しません。
補足: カスタムアプリを作成した場合は、リンクされたドキュメントに示されているように
pageProps
をページコンポーネントに渡していることを確認してください。そうしないと、プロップは空になります。
開発環境では毎回リクエスト時に実行
開発環境(next dev
)では、getStaticProps
は毎回のリクエストで呼び出されます。
プレビューモード
プレビューモードを使用すると、静的生成を一時的にバイパスし、ビルド時ではなくリクエスト時にページをレンダリングできます。例えば、ヘッドレスCMSを使用していて、公開前に下書きをプレビューしたい場合などです。