Back
Web Fundamentals

Streaming SSR: Progressive HTML Streaming

Web Fundamentals
Build & Deployment: Monorepo, CI/CD, Strategies & Release SafetyState Management: Choosing the Right SolutionRedux: Predictable State Container (RTK + RTK Query)React Query (TanStack Query): Server State CachingData Fetching Patterns: REST, GraphQL, tRPC & Real-timeGraphQL Fundamentals for Frontend: Shape, Caching, and TradeoffsgRPC-Web Fundamentals: Browser Constraints and Proxy ModelCaching Strategies: Client, Server & EdgeData Normalization: Organizing State for PerformanceAPI Design Best Practices: Pagination, Errors, Versioning & Type SafetyAPI Versioning Strategies for Frontend CompatibilityPagination: Offset vs Cursor-BasedRate Limiting & API Resilience: Retries, Backoff, Jitter, IdempotencyHow Frontend Developers Can Handle Millions of API Requests Without Crashing EverythingBrowser Storage: Cookies, SessionStorage, LocalStorage, IndexedDBReal-time Communication: WebSockets, SSE & PollingWebRTC: Real-Time Communication in the BrowserCore Web Vitals: LCP, INP & CLSPerformance Optimization Trade-offsCritical Resource Prioritization: Optimize Loading OrderCode Splitting: Optimize Bundle Size with Dynamic ImportsTree Shaking: Eliminate Dead Code from Your BundleLazy Loading: Load Resources On-DemandResource Hints: Preload, Prefetch & PreconnectText Compression: Gzip and BrotliImage & Video Optimization: Modern Formats & TechniquesAdaptive Loading: Optimize for Device & NetworkList Virtualization: Render Large Lists EfficientlyWeb Workers vs Main Thread: Offloading Heavy WorkMemory Leaks in Frontend Apps: Detection & PreventionManaging Third-Party Scripts: Optimization StrategiesHow CDNs Work: Edge Delivery, Caching & PerformanceHTTP Caching Deep Dive: Cache-Control, ETag & RevalidationService Workers & Offline Strategy: Cache First, Network First & Update LifecyclePWA Fundamentals: Manifest, Installability & Offline UXCritical Rendering PathScript Loading: async vs deferEvent Loop: Understanding JavaScript Execution ModelJavaScript Module Systems: CJS vs ESM vs UMDDynamic Module Loading: import() FunctionImport on Interaction: Load When User InteractsImport on Visibility: Lazy Loading with IntersectionObserverBrowser Rendering Pipeline & Layout ThrashingRendering Strategies: CSR vs SSR vs SSG vs ISRStreaming SSR: Progressive HTML StreamingIslands Architecture: Independent Component HydrationReact Server Components: Zero-JS Server RenderingFramework Reactivity: React, Vue, Svelte & SolidHTTP/1.1 vs HTTP/2 vs HTTP/3 (QUIC) for Frontend PerformanceDNS Resolution: Path, TTL, Caching & Frontend ImpactCross-Site Scripting (XSS) AttacksCross-Site Request Forgery (CSRF) AttacksCORS Explained: Cross-Origin Resource SharingCORS Preflight in Practice: Credentials, Simple Requests & MisconfigurationsContent Security Policy (CSP)Why is HTTPS Secure? Understanding TLS/SSLAuthorization Best PracticesCookie Security & Session Hardening: SameSite, HttpOnly, Secure
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
Previous TopicRendering Strategies: CSR vs SSR vs SSG vs ISRNext Topic Islands Architecture: Independent Component Hydration

On this page