Home / Articles / Understanding Cache Components and Partial Prefetching in Next.js 16.3

This article is published in English.

Understanding Cache Components and Partial Prefetching in Next.js 16.3

Explains how Next.js 16.3's Instant Navigations feature uses shared route shells and explicit streaming decisions to make server-rendered apps feel instant.

1155 words

The App Router has long carried a subtle disadvantage compared to a pure client-rendered SPA.

When everything runs in the browser, moving between routes is nothing more than a state update, so it happens instantly by definition. Server-first rendering gives up that instant feeling in exchange for a much smaller initial payload.

You pay for that tradeoff later, though: every navigation past the first one means talking to the server all over again.

Next.js 16.3 tackles that exact problem head-on.

The feature is called Instant Navigations, and it rests on two underlying mechanisms: Cache Components and Partial Prefetching.

Every navigation feature this framework has ever shipped has looked amazing on a MacBook.

So what does it actually do?

The idea is lifted almost directly from single-page application design. Rather than prefetching a full copy of the destination page for every link, which is how earlier versions behaved,

Next.js now prefetches a shell that's shared per route and keeps it cached on the client. The moment you click a link, that shell renders right away while the server streams in the remaining content behind it.

That shell is deliberately unremarkable. It's the layout, the navigation chrome, headings, and skeleton structure, basically anything that looks identical no matter which specific page of that route you land on. Because it never changes, it's perfectly safe to cache once and reuse across dozens of links that all point to the same route.

You enable it with two configuration flags:

const nextConfig: NextConfig = {
  cacheComponents: true,
  partialPrefetching: true,
};

Both flags are expected to become defaults in some future major release. Turning them on today puts you ahead of that change, not off in some experimental dead end.

Why this is more than "prefetching, but quicker"

The real shift here isn't primarily about raw speed. It's about forcing an explicit decision on every route.

Next.js 16.3 introduces a new development tool called Instant Insights, which automatically flags, right in your dev environment, any navigation that doesn't qualify as instant. To remove that flag, each route now has to state clearly what should happen when its data isn't ready yet. There are exactly three valid answers:

Stream it. Wrap the slow part in <Suspense> so a loading shell shows while the server finishes its work.

Cache it. Tag it with 'use cache' so a previously generated version can be served instead of waiting.

Deliberately block it. Use export const instant = false for routes where waiting is actually the right behavior, such as a checkout confirmation, where showing stale data would be worse than making the user wait a moment.

That third path deserves attention. It turns "this route is slow" from an unnoticed accident into a deliberate, documented decision. The framework isn't demanding that every route be instant. It's saying that from now on, being slow has to be intentional, not the default.

Where this genuinely pays off

The strongest case is anything with a long list of links, like a support inbox showing forty ticket rows. Each individual ticket page likely shares the same toolbar, metadata grid, and conversation skeleton. If you prefetch a whole separate page per link, you end up fetching that identical shared structure forty separate times. Partial Prefetching instead fetches the shared shell once, reuses it for every link pointing to that route, and only streams in the part that's actually unique, the specific ticket's content.

That's a concrete, meaningful improvement, and it lines up closely with how a lot of SaaS dashboards are actually built.

The catch most coverage leaves out

One developer migrated a personal blog to the 16.3 preview on a separate branch, adopting cache components and partial prefetching fully, and backed it with a 19-test Playwright suite specifically asserting that navigations were instant. Every test passed.

After clicking through both versions for a week straight, they couldn't detect any real difference.

The explanation turned out to be almost disappointingly simple.

The site was already fully static: every page had been prerendered at build time and served straight from a CDN. There was no server round trip left to eliminate, so Instant Navigations had no gap left to close.

What actually made the site feel snappier was something else entirely: trimming 341KB of gzipped JavaScript.

That's the caveat you need to hold onto before adopting this feature. Instant Navigations closes the delay between clicking a link and seeing content specifically for dynamic routes that depend on the server.

If your app is already static, or already fast for other reasons, you'd be adopting a feature to solve a problem that doesn't exist in your case.

Try it first on the routes that genuinely feel slow, rather than rolling it out across the whole site, and measure the results on a throttled mid-range Android connection rather than a laptop on fast office wifi. The MacBook comment at the start is worth keeping in mind: nearly every navigation feature this framework has ever introduced has looked impressive on a MacBook.

The framework isn't demanding that every route be instant. It's saying that from now on, being slow has to be intentional, not the default.

What to actually do about it

If you're already running Next.js 16.x and navigations feel slow, start small. Enable Partial Prefetching on just your two or three busiest routes before rolling it out anywhere else. Most of the benefit comes from the shell work, and testing on a narrow scope will also reveal whether your layouts were ever properly separated from their data fetching, which for many real-world codebases turns out to be the more useful discovery.

If you're still on the Pages Router and debating whether to migrate, this feature shouldn't be your deciding factor. Turbopack becoming the default for development, along with the broader stabilization of the App Router, are the real reasons to move. Instant Navigations is a bonus you get afterward, not a reason to start the migration in the first place.

And if your app is already fully static, skip the migration altogether.

Go look for your own 341KB instead.