Streaming SSR: Progressive HTML Streaming
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.
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.
<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.
| Property | Traditional SSR | Streaming SSR |
|---|---|---|
| Best For | Simple or uniformly fast pages | Pages with varied latency zones |
| Complexity | Lower | Higher (needs good boundaries) |
| Html Delivery | One complete response | Progressive chunks |
| Perceived Speed | Blocked by slowest part | Shell 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
- ✓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