With Incremental Static Regeneration (ISR)
Incremental Static Regeneration (ISR) in Next.js provides a powerful approach to combine the best of static and dynamic content. By enabling static content updates without recreating the entire site, ISR allows for a more scalable and efficient way of handling pages. We can significantly reduce server load, handle large volumes of content, and ensure users see up-to-date information without waiting for full regeneration of all pages.
We can update static content without recreating the entire site. We can reduce the server load by providing prerendered static pages for most requests.We can process a large number of content pages before the next creation times are long.
Let's start with an example :
export const revalidate = 30
export const dynamicParams = true // or false, to 404 on unknown paths
export async function generateStaticParams() {
const posts = await fetch('https://jsonplaceholder.typicode.com/posts/').then((res) =>
res.json()
)
return posts.map((post) => ({
id: String(post.id),
}))
}
export default async function Page({ params }) {
const post = await fetch(`https://jsonplaceholder.typicode.com/posts/${params.id}`).then(
(res) => res.json()
)
return (
<main>
<h1>{post.title}</h1>
<p>{post.content}</p>
</main>
)
}
How this example works ?
All requests made to these pages (e.g. /post/1) are cached and instantaneous. After 30 seconds has passed, the next request will still show the cached (stale) page. The cache is invalidated and a new version of the page begins generating in the background. Once generated successfully, Next.js will display and cache the updated page If /post/12 is requested, Next.js will generate and cache this page on-demand.
If you need more precision, on-demand revalidation can be used, but if you need real-time data, consider switching to dynamic processing.
On-demand Revalidation with revalidatePath
Next.js allows you to manually clear the cache of a specific page or route . That is, when a certain content is updated, instead of recreating all the pages, you can only recreate the changed page or content.
You want the page to be updated immediately when there is a change (for example, when a new post is added), you can trigger this process by using the revalidatePath function. In other words, you can make the new content appear as soon as a new content is added to the user.
'use server'
import { revalidatePath } from 'next/cache'
export async function createPost() {
// Invalidate the /posts route in the cache
revalidatePath('/posts')
}
On-demand Revalidation with revalidateTag
Next.js applications, it allows you to manually clear their cache by tagging certain data or content. This is used to clear the entire cache of that content when a certain content changes. When the content is updated, users see the latest data.
export default async function Page() {
const data = await fetch('https://api.vercel.app/blog', {
next: { tags: ['posts'] },
})
const posts = await data.json()
// ...
}
You can then use revalidateTag :
'use server'
import { revalidateTag } from 'next/cache'
export async function createPost() {
// Invalidate all data tagged with 'posts' in the cache
revalidateTag('posts')
}
ISR is not supported when creating a Static Export. If you have multiple fetch requests in a statically rendered route, and each has a different revalidate frequency, the lowest time will be used for ISR. However, those revalidate frequencies will still be respected by the Data Cache.If any of the fetch requests used on a route have a revalidate' time of 0, or an explicit no-store, the route will be dynamically rendered. Middleware won't be executed for on-demand USER requests, meaning any path rewrites or logic in Middleware will not be applied. Ensure you are revalidating the exact path. For example, /post/1 instead of a rewritten /post-1.
Conclusion
ISR is an optimal solution for projects where content updates frequently, but full dynamic rendering is not necessary. However, in scenarios where real-time data is a priority, switching to dynamic processing might be more appropriate.