Next.jsのチュートリアルをやってみる【レンダリング編】

前回

Next.jsのチュートリアルをやってみる【データの取得編】

はじめに

前回はダッシュボードページにてデータを取得する方法を学びました。ダッシュボードページは静的レンダリングで生成されたページであるため、データの更新はアプリケーションに反映されません、今回は動的に反映する方法を学びたいと思います。

静的レンダリングとは

データのフェッチとレンダリングはビルド時(デプロイ時)またはデータの再検証時にサーバー上で行われます。ユーザーがアプリケーションにアクセスするたびに、キャッシュされた結果が提供されます。

項目内容
ウェブサイトの高速化プリレンダリングされたコンテンツはキャッシュしグローバルに配信されるので、世界中のユーザーがより迅速にアクセスすることが可能。
サーバー負荷の軽減コンテンツがキャッシュされるので、サーバーはユーザーからのリクエスト毎に動的に生成する必要がなくなる。
SEOプリレンダリングされたコンテンツはページがロードされた時点ですでに利用可能な状態になっているため、検索エンジンのクローラーがインデックスしやすくなる。
静的レンダリングのメリット

静的なレンダリングは静的なブログ記事や製品ページなど、データのないUIやユーザー間で共有されるデータに便利です。定期的に更新されるパーソナライズされたデータを持つダッシュボードには適していないかもしれません。

動的レンダリング

動的レンダリングはユーザーからのリクエスト時に各ユーザーに対してサーバー上でコンテンツがレンダリングされます。

項目内容
リアルタイムデータダイナミックレンダリングにより、アプリケーションはリアルタイムまたは頻繁に更新されるデータを表示できます。データが頻繁に変更されるアプリケーションに最適です。
ユーザー固有のコンテンツダッシュボードやユーザープロファイルなど、パーソナライズされたコンテンツを提供し、ユーザーとのインタラクションに基づいてデータを更新することが容易になります。
リクエスト時の情報動的レンダリングでは、クッキーやURL検索パラメータなど、リクエスト時にしかわからない情報にアクセスできます。
動的レンダリングのメリット

低速データフェッチのシミュレーション

現在のチュートリアルで作成しているダッシュボードアプリは動的です。しかし前回のチュートリアルで発生した以下の問題があります。

複数のデータ取得のうち、一つのデータリクエストがほかのリクエストより遅い場合、遅いデータリクエストが完了するまで、UIが表示されなくなってしまいます。

このような問題を再現するためにシミュレートしてみましょう。data.tsファイルでfetchRevenue()内のconsole.logsetTimeoutのコメントを外しましょう。

/app/lib/data.ts
export async function fetchRevenue() {
  try {
    // Artificially delay a response for demo purposes.
    // Don't do this in production :)

    console.log('Fetching revenue data...');
    await new Promise((resolve) => setTimeout(resolve, 3000));

    const data = await sql<Revenue>`SELECT * FROM revenue`;

    console.log('Data fetch completed after 3 seconds.');

    return data.rows;
  } catch (error) {
    console.error('Database Error:', error);
    throw new Error('Failed to fetch revenue data.');
  }
}

サーバーが起動されていることを確認したら、http://localhost:3000/dashboard/にアクセスし、ページの読み込みに時間がかかることを確認してください。

サーバーを起動しているコマンドプロンプトを確認すると、以下のようなメッセージを確認することができます。

Fetching revenue data...
Data fetch completed after 3 seconds.

ここでは、遅いデータフェッチをシミュレートするために、3秒の遅延を追加しました。その結果、データがフェッチされている間、ページ全体がユーザーにUIを表示するのをブロックしてしまいます。動的レンダリングでは、アプリケーションは最も遅いデータフェッチと同じ速度しか出せません。

次回はユーザーエクスペリエンスを向上させるための『ストリーミング』について学んでいきます。

まとめ

  • 静的レンダリングは静的なブログ記事や製品ページなど、データのないUIやユーザー間で共有されるデータに便利。
  • 動的レンダリングはデータが頻繁に変更されるアプリケーションに最適。

次回

Next.jsのチュートリアルをやってみる【ストリーミング編】

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です