React 界隈でいま最も勢いのあるフレームワークは、Next.js です。Next.js は React に最適化されたルーティングやミドルウェア機能を標準搭載し、そして SSR 機能も提供してくれるフレームワークです。
Next.jsはReactのエコシステム内で急速に普及しているフレームワークであり、その強力なPre-rendering機能が大きな魅力となっています。この記事では、その2つの主要なPre-rendering手法、SSRとSSGの違いと実装方法について詳しく解説します。
1. Server Side Rendering (SSR)
定義:
SSRは、クライアントからのリクエストがあるたびにサーバー上でページをレンダリングする方法です。
実装方法:
Next.jsでのSSRの実装は非常にシンプルです。ページコンポーネント内でgetServerSideProps
関数を定義するだけです。
1.ユーザーからのリクエストがサーバーに送信される。
2.サーバーはリクエストごとにページをレンダリングします。
3.レンダリングされたページがユーザーに返され、ブラウザで表示されます。
export async function getServerSideProps(context) {
// データフェッチやDBのクエリをここで行う
const data = await fetchData();
return {
props: { data }
};
}
function MyPage({ data }) {
return (
<div>
{/* レンダリングのロジック */}
</div>
);
}
export default MyPage;
特徴と利点:
- リアルタイムのデータを表示するのに適しています。
- SEOのメリットがあります。検索エンジンはサーバーから返されるHTMLを直接クロールできます。
- クッキーやユーザーエージェントなどのサーバーサイドの情報にアクセスできます。
デメリット:
- トラフィックが多い場合、サーバーに大きな負荷がかかります。
- CDNの利用が難しくなります。
2. Static Site Generation (SSG)
定義:
SSGは、ビルド時にページのHTMLを一度だけ生成し、その後はそのHTMLを再利用する方法です。
実装方法:
Next.jsでのSSGの実装もSSRと同様に簡単です。ページコンポーネント内でgetStaticProps
関数を定義するだけです。
1.ビルドプロセス中にページが一度レンダリングされ、その結果がサーバーに保存されます。
2.ユーザーからのリクエストが来るたびに、保存されたページが提供されます。
3.ユーザーのブラウザでページが表示されます。
export async function getStaticProps() {
// ビルド時にデータフェッチやDBのクエリを行う
const data = await fetchData();
return {
props: { data },
revalidate: 60 // オプション: 60秒後に再生成
};
}
function MyPage({ data }) {
return (
<div>
{/* レンダリングのロジック */}
</div>
);
}
export default MyPage;
特徴と利点:
- 高速なパフォーマンスを提供します。すでに生成されたHTMLが返されるため、サーバーのレンダリングが不要です。
- CDNとの相性が非常に良く、世界中のエッジサーバーでコンテンツをキャッシュできます。
- SEOのメリットもあります。
デメリット:
- ビルド時にしかHTMLが生成されないため、リアルタイムの更新が難しいです。ただし、
revalidate
オプションを使用して、定期的に再生成を行うことができます。
どちらを選ぶべきか?
- SSRは、リアルタイムのデータやサーバーサイドの情報が必要な場合に適しています。
- SSGは、静的なコンテンツや更新頻度が低いページ、高速な読み込みを求めるページに適しています。
まとめ
Next.jsは、SSRとSSGの両方のメリットを活かすことができる強力なフレームワークです。プロジェクトの要件や特性に応じて、適切なPre-rendering手法を選択することが大切です。