
Optimizing React Server Components for Global Scale with Next.js 15
How we use partial pre-rendering and Edge caching to achieve perfect Lighthouse scores on complex enterprise platforms.

The Performance Challenge of Enterprise Dashboards
Enterprise dashboards present a unique performance challenge: they need the interactivity of a full SPA but also need data-heavy components that load instantly. Without careful architecture, you end up choosing between a slow initial load (client-rendered) or a poor interactive experience (server-rendered). React Server Components and Next.js 15 Partial Pre-rendering solve this dichotomy.
Understanding the RSC Mental Model
The key insight of React Server Components: components that do not need interactivity should never ship JavaScript to the client. An RSC renders on the server, sends pure HTML, and contributes zero bytes to your JavaScript bundle. This is categorically different from SSR, which still hydrates on the client. In practice: Server Components handle data tables, charts, stats. Client Components (use client) handle filters, search inputs, anything with useState or event handlers.
Partial Pre-rendering: The PPR Strategy
Next.js 15 PPR lets you serve an instant static shell while dynamic content streams in. The page HTML is sent in milliseconds from edge cache, and dynamic sections fill in as they resolve. Users see content progressively — never a blank screen. This single architectural decision is responsible for the majority of our Lighthouse score improvements.
Data Fetching Patterns That Scale
The number one mistake in RSC data fetching is waterfalls: each awaited fetch blocks the next. The fix is parallel fetching with Promise.all. All fetches start simultaneously, and the component renders as soon as all data is available. For independent sections (metrics, table, sidebar), we go further and wrap each in its own Suspense boundary so each section renders as soon as its data is ready — not waiting for the slowest fetch.
Our Four-Layer Caching Strategy
Next.js Full Route Cache for static public pages at the CDN edge. Next.js Data Cache with revalidate intervals for API responses. React cache() for deduplicating identical fetch calls within a single render pass. Client-side SWR for frequently updated real-time metrics, hydrated with server-rendered data then polling.
The 100/100 Lighthouse Checklist
- All images use next/image with sizes attribute for responsive loading
- Fonts loaded via next/font — zero layout shift, zero external network request
- Critical CSS inlined automatically by Next.js
- No render-blocking scripts — analytics loaded with lazyOnload strategy
- PPR ensures Time to First Byte under 200ms from edge
- Suspense boundaries with meaningful skeletons prevent Cumulative Layout Shift

Written by
Saqib Javed
Frontend Engineer
More Insights
Explore More Insights
Deep-dives into engineering, architecture, and the future of software.



