Next.js Rendering
Overview
Next.jsのレンダリングに関するまとめセクション。
Next.jsはReactを基盤にしているため、より詳細に理解したい場合はReactを参照してください。
データフェッチ仕組み
Next.jsでは、ブラウザへ送信する前にpre-Renderingをおこなっている。
CSR
CSRのデータフェッチは相対パスでもいい。
SSR
SSRのデータフェッチが絶対パスではないといけない理由。
エラーではありません。isomorphic-unfetch は SSR モードで実行されているため、Node.js はそこから取得する絶対 URL を知る必要があります。これは、バックエンドがブラウザーの設定を認識していないためです。
SSRとSSGについて
Nextでクエリ文字列を使いたい時は getServerSideProps
を使う
getStaticProps
では使えない。
SSRフロー
- ブラウザからサーバー(Node.js)へリクエスト
- サーバー(Node.js)で
HTML
をレンダリングしてブラウザに返却 - 動的なデータが含まれる場合はgetServerSideProps()でApiサーバーリクエ スト
- 動的なデータがない場合は
HTML
をそのままブラウザに返却
SSR回避させる
getServerSidePropsが実行されるタイミング
next/link next/routerを介したgetServerSidePropsとURL直接アクセスのgetServerSidePropsの違い
-
/nowへ直接アクセス
http://localhost:3000/now
に直接アクセスします。 返ってくるHTMLはgetServerSideProps
の処理が実行され、取得したデータが埋め込まれています。 -
/ から /nowへ
<Link>
で遷移 getServerSidePropsはクライアントサイドルーティングでページにアクセスした場合も実行されます。 このときgetServerSidePropsの実行結果はJSON
で返ってくる。
CSR と SSRのデータフェッチ違い
SSG
Static(通称SSG、SG)を利用するメリット
CDNに静的ファイルをキャッシュすることで表示のスピードUPを実現。
ISG(Incremental Static Generation)
Link と ISR が引き起こす Next.js の過負荷
ISG(Incremental Static Generation)は、Next.jsがオンデマンドでページを静的生成するアプローチです。「オンデマンドで静的生成する」ことで、ビルドタイムの静的生成をスキップできる。 ※膨大なDynamic routeを提供するページであっても静的生成を現実的なものにする。実際にページがリクエストされるまでそのページは静的生成されない
- 発動条件
getStaticPaths の fallback オプションを true か 'blocking' にすることで発動する
LinkとISGの関係
実行されるタイミングは以下となる。
- ページが直叩きされたとき
Link
コンポーネントにマウスオーバーした時Link
コンポーネントが画面内に入った時(prefetch=時)
ISR(Incremental Static Regeneration)
ISGの「再生成が起こらない」課題を解決するアプローチ(データ陳腐化防止)
revalidate
オプションを付与することで、一度生成し たページであっても、指定経過時間後に再生成を試む。
revalidate
オプションの付与でISGはISRになるが、あまりにも短い指定をするとタイトルのような過負荷を引き起こすことが懸念されます。
LinkとISRの関係
Serverless Componentsでdeployした場合のLambda@Edge レスポンス制限
ISR(Incremental Static Regeneration)
リファレンス
Next ISRで動的コンテンツをキャッシュするときの戦略
ISRとは、動的なコンテンツを含むページも静的ページとしてCDNにキャッシュすることが可能になる。 ISRを使うことで動的なコンテンツを含むページも静的ページとしてCDNにキャッシュすることが可能になる。Next.jsのISRはドキュメントに書かれているようにstale-while-revalidateという考え方でキャッシュが行われる。 具体的には、リクエスト時にページのキャッシュを作成し、次のアクセスではキャッシュされた古いデータを返します。その裏で次のアクセスに向けてキャッシュが再生成されるというイメージです。
getStaticProps単体だと長期間キャッシュされる静的なページが出力される(いわゆるSSGというやつ)ここに revalidate
を追加するとISRになる。
revalidate: 10
の挙動は以下
- キャッシュが作られた後、10秒間はそのキャッシュを返し続ける(10秒以内に100回アクセスされてもキャッシュの再生成はされない)
- 10秒経ったあとはキャッシュが古くなったとみなされる。ただし次のリクエストでもいったんはそのキャッシュを返す(1時間後にアクセスがあった場合もいったん古いキャッシュを返す)
- その裏でキャッシュを再生成する
- その次のリクエストでは再生成されたキャッシュを返す
export const getStaticProps: GetStaticProps<Props> = async () => {
const posts = await getPosts();
return {
props: {
posts,
},
revalidate: 10 // 👈 ポイント
};
};
Next.js 12 の React Server Components
(React Server Componentsを使用すると、対象のコンポーネント自体を含むすべてをサーバでレンダリングすることができます。これは、サーバ上でHTMLを生成する従来のSSRとは根本的に異なります。サーバコンポーネントを使用すると、クライアント側のJavaScriptが不要になり、ページのレンダリングが高速になります。これによりサーバレンダリングの良いところとクライアントサイドのインタラクティブ性を組み合わせて、アプリケーションのUXを向上させることができます。)
Next.jsのReact Server Componentsは、本家(Facebook)のReact Server Components (demo) よりも、実用的で使いやすくなっている。