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.
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') }
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 :)
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!