Home  >  Article  >  Web Front-end  >  Next.js : Incremental Static Regeneration (ISR)

Next.js : Incremental Static Regeneration (ISR)

Linda Hamilton
Linda HamiltonOriginal
2024-10-24 18:39:43786browse

With Incremental Static Regeneration (ISR)

We can update static content without recreating the entire site. We can reduce the server load by providing pre-created 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.


If you like my articles, you can buy me a coffee :)
Next.js : Incremental Static Regeneration (ISR)

The above is the detailed content of Next.js : Incremental Static Regeneration (ISR). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn