Webアプリ/Webサイトは、そのHTMLのレンダリング方式としていくつかの種類があります。
特にNext.jsのようなモダンなWebアプリケーションフレームワークでは、ページごとにレンダリング方式を制御することも可能です。
こうした、Webフロントエンド開発を取り巻く環境下では、それぞれのレンダリング方式のメリット/デメリットを理解し、ページの性質に合った方式を選択することが重要となります。
このページでは、各レンダリング方式の概要とメリット/デメリット、加えてmicroCMSを利用する場合の組み込み方法について解説します。
サンプルコードはNext.js(Pages Router)での実装例となります。
CSRはJavaScriptを使用してWebページを動的に生成する方法です。
CSRでは、まずサーバから空のHTMLファイル、CSS、JavaScriptを取得します。その後、APIサーバ(もしくはmicroCMSのようなヘッドレスCMSなど)から初期データを取得し、HTMLをレンダリングします。
import { useEffect, useState } from 'react';
import { createClient } from 'microcms-js-sdk';
const client = createClient({
serviceDomain: 'YOUR_DOMAIN',
apiKey: 'YOUR_API_KEY',
});
const Announcements = () => {
const [announcements, setAnnouncements] = useState([]);
useEffect(() => {
const getAnnouncements = async () => {
const data = await client.get({ endpoint: 'announcements' });
setAnnouncements(data.contents);
};
getAnnouncements();
}, []);
return (
<div>
{announcements.map((announcement) => (
<div key={announcement.id}>
<h2>{announcement.title}</h2>
<p>{announcement.content}</p>
</div>
))}
</div>
);
};
export default Announcements;SSRは、サーバ側でHTMLを生成する方法です。
クライアントからのリクエストを受けたサーバが、APIのリクエストなどを通じて必要なコンテンツを取得した後にHTMLを生成し、クライアントに返却します。
クライアントは、レンダリング済みのHTMLを受け取り、CSSやJavaScriptの読み込みを行い、ページを表示します。
クライアント側ではなくサーバ側でHTMLを生成する点で、CSRとは対照的な方式です。
import { createClient } from 'microcms-js-sdk';
const client = createClient({
serviceDomain: 'YOUR_DOMAIN',
apiKey: 'YOUR_API_KEY',
});
export const getServerSideProps = async () => {
const data = await client.get({ endpoint: 'announcements' });
return {
props: {
announcements: data.contents,
},
};
};
const Announcements = ({ announcements }) => {
return (
<div>
{announcements.map((announcement) => (
<div key={announcement.id}>
<h2>{announcement.title}</h2>
<p>{announcement.content}</p>
</div>
))}
</div>
);
};
export default Announcements;SSGは、事前に静的なHTMLを生成する方法です。
SSGではコンテンツやテンプレートが更新された際に、ビルドプロセスを実行してすべてのページを事前に生成しておきます。それらの静的ファイルをホスティングサーバにデプロイし、クライアントのリクエストに対してレスポンスします。
SSGの特性を活かすため、CDNに配置し配信することが一般的となっています。

import { createClient } from 'microcms-js-sdk';
const client = createClient({
serviceDomain: 'YOUR_DOMAIN',
apiKey: 'YOUR_API_KEY',
});
export const getStaticProps = async () => {
const data = await client.get({ endpoint: 'announcements' });
return {
props: {
announcements: data.contents,
},
};
};
const Announcements = ({ announcements }) => {
return (
<div>
{announcements.map((announcement) => (
<div key={announcement.id}>
<h2>{announcement.title}</h2>
<p>{announcement.content}</p>
</div>
))}
</div>
);
};
export default Announcements;ISRは、SSGとSSRの特徴を組み合わせたハイブリッドなレンダリング方式です。
ISRではSSGのようにサイト全体を事前に構築するのではなく、必要なページを必要なタイミングで生成します。生成されたページはキャッシュされ、以降のリクエストでは静的なコンテンツとして提供されます。
また、キャッシュには有効期限を指定でき、有効期限が過ぎた後にアクセスがあると、改めてページの再生成を行います。この機構によってある程度鮮度の高いコンテンツを提供できます。
なお現在ISRは、Next.jsなどの一部のフレームワークでサポートされています。
import { createClient } from 'microcms-js-sdk';
const client = createClient({
serviceDomain: 'YOUR_DOMAIN',
apiKey: 'YOUR_API_KEY',
});
export const getStaticPaths = async () => {
const data = await client.get({ endpoint: 'announcements' });
const paths = data.contents.map((announcement) => ({
params: { id: announcement.id.toString() },
}));
return {
paths,
fallback: true,
};
};
export const getStaticProps = async ({ params }) => {
const data = await client.get({ endpoint: `announcements/${params.id}` });
return {
props: {
announcement: data,
},
revalidate: 10,
};
};
const Announcement = ({ announcement }) => {
return (
<div>
<h2>{announcement.title}</h2>
<p>{announcement.content}</p>
</div>
);
};
export default Announcement;