Prefetch behaviour
With partialPrefetching on, Next.js prefetches one reusable App Shell per route rather than one prefetch per visible link. A page with twenty links to the same route produces one prefetch, not twenty.
The three destinations below differ only in their prefetch segment export, so the network tab tells you exactly what each one costs.
What to check
Prefetching is build-only. Next.js does not prefetch in next dev. Everything on this page needs pnpm build && pnpm start.
The recipe. Open the network tab, filter to Fetch/XHR, clear it, then reload this page and scroll the link groups into view. Prefetches fire as links enter the viewport.
What to expect. The force-disabled group requests no segment data at all — route metadata may still be fetched, but the segment and everything deeper is omitted. The other two request an App Shell each.
Shared shells. Note the four links to the same destination in the last group produce one request between them, not four. That is the point of partial prefetching.
Per-link escalation. A <Link prefetch={true}> pulls more than the shell — it resolves params, searchParams and the full URL, which costs a server render per link on any page that reads runtime data.
Destinations
prefetch = 'partial'Explicitly opts into partial prefetching. Redundant while the global flag is on — this is the per-segment form you would use for incremental adoption without it.
/prefetch/partialno prefetch exportThe default. Follows whatever partialPrefetching is set to app-wide. Do not write prefetch = 'auto' explicitly; omitting the export is the same thing.
/prefetch/autoprefetch = 'force-disabled'Never prefetched. Segment data for this route and everything below it is omitted. For pages behind auth, or ones rarely visited, where a prefetch is pure waste.
/prefetch/disabledLink-level intent
prefetch props. The destination’s ceiling still applies, so these can ask for less than the default but not more than the segment permits.<Link prefetch={true}>Escalates: also resolves params, searchParams and the full URL, plus the cached content behind them. One server render per link on a runtime-data page.
<Link prefetch={false}>Opts out at the link. Wins regardless of how the destination is configured.