A practical guide to web rendering strategies
Delivering code efficiently is only half the battle—how you render that code determines how quickly users see content, how fresh that content stays, and how much infrastructure you consume. Modern web development offers several rendering strategies, each with strengths tuned to particular workloads.
Core rendering approaches
Static Site Generation (SSG)
SSG prerenders pages at build time into static HTML files that can be cached at the edge and served fast. Because content is baked in before deployment, requests never wait on the server.
Good for: content that changes infrequently, site layouts, performance-critical marketing pages, documentation that rebuilds quickly.
Strengths: fastest possible page loads, strong SEO, minimal server load, and low infrastructure cost.
Trade-offs: large sites suffer longer build times; content updates require a new build and deployment. You can pair SSG with client-side data fetching for dynamic islands, but each such request initiates a new roundtrip to the server, which is slower than fetching server-side.
Incremental Static Regeneration (ISR)
ISR updates individual pages after the initial site build—no full rebuild needed to serve fresh cached data. This combines the performance of static output with the ability to scale to millions of pages.
Good for: cases where SSG builds take too long, ecommerce product pages, new websites that need frequent updates, large-scale content sites.
Strengths: retains SSG's fast loads while supporting on-demand content updates, handles many pages efficiently, can be cheaper to operate than server-side rendering in certain cases.
Trade-offs: requires disciplined cache invalidation and a clear understanding of how ISR differs from standard cache-control headers.
Best practice: trigger revalidation on specific events rather than timers—there is usually a reason content changes that has nothing to do with time. Async loading skeletons help when a user misses the cache and waits on a fresh render.
Server-Side Rendering (SSR)
SSR generates full HTML on each request, giving real-time data and per-user personalization at the cost of waiting on the server before anything displays.
Good for: pages that nearly always need current data—personalized dashboards, social feeds, real-time data visualizations, and ISR pages that revalidate on most requests anyway.
Strengths: always-fresh content; better for SEO and perceived data load time than client-side fetching.
Trade-offs: slower response than SSG or ISR, potentially weak Time to First Byte (TTFB), and higher server resource consumption.
Best practice: cache frequently-read data, stream the HTML response (the default in the Next.js App Router) to improve perceived speed, render static page sections with Suspense while the server finishes, and optimize database calls to shorten render time.
Client-Side Rendering (CSR)
CSR shifts rendering onto the user's device via JavaScript. It is not a replacement for server strategies—it layers on top of them for interactivity.
Good for: interactions needing instant feedback, real-time admin dashboards, and ongoing background work after load (like a writing app syncing content as the user types).
Strengths: highly interactive experiences, smooth state transitions, and responsive engagement with external data.
Trade-offs: the browser must download and execute the JavaScript bundle before meaningful content appears; Core Web Vitals become harder to tune; state management complexity lands on the client.
Best practice: lean on code splitting to trim the initial bundle, and favor server rendering for first paint before hydrating client-side for interactivity.
Partial Prerendering (PPR)
PPR is experimental and aims to automate strategy selection per page section. It prerenders the static parts of a page and streams in dynamic content based on React Suspense boundaries, so a single page combines static speed with dynamic capability.
Its intended benefit is instant loads like SSG paired with seamless streaming of dynamic content, without a developer manually sharding the logic. Still in research and development, it may require refactoring to adopt. Preparation means drawing tighter Suspense boundaries and cleanly separating static from dynamic content today.
Choosing what fits your page
Decision-making comes down to a handful of questions:
How often does the content change? SSG suits static pages, ISR fits periodic updates, and SSR or CSR handles real-time data. Favor SSG and ISR heavily, bringing in SSR only with genuinely current-to-the-moment data needs. For independent data fetching, CSR now belongs mostly to responsive interactions, not initial data loading.
Does the page depend on search visibility? Google can execute client-side JavaScript, but Core Web Vitals remain a ranking factor. Healthy vitals are materially easier on static or server-rendered pages than on client-side fetches to external sources.
How much user interaction matters? Predominantly static pages do fine on SSG or ISR plus minimal client JS. If interactivity dominates, combine SSR with client-side hydration.
What load time is acceptable? Fastest initial loads come from SSG or infrequently revalidated ISR. Fresh data plus speed favors ISR or SSR; the freshest data via CSR costs you initial load performance.
Does the content vary per user? Personalization points to SSR or CSR. ISR still works when personalized content can be cached realistically—say, user settings. SSG is off the table for anything user-specific.
Comparing the strategies by typical characteristics:
Feature | SSG | ISR | SSR | CSR** |
|---|---|---|---|---|
Build Time | Long | Varies | Short | Short |
Time to First Byte | Fastest | Fastest* | Slowest | Medium |
Largest Contentful Paint | Fastest | Fastest* | Medium | Slowest |
Data Freshness | Static | Periodic/On-demand | Real-time | Real-time |
Server Time / Compute | Lowest | Low | High | Lowest |
Client-side Performance | Excellent | Excellent | Good | Varies |
Interactivity | Limited*** | Limited*** | Full | Full |
* The first request following revalidation performs at SSR speeds; all later requests hit SSG speeds.
** PPR is an enhancement layered over other strategies.
*** Static output can be augmented with client-side JavaScript.
Mixing rendering strategies with Next.js
For applications that need to combine several rendering approaches, Next.js supports different methods within a single app — on a per-page, or even per-component, basis.
Notable advantages include built-in optimizations for images, fonts, scripts, code-splitting, and data fetching; scalability from small projects to large ones; reusable self-contained components that aren't limited to page-level data; and ongoing support for emerging standards — including experimental Partial Prerendering (PPR).
Rendering patterns in practice
The right choice depends on the content's nature. Three common scenarios show how to combine strategies.
Ecommerce
- SSG: homepage layout, category page templates, static portions of product pages (descriptions, specifications)
- ISR: product listings and pages with periodic updates (price, stock status), user reviews and ratings regenerated at intervals
- SSR: search results, personalized recommendations, real-time inventory checks at checkout
- CSR: shopping cart, image galleries and zooming, add-to-cart and wishlist interactions
A product page might combine all four: SSR with server response caching, ISR revalidating price and inventory as they change, dynamic SSR for personalized recommendations, and CSR for the cart and gallery. With PPR, the page layout could eventually be statically rendered.
Data-heavy web applications
- SSG: marketing pages, documentation, dashboard templates, help content and FAQs
- ISR: periodic reports (daily or weekly), account settings, billing and subscription pages
- SSR: real-time data visualizations, custom report generation, authentication flows
- CSR: interactive data exploration, real-time filtering and sorting, dashboard customization
A typical dashboard could use SSR with cached responses for the overall layout, ISR for summary widgets that update on a schedule or on user refresh, dynamic SSR for live data feeds, and CSR for exploration tools.
Full-stack AI applications
- SSG: landing pages, documentation and tutorials, pre-computed model outputs for common queries
- ISR: FAQs with AI-generated answers, galleries of generated content refreshed periodically, user-submitted content showcases
- SSR: streaming personalized AI responses, user-specific dashboards and settings
- CSR: interactive model parameter adjustments, real-time input processing (text, image uploads), progressive display of generated content
An AI image generation app might use SSG and experimental PPR for the main interface, ISR for popular generation galleries, SSR for personalized results, and CSR for the real-time generation interface.
Preparing for Partial Prerendering
PPR is still in development, but it could simplify these hybrid architectures — prerendering critical content on product pages while leaving interactive elements to the client, filling placeholders for live dashboard data, or prerendering the application shell around personalized AI output. To be ready:
- Adopt React Server Components where possible.
- Keep a clear separation between static and dynamic content.
- Use Suspense boundaries to define loading states for dynamic sections.
Building your rendering strategy
Effective applications rarely rely on a single approach. The most performant frontends combine methods to optimize each component or page, using frameworks that permit that flexibility. A few practical guidelines:
- Start with the simplest effective solution and expand as needs become clear.
- Measure real-world performance metrics and iterate based on data.
- Invest in team knowledge of modern rendering techniques.
- Structure code so it can adapt to new approaches like PPR.
Balancing user experience, developer productivity, and business agility is the underlying objective — the rendering strategy is the means to that end.



