- HOME >
- Jamstack用語集 >
- On-demand ISR
On-demand ISR
オンデマンド アイエスアール
On-demand ISR を分かりやすく
On-demand ISR(オンデマンド アイエスアール)は、Next.js の機能で、データが変更されたときに静的ページをリビルドする機能です。ISR は「Incremental Static Regeneration」の略であり、従来の静的サイト生成(SSG)とは異なり、ページをリビルドする際に全てのページを更新するのではなく、必要なページだけを更新します。これにより、リアルタイム性とパフォーマンスが向上します。
基本的な On-demand ISR の実装
On-demand ISR を実装するためには、Next.js のgetStaticProps
関数を使用します。getStaticProps
は、ビルド時にサーバーサイドで実行される関数で、静的ページのデータを提供します。On-demand ISR を有効にするには、getStaticProps
関数内でrevalidate
オプションを設定します。revalidate
には、再生成の間隔(秒)を設定します。
// pages/posts/[id].tsx
import { GetStaticPaths, GetStaticProps } from 'next'
import { useRouter } from 'next/router'
import { Post, getPost, getPostIds } from '../../lib/posts'
interface PostPageProps {
post: Post
}
const PostPage = ({ post }: PostPageProps) => {
const router = useRouter()
if (router.isFallback) {
return <div>Loading...</div>
}
return (
<div>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>
)
}
export const getStaticPaths: GetStaticPaths = async () => {
const paths = getPostIds().map((id) => ({ params: { id } }))
return { paths, fallback: true }
}
export const getStaticProps: GetStaticProps<PostPageProps> = async ({ params }) => {
const post = getPost(params.id as string)
return { props: { post }, revalidate: 10 }
}
export default PostPage
上記の例では、getStaticProps
関数でrevalidate: 10
を設定しています。これにより、10 秒ごとにページが再生成されます。
データの変更に対応する
データが変更されたときに、On-demand ISR をトリガーする方法はいくつかあります。例えば、データベースの Web フックを使用して、データが更新されたときに Next.js に通知することができます。これにより、データの変更をリアルタイムに反映することができます。
Vercel と Web フックを使用したデータ更新のトリガー
Next.js アプリケーションを Vercel でデプロイしている場合、Web フックを使用してデータの更新をトリガーすることができます。まず、Vercel のダッシュボードでプロジェクトの設定に移動し、「Web フック」セクションで新しい Web フックを作成します。作成した Web フックの URL をデータベースや CMS で設定し、データが更新されたときに Web フックが呼び出されるようにします。
次に、Next.js アプリケーション内で、Vercel の Web フックを受信する API エンドポイントを作成します。以下の例では、pages/api/update-posts.ts
という API エンドポイントを作成し、Vercel の Web フックを受信しています。
// pages/api/update-posts.ts
import { NextApiRequest, NextApiResponse } from 'next'
export default async (req: NextApiRequest, res: NextApiResponse) => {
if (req.method === 'POST') {
// VercelのWebフックを受信した後の処理を実装します。
// 例: データの変更を検知し、必要に応じてISRをトリガーします。
res.status(200).json({ message: 'Webhook received' })
} else {
res.status(405).json({ message: 'Method not allowed' })
}
}
この API エンドポイントをデータベースや CMS の Web フックとして設定することで、データの変更を検知し、必要に応じて On-demand ISR をトリガーすることができます。
On-demand ISR の利点
On-demand ISR は、次のような利点があります。
- リアルタイム性: データの変更がリアルタイムに反映されます。
- パフォーマンス: 必要なページだけが更新されるため、ビルド時間が短縮されます。
- スケーラビリティ: 大量のページがあっても、必要なページだけが更新されるため、スケーラビリティが向上します。
これらの利点により、On-demand ISR は、Next.js アプリケーションのパフォーマンスやリアルタイム性を向上させるだけでなく、開発者の作業効率も向上させます。静的ページの生成にかかる時間を短縮することで、デプロイ時間が短くなり、変更を迅速に適用することができます。
注意点と制限事項
On-demand ISR を使用する際には、いくつかの注意点と制限事項があります。
- キャッシュの管理: On-demand ISR を使用すると、ページが更新されるタイミングが不定になるため、キャッシュの管理が重要になります。Next.js と Vercel では、キャッシュの管理が簡単に行えるようになっていますが、他のプラットフォームや CDN を使用する場合は、キャッシュの設定に注意が必要です。
- サーバーレス関数の制限: On-demand ISR は、Next.js のサーバーレス関数を利用して実行されます。そのため、サーバーレス関数の制限(実行時間、リソース使用量など)に影響を受けることがあります。大規模なアプリケーションや高負荷な状況では、これらの制限に対処するために、適切な設定や最適化が必要になる場合があります。
まとめ
On-demand ISR は、Next.js の強力な機能であり、データの変更をリアルタイムに反映しながら、パフォーマンスとスケーラビリティを向上させることができます。Next.js と TypeScript を組み合わせることで、より堅牢でメンテナンス性の高いアプリケーションを構築することができます。On-demand ISR を適切に活用することで、革新的な Web アプリケーションを開発し、最高のユーザーエクスペリエンスを提供することができます。