【8章】Next.jsのチュートリアルをやってみた

Next.js

 

これはNext.jsの公式チュートリアルの8. Static and Dynamic Rendering に関するメモです

 

前章のメモ

 

Next.jsの公式チュートリアルの該当ページ

 

Learn Next.js: Static and Dynamic Rendering | Next.js
Understand how rendering works in Next.js, and make your dashboard app dynamic.

 

学ぶこと

 

  • 静的レンダリングとは何か?、どのようにパフォーマンスを向上させるか?
  • 動的レンダリングとは何か?、いつ使うのか?
  • ダッシュボードを動的にするためのアプローチ
  • 遅いデータフェッチが何を起こすのか?

 

静的レンダリングとは何か?

 

サーバーコンポーネントにおけるデフォルトのレンダリング方法

アプリのビルドやrevalidateの際にデータを取得&レンダリングすること。

revalidateとは、
一定時間の経過や特定のイベントをトリガーとしてキャッシュを消去すること。
これにより、定期的に最新のデータを取得できる

ビルド時にレンダリングしたものはCDNにキャッシュされます。

 

ユーザに対してはキャッシュされた結果が返されるので下記のメリットがあります。

  1. レスポンスが速い
  2. サーバへの負荷が低い
  3. ページ読み込み時にすでにレンダリングされているので、SEOに強い

 

常に最新のデータを表示できるわけではないので、ブログ記事や商品ページといった

比較的更新頻度が低く、どのユーザにも同じように表示されるページに適しています。

 

動的レンダリングとは何か?

 

ユーザのリクエストごとにレンダリングすること。

  1. 最新のデータが反映される
  2. 各ユーザにあったデータを表示できる
  3. Cookieやクエリパラメータなどリクエスト時のパラメータを受け取れる

 

ダッシュボードやSNSのタイムラインなど

更新頻度が高いページやユーザごとに異なる表示となるページに適しています

 

ダッシュボードを動的にする

 

サーバーコンポーネントはデフォルトで静的レンダリングを使用します。

では、動的レンダリングを使用するにはどうすればよいでしょうか?

unstable_noStore というNext.js のAPIを呼び出すことで動的レンダリングにします

 

早速、前章で使用した /app/lib/data.ts で使ってみましょう!

とはいえ、next/cache から unstable_noStore をインポートして実行するのみ。

みたいな感じで

  • fetchLatestInvoices
  • fetchCardData
  • fetchFilteredInvoices
  • fetchInvoicesPages
  • fetchFilteredCustomers
  • fetchInvoiceById

にもnoStore()を記述します

 

unstable_noStore は実験的なAPIなので仕様が変更される可能性があるみたいです
安定的なAPIを使いたい場合は、

  1. export const dynamic = “force-dynamic”
  2. fetch(‘https://…’, { cache: ‘no-store’ })

を使ってみてください

 

遅いデータフェッチを再現する

 

ダッシュボードを動的レンダリングにできました!

ただ、前章でも触れた1つでもデータ取得に時間がかかるものがあった場合どうなるでしょうか?

 

実際にアプリケーションを使用して試してみます。

/app/lib/data.ts のfetchRevenue関数内のコメントを↓のように外していきます。

 

Promiseインスタンス+setTimeout を使用することで指定した時間だけ待つことができます

引数に3000msと指定しているので3秒待つことになります。

つまり、この関数の処理に3秒+αかかります。

 

ローカルサーバを起動して、http://localhost:3000/dashboard にアクセスすると

表示に時間がかかることがわかると思います

curlコマンドで時間を計測してみると。。。

約0.6秒と約4.7秒なのでパフォーマンスが大幅に異なりますね

 

なので、

Q. 1つでもデータ取得に時間がかかるものがあった場合どうなるでしょうか?

A. 動的レンダリングでは、アプリケーションの速度は最も遅いデータ取得速度と同じになる。

 

次章でこの課題を解決する方法を見ていきます

 

次章のメモ

 

コメント

タイトルとURLをコピーしました