Back
Web Fundamentals

Streaming SSR: Progressive HTML Streaming

On this page

mediumRendering & Browser Architecture

Streaming SSR: Progressive HTML Streaming

TL;DRStreaming SSR sends HTML in chunks via Suspense boundaries → shell appears early while slow parts load progressively
High Signal
Google
Meta
Netflix
Agoda
30-Second Answerstart every interview with this

Streaming SSR allows the server to send HTML progressively as different parts of the page become ready, instead of waiting for the entire render to complete. Built around React Suspense boundaries, it dramatically improves perceived performance by showing useful content (shell + early sections) before slow dependencies finish.

Traditional SSR = kitchen waits until every dish is ready before bringing anything out (slowest item blocks everything). Streaming SSR = server sends the appetizers and drinks immediately, then brings main courses as they finish cooking. The user starts enjoying the meal much sooner even if the full dinner takes the same total time.

Request Received
Shell + Critical Content Streams First
Suspense Boundaries Suspend
Slow Sections Stream as Ready
Hydration Makes Interactive

1How Streaming SSR Works

The server renders the page shell immediately and streams it. When it hits a Suspense boundary, it sends a fallback and continues rendering other parts. Once suspended data resolves, the completed chunk streams in and replaces the fallback.

page.tsxtsx
<Suspense fallback={<ProductSkeleton />}>
  <ProductList />
</Suspense>

2Suspense Boundaries & Parallelism

Suspense acts as both loading UI and streaming boundary. Independent boundaries allow parallel data fetching and progressive delivery. Good boundaries separate critical shell from secondary slow content.

3React Server Components + Streaming

In Next.js App Router, Server Components naturally support streaming. Combine with Suspense for optimal results. Edge runtime further reduces latency by running closer to users.

4Traditional SSR vs Streaming SSR

Traditional waits for everything → one big response. Streaming delivers early shell + progressive chunks. Hydration and JS cost remain similar in both cases.

PropertyTraditional SSRStreaming SSR
Best ForSimple or uniformly fast pagesPages with varied latency zones
ComplexityLowerHigher (needs good boundaries)
Html DeliveryOne complete responseProgressive chunks
Perceived SpeedBlocked by slowest partShell appears early

Traditional SSR

Best For

Simple or uniformly fast pages

Complexity

Lower

Html Delivery

One complete response

Perceived Speed

Blocked by slowest part

Streaming SSR

Best For

Pages with varied latency zones

Complexity

Higher (needs good boundaries)

Html Delivery

Progressive chunks

Perceived Speed

Shell appears early

Common questions

  • ›“What is Streaming SSR and how does it work?”
  • ›“Explain Suspense boundaries in server rendering.”
  • ›“How does Streaming SSR improve perceived performance?”
  • ›“Compare Streaming SSR with traditional SSR.”

What interviewers look for

  • Understanding that streaming improves HTML arrival time, not total work
  • Knowledge of Suspense as streaming boundary
  • Awareness of hydration cost and fallback design
  • Practical boundary strategy and trade-offs

Short answer (60 sec)

Streaming SSR sends HTML progressively using Suspense boundaries. The server streams the shell immediately, then fills in slow sections as they resolve. This gives users useful content much faster than waiting for the full traditional SSR response.

Detailed answer (senior level)

Streaming SSR leverages React 18+ streaming APIs and Suspense to break rendering into chunks. Critical shell renders first, while independent regions suspend and stream later. This is especially powerful with Server Components and Edge runtimes. The key insight is that it improves Time to First Byte and perceived LCP, but hydration and JavaScript bundle size still determine true interactivity. Good implementations use meaningful fallbacks and avoid waterfalls.

  • Putting everything inside one giant Suspense boundary
  • Using poor or missing fallbacks (layout shift)
  • Creating too many tiny boundaries (noisy UX)
  • Forgetting that streaming doesn't reduce hydration cost
  • Not handling errors gracefully in suspended components
Key Takeaways
  • ✓Streaming SSR delivers HTML progressively instead of all at once
  • ✓Suspense boundaries define natural streaming points
  • ✓Shell + critical content should render outside slow boundaries
  • ✓Greatly improves perceived performance on pages with mixed latency
  • ✓Works best with Server Components and Edge runtimes
  • ✓Hydration cost remains — streaming helps HTML arrival, not interactivity
  • ✓Always measure real user experience, not just backend render time

Related web fundamentals topics

Continue with closely related browser and frontend engineering concepts.

Rendering Strategies: CSR vs SSR vs SSG vs ISRIslands Architecture: Independent Component HydrationBrowser Rendering Pipeline & Layout ThrashingReact Server Components: Zero-JS Server RenderingImport on Visibility: Lazy Loading with IntersectionObserverFramework Reactivity: React, Vue, Svelte & Solid
Previous TopicRendering Strategies: CSR vs SSR vs SSG vs ISRNext Topic Islands Architecture: Independent Component Hydration