Bird
Raised Fist0
NextJSframework~10 mins

Router cache on client in NextJS - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Router cache on client
User clicks link
↓
Check cache for route data
↓
Show page to user
When a user navigates, Next.js first checks if the route data is cached on the client. If yes, it loads instantly. If not, it fetches from the server and caches it for next time.
Execution Sample
NextJS
import { useRouter } from 'next/router';

const router = useRouter();

router.push('/about');

// Next.js caches /about page data on client
// Next visit loads instantly from cache
This code navigates to the '/about' page and Next.js caches the page data on the client for faster future loads.
Execution Table
StepActionCache CheckData SourceCache UpdatePage Render
1User clicks '/about' linkCheck cache for '/about'Cache missFetch from serverRender after fetch
2Data fetched from serverN/AServer responseCache '/about' dataRender page
3User clicks '/about' againCheck cache for '/about'Cache hitNo fetch neededRender instantly from cache
4User clicks '/contact'Check cache for '/contact'Cache missFetch from serverRender after fetch
5Data fetched from serverN/AServer responseCache '/contact' dataRender page
6User clicks '/contact' againCheck cache for '/contact'Cache hitNo fetch neededRender instantly from cache
7User clicks '/about' againCheck cache for '/about'Cache hitNo fetch neededRender instantly from cache
💡 Navigation ends when user stops clicking links or closes page.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4After Step 5After Step 6After Step 7
cache{}{'/about': undefined}{'/about': data}{'/about': data}{'/about': data, '/contact': undefined}{'/about': data, '/contact': data}{'/about': data, '/contact': data}{'/about': data, '/contact': data}
currentPagenull'/about''/about''/about''/contact''/contact''/contact''/about'
Key Moments - 3 Insights
Why does the first click on a route take longer than the second?
The first click causes a cache miss, so Next.js fetches data from the server (see execution_table step 1 and 2). The second click hits the cache and renders instantly (step 3).
Does the cache update every time I visit a page?
No, the cache updates only on a cache miss when data is fetched from the server (see execution_table steps 2 and 5). On cache hits, no fetch or cache update happens.
What happens if I navigate to a new page not in cache?
Next.js fetches the page data from the server and caches it for future visits (see steps 4 and 5). This ensures faster loads next time.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the data source at step 3?
ANo data source
BCache hit
CServer fetch
DCache miss
💡 Hint
Check the 'Data Source' column at step 3 in execution_table.
At which step does the cache first get updated with '/contact' data?
AStep 5
BStep 4
CStep 6
DStep 7
💡 Hint
Look at the 'Cache Update' column for '/contact' in execution_table.
If the cache was empty, what would happen at step 1?
ANo render happens
BCache hit and instant render
CCache miss and fetch from server
DPage crashes
💡 Hint
Refer to the 'Cache Check' and 'Data Source' columns at step 1.
Concept Snapshot
Next.js client router caches page data after first fetch.
On navigation, it checks cache first.
Cache hit: instant render, no fetch.
Cache miss: fetch from server, then cache.
Speeds up repeated page visits.
Cache updates only on misses.
Full Transcript
When a user clicks a link in a Next.js app, the router first checks if the page data is cached on the client. If the data is cached, the page renders instantly without fetching from the server. If not cached, Next.js fetches the data from the server, caches it, and then renders the page. This caching mechanism speeds up repeated visits to the same page. The cache updates only when the data is fetched due to a cache miss. This process repeats for each navigation, improving user experience by reducing load times on subsequent visits.

Practice

(1/5)
1. What is the main purpose of router cache on the client in Next.js?
easy
A. To disable client-side navigation completely
B. To speed up navigation by storing visited pages locally
C. To increase server load by fetching pages repeatedly
D. To prevent users from accessing certain pages

Solution

  1. Step 1: Understand router cache concept

    Router cache stores pages visited by the user on the client side to avoid reloading them from the server.
  2. Step 2: Identify the effect on navigation speed

    By storing pages locally, navigation becomes faster and smoother because the browser doesn't need to fetch the page again.
  3. Final Answer:

    To speed up navigation by storing visited pages locally -> Option B
  4. Quick Check:

    Router cache = faster navigation [OK]
Hint: Router cache means storing pages locally for faster navigation [OK]
Common Mistakes:
  • Thinking router cache increases server load
  • Confusing cache with disabling navigation
  • Assuming cache blocks page access
2. Which Next.js router method is used to prefetch a page and cache it on the client?
easy
A. router.prefetch()
B. router.load()
C. router.cache()
D. router.fetch()

Solution

  1. Step 1: Recall Next.js router methods

    Next.js provides a method called router.prefetch() to load pages in advance.
  2. Step 2: Match method to caching behavior

    router.prefetch() loads the page and stores it in the client cache for faster navigation.
  3. Final Answer:

    router.prefetch() -> Option A
  4. Quick Check:

    Prefetch method caches pages [OK]
Hint: Prefetch means load ahead to cache page [OK]
Common Mistakes:
  • Using non-existent methods like router.load()
  • Confusing fetch with prefetch
  • Assuming cache() is a router method
3. Given this code snippet in a Next.js component:
import { useRouter } from 'next/router';

export default function Home() {
  const router = useRouter();
  router.prefetch('/about');
  return <button onClick={() => router.push('/about')>Go to About</button>;
}

What happens when the user clicks the button?
medium
A. An error occurs because prefetch cannot be called inside the component
B. The /about page reloads from the server every time
C. The button does nothing because prefetch disables navigation
D. The /about page loads instantly from client cache

Solution

  1. Step 1: Understand router.prefetch usage

    The code calls router.prefetch('/about') inside the component, which loads and caches the /about page on the client.
  2. Step 2: Analyze button click behavior

    When clicking the button, router.push('/about') navigates to the cached page, making the load instant without server fetch.
  3. Final Answer:

    The /about page loads instantly from client cache -> Option D
  4. Quick Check:

    Prefetch + push = instant load [OK]
Hint: Prefetch before push means instant page load [OK]
Common Mistakes:
  • Thinking prefetch disables navigation
  • Assuming page reloads from server always
  • Believing prefetch causes errors inside components
4. Identify the error in this Next.js code that tries to prefetch a page:
import { useRouter } from 'next/router';

export default function Page() {
  const router = useRouter();

  function handleClick() {
    router.prefetch('/contact')
  }

  return <button onClick={handleClick}>Load Contact</button>;
}
medium
A. router.prefetch must be called outside event handlers
B. Missing semicolon after router.prefetch call causes syntax error
C. No error; code correctly prefetches on button click
D. useRouter cannot be used inside functional components

Solution

  1. Step 1: Check router.prefetch usage

    Calling router.prefetch('/contact') inside an event handler is valid and triggers prefetch when the button is clicked.
  2. Step 2: Verify syntax and hooks usage

    The code has correct syntax and useRouter is properly used inside the functional component.
  3. Final Answer:

    No error; code correctly prefetches on button click -> Option C
  4. Quick Check:

    Prefetch in event handler is valid [OK]
Hint: Prefetch can run inside event handlers safely [OK]
Common Mistakes:
  • Thinking prefetch must run only on mount
  • Assuming missing semicolon breaks code
  • Believing useRouter is invalid in functional components
5. You want to improve user experience by preloading multiple pages on client side in Next.js. Which approach correctly prefetches pages for /about and /contact when the homepage loads?
hard
A. Call router.prefetch('/about') and router.prefetch('/contact') inside a useEffect hook with empty dependency array
B. Call router.prefetch('/about') and router.prefetch('/contact') directly in the component body
C. Call router.push('/about') and router.push('/contact') inside useEffect
D. Use getServerSideProps to prefetch pages on the server

Solution

  1. Step 1: Understand prefetch timing

    Prefetching pages on client should happen after component mounts to avoid blocking rendering, so useEffect with empty dependencies is ideal.
  2. Step 2: Avoid direct calls in component body or pushing pages

    Calling router.prefetch() directly in the component body runs on every render, which is inefficient. Using router.push() navigates instead of prefetching. getServerSideProps runs on server, not client cache.
  3. Final Answer:

    Call router.prefetch('/about') and router.prefetch('/contact') inside a useEffect hook with empty dependency array -> Option A
  4. Quick Check:

    Prefetch in useEffect = best practice [OK]
Hint: Prefetch pages inside useEffect to run once on mount [OK]
Common Mistakes:
  • Prefetching directly in component body causing repeated calls
  • Using router.push instead of prefetch
  • Trying to prefetch on server side with getServerSideProps
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard