Bird
Raised Fist0
NextJSframework~8 mins

On-demand revalidation in NextJS - Performance & Optimization

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Performance: On-demand revalidation
MEDIUM IMPACT
On-demand revalidation affects how quickly updated content appears without rebuilding the entire site, impacting page load speed and freshness.
Updating static pages after content changes
NextJS
import { NextApiRequest, NextApiResponse } from 'next';

export default async function handler(req, res) {
  // Trigger revalidation for specific path
  await res.revalidate('/path-to-update');
  res.json({ revalidated: true });
}

// Only updated pages rebuild on demand
Only revalidates changed pages on demand, avoiding full rebuilds and reducing load time.
📈 Performance GainReduces rebuild time from seconds to milliseconds, improving LCP
Updating static pages after content changes
NextJS
export async function getStaticProps() {
  // fetch data
  return { props: { data }, revalidate: 60 };
}
// Full site rebuild triggered on every change or long revalidate interval
Triggers full or frequent rebuilds causing slower page loads and stale content.
📉 Performance CostBlocks rendering for full rebuild duration, increasing LCP by seconds
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Full static rebuild on every changeN/A (server-side)N/ABlocks LCP until rebuild completes[X] Bad
On-demand revalidation for specific pagesN/A (server-side)N/AMinimal impact on LCP, fast update[OK] Good
Rendering Pipeline
On-demand revalidation updates cached pages asynchronously, so the browser serves fresh content without blocking initial rendering.
Server-side Rendering
Cache Update
Network Response
⚠️ BottleneckServer-side rebuild time for updated pages
Core Web Vital Affected
LCP
On-demand revalidation affects how quickly updated content appears without rebuilding the entire site, impacting page load speed and freshness.
Optimization Tips
1Trigger revalidation only for pages that changed to minimize rebuild time.
2Avoid full site rebuilds on every content update to improve LCP.
3Use API routes to call res.revalidate() for precise cache updates.
Performance Quiz - 3 Questions
Test your performance knowledge
What is the main performance benefit of on-demand revalidation in Next.js?
AIt disables caching to always fetch fresh data
BIt preloads all pages at build time
CIt updates only changed pages without rebuilding the entire site
DIt forces client-side rendering for all pages
DevTools: Network
How to check: Open DevTools Network tab, reload page, and observe if the page is served from cache or triggers a revalidation request.
What to look for: Look for 200 status with fresh content or 304 not modified; fast responses indicate good on-demand revalidation.

Practice

(1/5)
1. What is the main purpose of on-demand revalidation in Next.js?
easy
A. To disable static site generation completely
B. To rebuild the whole site every time a user visits
C. To update specific static pages instantly without rebuilding the entire site
D. To cache pages permanently without updates

Solution

  1. Step 1: Understand static site generation

    Static pages are pre-built and served fast but can become outdated.
  2. Step 2: Role of on-demand revalidation

    It updates only specific pages instantly without rebuilding the whole site, keeping content fresh.
  3. Final Answer:

    To update specific static pages instantly without rebuilding the entire site -> Option C
  4. Quick Check:

    On-demand revalidation = update specific pages fast [OK]
Hint: Remember: on-demand means update only what is needed [OK]
Common Mistakes:
  • Thinking it rebuilds the entire site
  • Confusing it with disabling static generation
  • Assuming pages never update
2. Which Next.js API method is used inside an API route to trigger on-demand revalidation?
easy
A. res.reload(path)
B. res.refresh(path)
C. res.update(path)
D. res.revalidate(path)

Solution

  1. Step 1: Identify the method for revalidation

    Next.js provides res.revalidate(path) to trigger revalidation of a page.
  2. Step 2: Confirm method usage in API route

    This method is called inside an API route handler to update the static page at the given path.
  3. Final Answer:

    res.revalidate(path) -> Option D
  4. Quick Check:

    API route uses res.revalidate() to update pages [OK]
Hint: Look for 'revalidate' keyword in the method name [OK]
Common Mistakes:
  • Using non-existent methods like res.refresh()
  • Confusing with client-side reload methods
  • Misspelling the method name
3. Given this API route code snippet, what will happen when a POST request with the correct secret is sent?
export default async function handler(req, res) {
  if (req.method === 'POST' && req.query.secret === process.env.MY_SECRET) {
    await res.revalidate('/blog/post-1')
    return res.json({ revalidated: true })
  }
  return res.status(401).json({ message: 'Invalid token' })
}
medium
A. The page '/blog/post-1' will be revalidated and a success JSON returned
B. The entire site will rebuild and return a success JSON
C. The request will fail with a 401 error regardless of the secret
D. The page '/blog/post-1' will reload on the client side

Solution

  1. Step 1: Check request method and secret

    The handler checks if the method is POST and the secret matches the environment variable.
  2. Step 2: Call res.revalidate on the specific page

    If conditions pass, it calls res.revalidate('/blog/post-1') to update that page only.
  3. Final Answer:

    The page '/blog/post-1' will be revalidated and a success JSON returned -> Option A
  4. Quick Check:

    Correct secret + POST triggers revalidation [OK]
Hint: Check method and secret before revalidate call [OK]
Common Mistakes:
  • Assuming entire site rebuilds
  • Ignoring secret check
  • Thinking client reload happens automatically
4. Identify the error in this API route code for on-demand revalidation:
export default async function handler(req, res) {
  if (req.method === 'GET' && req.query.secret === process.env.SECRET) {
    await res.revalidate('/home')
    res.json({ revalidated: true })
  } else {
    res.status(401).json({ message: 'Unauthorized' })
  }
}
medium
A. Missing await before res.json()
B. Not returning after res.json() causing possible errors
C. Using GET method instead of POST for revalidation
D. Incorrect path string in res.revalidate()

Solution

  1. Step 1: Check response handling after revalidation

    After calling res.revalidate() and sending JSON, the function should return to avoid continuing execution.
  2. Step 2: Identify missing return statement

    The code calls res.json() but does not return, which can cause errors or multiple responses.
  3. Final Answer:

    Not returning after res.json() causing possible errors -> Option B
  4. Quick Check:

    Always return after sending response [OK]
Hint: Return immediately after sending response [OK]
Common Mistakes:
  • Using GET instead of POST (allowed but not recommended)
  • Forgetting to return after res.json()
  • Assuming res.revalidate() rebuilds entire site
5. You want to revalidate multiple pages on-demand after updating content. Which approach correctly triggers revalidation for '/about' and '/contact' in one API route?
hard
A. await res.revalidate('/about'); await res.revalidate('/contact'); res.json({ revalidated: true })
B. await res.revalidate(['/about', '/contact']); res.json({ revalidated: true })
C. res.revalidate('/about', '/contact'); res.json({ revalidated: true })
D. res.revalidate('/about'); res.revalidate('/contact'); res.json({ revalidated: true })

Solution

  1. Step 1: Understand res.revalidate usage

    The res.revalidate() method accepts a single path string and returns a promise.
  2. Step 2: Revalidate multiple pages sequentially

    To revalidate multiple pages, call await res.revalidate() separately for each path before sending response.
  3. Final Answer:

    await res.revalidate('/about'); await res.revalidate('/contact'); res.json({ revalidated: true }) -> Option A
  4. Quick Check:

    Call res.revalidate() separately for each page [OK]
Hint: Call revalidate separately for each page with await [OK]
Common Mistakes:
  • Passing array of paths to res.revalidate() (not supported)
  • Calling res.revalidate without await causing race conditions
  • Calling res.revalidate without returning or sending response