DEV Community

Cover image for Next.js 15 : Incremental Static Regeneration (ISR)
Sonay Kara
Sonay Kara

Posted on

Next.js 15 : Incremental Static Regeneration (ISR)

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>
  )
}
Enter fullscreen mode Exit fullscreen mode

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')
}
Enter fullscreen mode Exit fullscreen mode

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()
  // ...
}
Enter fullscreen mode Exit fullscreen mode

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')
}
Enter fullscreen mode Exit fullscreen mode

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.


If you like my articles, you can buy me a coffee :)
Image description

Top comments (4)

Collapse
 
programmerraja profile image
Boopathi

This is a really helpful overview of ISR in Next.js 15. I especially appreciate the clear explanations of the different revalidation methods and their use cases. The code examples are well-structured and easy to follow.

Collapse
 
sonaykara profile image
Sonay Kara

Thank you so much for feedback. I'm really glad you found the explanations of ISR and the revalidation methods helpful. I aimed to make the code examples clear and easy to follow

Collapse
 
anmolbaranwal profile image
Anmol Baranwal

Did you read the docs? I might need to watch a YouTube tutorial instead… Reading the complete docs would be tough, especially if there are a lot of new changes this time.

Collapse
 
sonaykara profile image
Sonay Kara

Yes I did, reading the documentation can be really time consuming but you have to read the documentation to understand.