Let's Build Suspense 🥁

Rate this content
Bookmark

As the momentum of web development swings back towards the server, streaming is becoming increasingly popular. Specifically, out-of-order streaming with features like React Suspense — one of the magical powers behind Server Components.

Let's build our very own (simplified) version to explore how it works, what problems we are trying to solve, and what this future of web development looks like.

This talk has been presented at React Advanced 2024, check out the latest edition of this React Conference.

FAQ

Suspense allows developers to create boundaries in a React application to render fallback UIs, such as loading states, while asynchronous operations are in progress.

Suspense improves server-side rendering by allowing for out-of-order streaming, which means content can be loaded and rendered as soon as it is available, enhancing performance and user experience.

React Server Components are components that are rendered on the server-side, reducing the amount of JavaScript sent to the client and minimizing hydration needs.

Hydration can be a performance bottleneck because it involves sending all JavaScript to the client and running it to make the application interactive, which can be slow.

On the client-side, Suspense can render a loading state while waiting for asynchronous data, preventing users from seeing a blank screen and enhancing perceived performance.

Streaming allows a server to start sending parts of a response to the client as soon as they are ready, rather than waiting for all content to be prepared, improving load times.

Out-of-order streaming allows different parts of a web page to load and render as soon as they are ready, rather than waiting for all parts, which improves loading efficiency and user experience.

Reducing JavaScript bundle size is crucial because large bundles can slow down page load times and increase the time required for the browser to become interactive.

Using built-in browser functionalities, like caching and streaming, can improve performance and efficiency, as it leverages existing technologies rather than reinventing solutions.

The talk aims to discuss Suspense in React, specifically highlighting its role on the server-side and how it improves user experience by handling asynchronous operations.

Julian Burr
Julian Burr
20 min
28 Oct, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Hi, my name is Julian, and I'm extremely excited to talk about suspense. Suspense allows you to render fallback UI while waiting for asynchronous tasks to resolve, making it the unsung hero of React components. In today's talk, I will explain why suspense is crucial for React server components. Before diving into server components, let's understand the history of web rendering and the problems it posed. We then introduced server-side rendering (SSR) and static-side generation (SSG) to address these issues. However, SSR had problems like large bundle sizes, slow hydration, and sluggish initial server response time. React server components solve these problems by allowing us to differentiate between static and dynamic components. But to address the third problem, we need suspense. Today, we'll build a simplified version of suspense on the server to demonstrate its conceptual working and how it improves the rendering process from classical SSR to streaming and out-of-order streaming. Let's dive into the code by building a movie app called Notflix. We have different sections like the title, cast members, and similar movies. The components fetch their own data asynchronously, making them server components. In the classical way of server-side rendering, we loop through the children, execute them as server components, and render the HTML response. To improve the user experience, we introduce streaming, which allows us to start the response on the server, keep the connection open, and add to the response document as data becomes available. By using the write method provided by Express, we can write to the response stream instead of collecting all the HTML. Dealing with promises in sequence ensures that components are rendered in the correct order. Although the server-side rendering has improved, there is still no loading state or proper handling of suspended children. To address this, we introduce suspense on the server and build a suspense component with a fallback UI and children. We keep track of suspended children using a simple object with unique identifiers. In the renderer, we check the suspended object and loop through the entries to handle each suspended child. To replace the loading state with the content once it's available, we need to execute asynchronous functions to collect and concatenate the content, delete the entry from the suspended object, and use JavaScript to handle the swapping of elements in the browser. To replace the fallback renderer with the content, we need to wrap the fallback in a diff and add an identifier using a data attribute. We can use the CSS trick of 'display: contents' to prevent the diff from affecting the layout. Next, we wrap the available content in a template tag to add it to the document without rendering. Finally, we use custom elements and a connected callback to swap the loading boundary with the content based on the identifier. This allows us to replace multiple fallback renderers. By wrapping each section in its own boundary, the user experience is significantly improved as each section can load independently. This approach also emphasizes the importance of using the platform's existing features and functionality, such as browser caching, to enhance performance. Thank you for watching and enjoy the rest of the conference!
Available in Español: Construyamos Suspense 🥁

1. Introduction to Suspense in React

Short description:

Hi, my name is Julian, and I'm extremely excited to talk about suspense. Suspense allows you to render fallback UI while waiting for asynchronous tasks to resolve, making it the unsung hero of React components. In today's talk, I will explain why suspense is crucial for React server components.

Hi, my name is Julian, and I'm extremely bummed out that I can't be in London in person for React advanced, but I hope I still got a somewhat interesting session for all of you all the way from down under. So let's dive into it.

I want to talk about suspense and a disclaimer up front. I'm a huge fan of suspense ever since they started demoing like preview versions back in 2016. For those of you who don't know, suspense basically allows you to render boundaries within your application, to render fallback UI, usually some kind of loading state, while anything underneath that boundary in your application tree is still waiting for something asynchronous to resolve. So that could be API calls to a third party API, that could be lazy loading JavaScript chunks, you name it. And that's pretty cool on the client. But I think suspense on the server is equally impressive. And I would even go as far as say, it's the unsung hero of React components, because React server components the way we know them wouldn't really be feasible without suspense. And in today's talk, I hope I can show why I think that is, and hopefully demystify a few things that are happening under the hood.

Read also

2. Introduction to Server Components and Suspense

Short description:

Before diving into server components, let's understand the history of web rendering and the problems it posed. We then introduced server-side rendering (SSR) and static-side generation (SSG) to address these issues. However, SSR had problems like large bundle sizes, slow hydration, and sluggish initial server response time. React server components solve these problems by allowing us to differentiate between static and dynamic components. But to address the third problem, we need suspense. Today, we'll build a simplified version of suspense on the server to demonstrate its conceptual working and how it improves the rendering process from classical SSR to streaming and out-of-order streaming.

Before we go into that, though, I want to quickly touch on how we got to server components in the first place, how suspense ties into all that just to get everyone on the same page. Now, if we look at the history of web rendering, and the evolution of web rendering in the last 15 to 20 years, a lot of us will probably still remember the days when we were writing plain HTML, and then move to the server and like dynamically create that HTML with languages like PHP.

And that was one major drawback, which is, if you do a lot of work on the server, for example, to fetch data from different sources, that initial server response time can get really slow. And that's obviously really bad for user experience. So when we started introducing JavaScript to our applications to make them more dynamic, we also introduced concepts like AJAX, which allowed us, after the first load of the page is already done, to still go back to the server and fetch more stuff dynamically on demand.

And that's pretty cool, because it means we can offload a lot of that heavy lifting to the client and have a quick server response time, render some kind of loading state, and then do more work. And that's so convenient that we started doing it more and more, until we eventually got close to what we now call single page applications. And that's when all the frameworks that we know and love like React, like Vue, like Angular start to become really popular. To get the best of both worlds, though, we then really quickly reintroduced the concepts of server-side rendering and static-side generation in those frameworks. So that's essentially brought three major problems still with it. One was the bundle size. So ever since single page applications, JavaScript bundle sizes kept growing and growing and became a problem. With it, the second problem is the problem of hydration. So even if you server-side render your React application, it still needs to send all of that JavaScript to the client, and it needs to run all of the JavaScript to hydrate the whole application just in case a few parts of your app use client-side logic, like state, like effects, like event listeners, that kind of stuff. And hydration is slow. So hydration actually started becoming one of the major performance bottlenecks in modern web apps. The third problem is we're back on the server now. So again, we have the problem where if the server does a lot of work, and that work is slow, that initial server response time can get really sluggish really quickly.

So introduce React server components. Server components primarily try to do one thing. It allows us developers to tell the bundler which components are static and only ever need to be rendered once, and which ones are dynamic and need to be shipped to the client and need to be hydrated. So in a realistic normal application, this can actually massively reduce the amount of JavaScript you need to send to the client and the amount of hydration that's going on. So that's amazing, but on its own, server components don't actually do anything about that third problem. So that's where suspense comes in. And to kind of showcase how suspense tackles that problem, what we're going to do today is build our own version of suspense on the server from scratch. And I want to be really clear here, this is not how suspense is implemented in React. This is very deliberately a very simplified, very dumbed down version of it. The main point here is just to showcase how it works conceptually, and also to showcase how in the different stages it improves the experience. So we start with what I would call classical server-side rendering. Then we can see how we can improve that by introducing streaming, and then how we can further improve it by doing out-of-order streaming, which is what suspense on the server allows us to do.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Simplifying Server Components
React Advanced 2023React Advanced 2023
27 min
Simplifying Server Components
Top Content
Watch video: Simplifying Server Components
React server components simplify server-side rendering and provide a mental model of components as pure functions. Using React as a library for server components allows for building a basic RSC server and connecting it to an SSR server. RSC responses are serialized virtual DOM that offload code from the client and handle interactivity. The client manifest maps serialized placeholders to real components on the client, enabling dynamic rendering. Server components combine the best of classic web development and progressive enhancement, offering the advantage of moving logic from the client to the server.
Exploring React Server Component Fundamentals
React Day Berlin 2023React Day Berlin 2023
21 min
Exploring React Server Component Fundamentals
Top Content
Watch video: Exploring React Server Component Fundamentals
This Talk introduces React Server Components (RSC) and explores their serialization process. It compares RSC to traditional server-side rendering (SSR) and explains how RSC handles promises and integrates client components. The Talk also discusses the RSC manifest and deserialization process. The speaker then introduces the Waku framework, which supports bundling, server, routing, and SSR. The future plans for Waku include integration with client state management libraries.
And Now You Understand React Server Components
React Summit 2024React Summit 2024
27 min
And Now You Understand React Server Components
Top Content
In this Talk, Kent C. Dodds introduces React Server Components (RSCs) and demonstrates how to build them from scratch. He explains the process of integrating RSCs with the UI, switching to RSC and streaming for improved performance, and the benefits of using RSCs with async components. Dodds also discusses enhancements with streaming and server context, client support and loaders, server component rendering and module resolution, handling UI updates and rendering, handling back buttons and caching, and concludes with further resources for diving deeper into the topic.
A Practical Guide for Migrating to Server Components
React Advanced 2023React Advanced 2023
28 min
A Practical Guide for Migrating to Server Components
Top Content
Watch video: A Practical Guide for Migrating to Server Components
React query version five is live and we'll be discussing the migration process to server components using Next.js and React Query. The process involves planning, preparing, and setting up server components, migrating pages, adding layouts, and moving components to the server. We'll also explore the benefits of server components such as reducing JavaScript shipping, enabling powerful caching, and leveraging the features of the app router. Additionally, we'll cover topics like handling authentication, rendering in server components, and the impact on server load and costs.
Server Components: The Epic Tale of Rendering UX
React Summit 2023React Summit 2023
26 min
Server Components: The Epic Tale of Rendering UX
Top Content
Watch video: Server Components: The Epic Tale of Rendering UX
This Talk introduces server components in React, which provide an intermediate format for rendering and offer advantages for both client-side and server-side rendering. Server components reduce bundle size on the client and improve search engine optimization. They abstract the rendering process, allowing for faster rendering and flexibility in choosing where to render components. While server components are still in the experimental stage, Next.js is a good starting point to try them out.
RSCs In Production: 1 Year Later
React Summit 2024React Summit 2024
24 min
RSCs In Production: 1 Year Later
This Talk explores the experience of shipping server components in production and highlights the benefits and challenges of using Server Components in Next.js apps. The Talk discusses the deployment of UploadThing and the use of AppRouter for safe production usage. It delves into the implementation of different layouts, data fetching, and code centralization for improved performance. The Talk also covers the use of server components for performance optimization and latency handling. Additionally, it explores the use of Edge and Lambda for partial pre-rendering and the challenges faced with webpack performance and hydration. Overall, the Talk emphasizes the benefits and challenges of working with Server Components in Next.js applications.

Workshops on related topic

Mastering React Server Components and Server Actions in React 19
React Summit US 2024React Summit US 2024
150 min
Mastering React Server Components and Server Actions in React 19
Featured Workshop
Maurice de Beijer
Maurice de Beijer
Calling all React developers! Join us for an immersive 4-hour workshop diving deep into React Server Components and Server Actions. Discover how these game-changing technologies are revolutionizing web development and learn how to harness their full potential to build lightning-fast, efficient applications.

Explore the world of React Server Components, seamlessly blending server-side rendering with client-side interactivity for unmatched performance and user experience. Dive into React Server Actions to see how they combine client-side interactivity with server-side logic, making it easier to develop interactive applications without traditional API constraints.

Get hands-on experience with practical exercises, real-world examples, and expert guidance on implementing these technologies into your projects. Learn essential topics such as the differences between Server and Client Components, optimizing data fetching, passing data effectively, and maximizing performance with new React hooks like useActionState, useFormStatus and useOptimistic.

Whether you're new to React or a seasoned pro, this workshop will equip you with the knowledge and tools to elevate your web development skills. Stay ahead of the curve and master the cutting-edge technology of React 19. Don't miss out - sign up now and unleash the full power of React!
Next.js 13: Data Fetching Strategies
React Day Berlin 2022React Day Berlin 2022
53 min
Next.js 13: Data Fetching Strategies
Top Content
WorkshopFree
Alice De Mauro
Alice De Mauro
- Introduction- Prerequisites for the workshop- Fetching strategies: fundamentals- Fetching strategies – hands-on: fetch API, cache (static VS dynamic), revalidate, suspense (parallel data fetching)- Test your build and serve it on Vercel- Future: Server components VS Client components- Workshop easter egg (unrelated to the topic, calling out accessibility)- Wrapping up
The Gateway to Backend: A Frontend Developer's Guide to Full-Stack Development
React Summit US 2023React Summit US 2023
160 min
The Gateway to Backend: A Frontend Developer's Guide to Full-Stack Development
Top Content
WorkshopFree
Amy Dutton
Amy Dutton
This workshop will guide you through the product development life cycle of creating a real-world web application. You will learn about React Server Components, building a design system within Storybook, and using frontend development to approach becoming a full-stack developer. The workshop will cover increasing confidence in your application with unit tests and implementing authentication and authorization. You'll have the opportunity to work through product features and examine a real-world RedwoodJS project, gaining valuable experience in real-world product development. RedwoodJS makes it simple to approach full-stack development, and this workshop will give you the skills you need to create your own real-world web applications.
Advanced Application Deployment Patterns with React Server Components (feat. a DIY RSC Framework)
React Summit US 2023React Summit US 2023
104 min
Advanced Application Deployment Patterns with React Server Components (feat. a DIY RSC Framework)
Top Content
WorkshopFree
 Greg Brimble
Greg Brimble
The developer ecosystem is always moving fast and this year has proved no exception. React Server Components can offer a significant improvement to developer experience and to application performance. But I think it's fair to say that this new server-first paradigm can be tricky to wrap your head around!In the first half of this workshop, we'll explore React Server Components from the ground-up: building our own mini meta-framework to help us understand how RSCs work. We'll discover exactly what is produced by an RSC build and we'll connect those pieces together to form a full application.Next, we'll deploy it! Cloudflare have also had a busy year too — Smart Placement, in particular, is a new technology that we've developed which fits the RSC model perfectly. We'll explore why that makes sense for our workshop app, and we'll actually deploy it onto the Cloudflare Developer Platform.Finally, we'll build out our app a little further, using D1 (our serverless SQL database) to really show off the React Server Component's power when combined with Smart Placement.You should come away from this workshop with a greater understanding of how React Server Components work (both behind-the-scenes and also how you as a developer can use them day-to-day), as well as insight into some of the new deployment patterns that are now possible after recent innovations in the platform space.
Building Reusable Server Components in NextJS
React Summit US 2023React Summit US 2023
88 min
Building Reusable Server Components in NextJS
Workshop
Will Bishop
Mettin Parzinski
2 authors
React continues to evolve their beta capability, React Server Components, and they're continuing to further develop them in partnership with frameworks like NextJS.In this workshop, attendees will learn what React Server Components are, how to effectively build and use them in NextJS, and focus on one of the major advantages of React/NextJS: reusability through components.We will also cover related beta technologies enabled by the `app` directory, such as nested layouts and server actions (alpha/experimental capability).Join us for this hands-on, 120 minute workshop!Technologies:
React, JavaScript/Typescript, NextJS, Miro
React Server Components Unleashed: A Deep Dive into Next-Gen Web Development
React Day Berlin 2023React Day Berlin 2023
149 min
React Server Components Unleashed: A Deep Dive into Next-Gen Web Development
Workshop
Maurice de Beijer
Maurice de Beijer
Get ready to supercharge your web development skills with React Server Components! In this immersive, 3-hour workshop, we'll unlock the full potential of this revolutionary technology and explore how it's transforming the way developers build lightning-fast, efficient web applications.
Join us as we delve into the exciting world of React Server Components, which seamlessly blend server-side rendering with client-side interactivity for unparalleled performance and user experience. You'll gain hands-on experience through practical exercises, real-world examples, and expert guidance on how to harness the power of Server Components in your own projects.
Throughout the workshop, we'll cover essential topics, including:- Understanding the differences between Server and Client Components- Implementing Server Components to optimize data fetching and reduce JavaScript bundle size- Integrating Server and Client Components for a seamless user experience- Strategies for effectively passing data between components and managing state- Tips and best practices for maximizing the performance benefits of React Server Components