How to Fix: Link auto prefetch since v14.2.14
Next.js 14.2.14 changed Link prefetch behavior enough that pages can start prefetching again in production while scrolling, even in apps that appeared stable on 14.2.13. The result is unexpected network activity, unnecessary route warming, and in some cases API or server load spikes when many links enter the viewport.
Table of Contents
What Changed in 14.2.14
The reported issue describes a regression after upgrading from Next.js 14.2.13 to 14.2.14: during a production build, scrolling causes Link auto-prefetch to trigger again for links entering the viewport. This is important because Next.js only performs full prefetch behavior in production, so local development may not reveal the problem clearly.
In practical terms, any page rendering multiple <Link> components can begin fetching route data or route assets as soon as those links become visible. If your UI includes long lists, grids, search results, cards, or infinite scrolling sections, the number of background requests can rise quickly.
If you want to inspect the framework source or track related changes, review the Next.js repository.
Understanding the Root Cause
The root issue is tied to how Next.js Link prefetching works in production. The framework uses viewport detection and navigation heuristics so that when a link becomes visible, Next.js can pre-load route resources before the user clicks.
In 14.2.14, a behavior change or regression appears to have re-enabled or broadened automatic prefetching in cases where teams expected it not to happen, especially after upgrading from 14.2.13. Technically, this can happen because of several interacting factors:
- Viewport-based prefetching: when a link enters the visible area, Next.js schedules a prefetch.
- Production-only optimization paths: prefetch logic often differs between development and production, which is why the bug is easiest to reproduce in a built app.
- App Router and route segment loading: depending on your route structure, prefetching may fetch more than a single lightweight asset.
- Large lists of links: scrolling through many visible links can queue many concurrent prefetches.
So the bug is not that navigation is broken; the bug is that automatic prefetch occurs when you do not want it to. That can create side effects such as wasted bandwidth, server pressure, misleading analytics, and user-visible performance degradation on constrained devices.
Step-by-Step Solution
The safest mitigation is to disable automatic prefetch explicitly on affected links until the framework behavior is fixed or clarified.
1. Identify all links rendered in large scrollable views
Look for components such as product cards, article lists, search results, dashboards, tables, and infinite feeds.
// Example: a list that can trigger many auto-prefetch requests while scrolling
import Link from 'next/link'
export function PostList({ posts }) {
return (
<ul>
{posts.map((post) => (
<li key={post.slug}>
<Link href={`/posts/${post.slug}`}>
{post.title}
</Link>
</li>
))}
</ul>
)
}
2. Disable prefetch where background loading is harmful
Add prefetch={false} to each affected Link.
import Link from 'next/link'
export function PostList({ posts }) {
return (
<ul>
{posts.map((post) => (
<li key={post.slug}>
<Link href={`/posts/${post.slug}`} prefetch={false}>
{post.title}
</Link>
</li>
))}
</ul>
)
}
This prevents viewport-triggered route prefetching for those links and is the most direct workaround.
3. Isolate the fix in reusable UI components
If your application wraps Next.js links in shared components, centralize the mitigation there.
import Link from 'next/link'
export function SmartLink({ href, children, prefetch = false, ...props }) {
return (
<Link href={href} prefetch={prefetch} {...props}>
{children}
</Link>
)
}
This makes the behavior explicit and avoids missing scattered link instances.
4. Keep prefetch enabled only for high-value navigation targets
Not every link needs to disable prefetch. For example, primary navigation, step-based flows, or links above the fold may still benefit from it.
import Link from 'next/link'
export function HeaderNav() {
return (
<nav>
<Link href="/dashboard" prefetch={true}>Dashboard</Link>
<Link href="/settings" prefetch={true}>Settings</Link>
<Link href="/reports" prefetch={true}>Reports</Link>
</nav>
)
}
The key is to treat prefetch as an intentional optimization, not a default assumption during this regression window.
5. Validate in a real production build
Because this issue reproduces in production behavior, test with:
npm run build
npm run start
Then open browser DevTools, scroll through the affected page, and inspect the Network tab. You should see that links with prefetch={false} no longer trigger route preloads when entering the viewport.
6. If needed, pin the framework version temporarily
If your application relies heavily on previous behavior and you need a short-term stabilization path, temporarily pin back to the known working version while monitoring the upstream issue.
{
"dependencies": {
"next": "14.2.13"
}
}
Then reinstall and rebuild:
rm -rf node_modules package-lock.json .next
npm install
npm run build
npm run start
Use this only as a short-lived mitigation. The better long-term approach is to explicitly control Link prefetch policy in performance-sensitive screens.
Common Edge Cases
- Development mode confusion: you may not see identical behavior with next dev. Always verify with a production build.
- Wrapped Link components: teams often forget that a design-system link abstraction may be rendering Next.js Link internally, so the bug appears in many places at once.
- Infinite scroll pages: newly appended content can continue triggering prefetches as more links enter view.
- Server-heavy routes: if prefetched routes trigger expensive server work, unexpected background traffic can impact response times.
- Mixed App Router and Pages Router apps: behavior can differ depending on routing architecture, so test both surfaces if your app uses both.
- False performance assumptions: prefetch is not always a win. On low-memory devices or weak connections, too many background requests can hurt more than help.
FAQ
1. Why does this only show up after running a production build?
Next.js prefetch optimizations are production-focused. In development, the framework avoids or changes some optimizations to improve debugging and rebuild behavior. That is why npm run build and npm run start are required to reproduce this issue accurately.
2. Is disabling prefetch bad for performance?
Not necessarily. Automatic prefetch is useful for a small number of likely navigation targets, but harmful on dense pages with many links. Disabling it selectively often improves real-world performance by reducing waste.
3. Should I downgrade to 14.2.13 or keep 14.2.14 with a workaround?
If you need immediate stability and cannot safely audit all link-heavy screens, a temporary downgrade can reduce risk. If you can patch affected components quickly, keeping 14.2.14 and applying prefetch={false} selectively is usually the cleaner engineering choice.
The practical takeaway is simple: treat Link prefetch as explicit behavior on pages with many visible links. Until the upstream issue is fully resolved, disabling prefetch on scroll-heavy UI is the most reliable fix.