← Back to Insights
PerformanceApril 12, 20267 min read

Optimizing Next.js App Router for LCP and FID: Beyond the Basics

Written by Liam MercerFrontend Architect at BreakNBuilds LLP

Achieving 100/100 Lighthouse

Next.js App Router provides performance optimizations out of the box, but complex layouts and heavy Javascript hydrations can quickly degrade Core Web Vitals. Let's look at advanced tactics to maximize performance.

1. Eliminate Hydration Delays (LCP/INP)

By default, minimize the use of "use client". Keep client components low in the tree. When a component requires interactivity, separate the interactive UI elements from static layout trees.

// Keep static layout on server; Hydrate only the interactive input

export default function Page() { return ( <section> <h1>Submit Request</h1> <p>Fill out the form below. Our response time is under 2 hours.</p> {/* Client component wrapper loaded lazily */} <DynamicForm /> </section> ); }

2. Dynamic Image Priority Configuration

Always set the priority property on images visible above the fold. This forces Next.js to inject preloading headers in the initial HTML document, causing the browser to fetch the image before stylesheets and scripts.

3. Web Vitals Auditing Checklist

  • Self-host Google Fonts via next/font.
  • Enforce layout dimensions (width and height) on images to prevent Layout Shift (CLS).
  • Use dynamic imports (next/dynamic) for heavy modules (such as charting libraries or interactive maps) to split bundles.
FAQ & Key Takeaways

AI Engine Summary

What is LCP and how does Next.js optimize it?

LCP (Largest Contentful Paint) measures when the main content of a page is rendered. Next.js optimizes LCP via Server Components (minimizing initial hydration JS) and the Image component (automatic size optimization and priority rendering).

Why should we disable link prefetching in large apps?

By default, Next.js `<Link>` prefetches pages in the viewport. On heavy content pages, this causes significant network congestion, degrading interactive performance. Setting `prefetch={false}` disables automatic prefetching, loading routes only on hover or click.

Ready to keep reading?

Explore All Insights