{"id":48940,"date":"2024-08-28T07:00:00","date_gmt":"2024-08-28T14:00:00","guid":{"rendered":"https:\/\/dhblog.dream.press\/blog\/?p=48940"},"modified":"2026-08-25T09:22:15","modified_gmt":"2026-08-25T16:22:15","slug":"react-server-components","status":"publish","type":"post","link":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/","title":{"rendered":"React Server Components: The Future of React Development"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Here\u2019s a myth worth busting: React components don\u2019t have to run in the browser. <strong>React Server Components (RSCs) are React components that render on the server and send only their rendered output to the browser, shipping none of their own JavaScript.<\/strong> They became stable in React 19 (December 2024), and Next.js supports them out of the box.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">React has been widely used to build web apps for <a href=\"https:\/\/vercel.com\/blog\/10-years-of-react\" target=\"_blank\" rel=\"noreferrer noopener\">more than a decade<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We\u2019ve all seen it evolve from class components to hooks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But React Server Components (RSCs)?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We don\u2019t think anyone expected such a big change in how React worked.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So, what exactly are React Server Components? How do they work? And what do they do that React couldn\u2019t already do?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To answer all these questions, we\u2019ll quickly go over the fundamentals. If you\u2019re in need of a refresher, have a quick look at this <a href=\"https:\/\/www.dreamhost.com\/blog\/learn-react\/\" target=\"_blank\" rel=\"noreferrer noopener\">guide on how to learn React as a beginner<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this post, we\u2019ll walk you through why we needed React Server Components, how they work, and some of the major benefits of RSCs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s get started!<\/p>\n\n\n\n<h2 id=\"h-what-are-react-server-components\" class=\"wp-block-heading\">What are React Server Components?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>React Server Components are React components that render ahead of time on the server (either once at build time or on each request) instead of in the browser. Only their rendered output travels to the client, so they add zero JavaScript to your bundle and can read databases, files, and other backend resources directly.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"2400\" height=\"1800\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree.webp\" alt=\"Tree diagram of React Server Components shows the hierarchy\" class=\"wp-image-48948 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree.webp 2400w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-300x225.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-1024x768.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-768x576.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-1536x1152.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-2048x1536.webp 2048w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-600x450.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-1200x900.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-730x548.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-1460x1095.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-784x588.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-1568x1176.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-877x658.webp 877w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/01_react_server_components_tree-1754x1316.webp 1754w\" data-sizes=\"(max-width: 2400px) 100vw, 2400px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2400px; --smush-placeholder-aspect-ratio: 2400\/1800;\" \/><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cServer Components are a new type of Component that renders ahead of time, before bundling, in an environment separate from your client app or SSR server.\u201d \u2014 <a href=\"https:\/\/react.dev\/reference\/rsc\/server-components\" target=\"_blank\" rel=\"noreferrer noopener\">the official React documentation<\/a><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Since RSCs execute directly on the server, they can efficiently access backend resources like databases and <a href=\"https:\/\/help.dreamhost.com\/hc\/en-us\/articles\/217560167-Application-programming-interface-overview\" target=\"_blank\" rel=\"noreferrer noopener\">APIs<\/a> without an additional data fetching layer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And \u201cserver\u201d doesn\u2019t always mean a machine answering live traffic. Server components can also run once at build time (reading files or pulling content from a CMS), so even a site with no web server at all can use them to keep heavy rendering libraries out of the client bundle (<a href=\"https:\/\/react.dev\/reference\/rsc\/server-components\" target=\"_blank\" rel=\"noreferrer noopener\">per the React docs<\/a>).<\/p>\n\n\n\n<div class=\"glossary-term\">\n\t<div class=\"glossary-term__above-title\">\n\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 640 512\"><path d=\"M320 32c-8.1 0-16.1 1.4-23.7 4.1L15.8 137.4C6.3 140.9 0 149.9 0 160s6.3 19.1 15.8 22.6l57.9 20.9C57.3 229.3 48 259.8 48 291.9v28.1c0 28.4-10.8 57.7-22.3 80.8c-6.5 13-13.9 25.8-22.5 37.6C0 442.7-.9 448.3 .9 453.4s6 8.9 11.2 10.2l64 16c4.2 1.1 8.7 .3 12.4-2s6.3-6.1 7.1-10.4c8.6-42.8 4.3-81.2-2.1-108.7C90.3 344.3 86 329.8 80 316.5V291.9c0-30.2 10.2-58.7 27.9-81.5c12.9-15.5 29.6-28 49.2-35.7l157-61.7c8.2-3.2 17.5 .8 20.7 9s-.8 17.5-9 20.7l-157 61.7c-12.4 4.9-23.3 12.4-32.2 21.6l159.6 57.6c7.6 2.7 15.6 4.1 23.7 4.1s16.1-1.4 23.7-4.1L624.2 182.6c9.5-3.4 15.8-12.5 15.8-22.6s-6.3-19.1-15.8-22.6L343.7 36.1C336.1 33.4 328.1 32 320 32zM128 408c0 35.3 86 72 192 72s192-36.7 192-72L496.7 262.6 354.5 314c-11.1 4-22.8 6-34.5 6s-23.5-2-34.5-6L143.3 262.6 128 408z\"\/><\/svg>\n\t\t<span>DreamHost Glossary<\/span>\n\t<\/div>\n    <h3>API<\/h3>\n    <p>An Application Programming Interface (API) is a set of functions enabling applications to access data and interact with external components, serving as a courier between client and server.<\/p>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>But why did we need RSCs anyway?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To answer this question, let\u2019s rewind a bit.<\/p>\n\n<h2 id=\"h2_traditional-react-client-side-rendering-csr\" class=\"wp-block-heading\">Traditional React: client-side rendering (CSR)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">React has always been a client-side UI library.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The core idea behind React is to divide your entire design into smaller, independent units we call components. These components can manage their own private data (<strong>state<\/strong>) and pass data to each other (<strong>props<\/strong>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Think of these components as <a href=\"https:\/\/www.dreamhost.com\/blog\/learn-javascript\/\" target=\"_blank\" rel=\"noreferrer noopener\">JavaScript functions<\/a> that download and run right in the user\u2019s browser. When someone visits your app, their browser downloads all the component code, and React steps in to render everything:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"2400\" height=\"1800\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_.webp\" alt=\"Flowchart: Client-side rendering workflow, from user request to page load\" class=\"wp-image-48950 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_.webp 2400w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-300x225.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-1024x768.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-768x576.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-1536x1152.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-2048x1536.webp 2048w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-600x450.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-1200x900.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-730x548.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-1460x1095.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-784x588.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-1568x1176.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-877x658.webp 877w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/02_how_client_side_rendering_works_-1754x1316.webp 1754w\" data-sizes=\"(max-width: 2400px) 100vw, 2400px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2400px; --smush-placeholder-aspect-ratio: 2400\/1800;\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The browser downloads the HTML, JavaScript, <a href=\"https:\/\/www.dreamhost.com\/blog\/css-transform\/\" target=\"_blank\" rel=\"noreferrer noopener\">CSS<\/a>, and other assets.<\/li>\n\n\n\n<li>React analyzes the <a href=\"https:\/\/www.dreamhost.com\/blog\/learn-html\/\" target=\"_blank\" rel=\"noreferrer noopener\">HTML<\/a>, sets up event listeners for user interactions, and retrieves any required data.<\/li>\n\n\n\n<li>The website transforms into a fully functional React application right before your eyes, and everything is done by your browser and computer.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>While this process works, it does have some downsides:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Slow load times:<\/strong> Loading times can be slow, particularly for complex applications with lots of components since now the user has to wait for everything to be downloaded first.<\/li>\n\n\n\n<li><strong>Bad for <\/strong><a href=\"https:\/\/www.dreamhost.com\/blog\/improve-seo\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>search engine optimization (SEO)<\/strong><\/a>: The initial HTML is often barebones \u2014 just enough to download the JavaScript which then renders the rest of the code. This makes it hard for search engines to understand what the page is about.<\/li>\n\n\n\n<li><strong>Gets slower as apps grow larger: <\/strong>The client-side processing of JavaScript can strain resources, leading to a rougher user experience, especially as you add more functionality.<\/li>\n<\/ul>\n\n\n\n<div class=\"article-newsletter article-newsletter--gradient\">\n\n\n<h2>Get Content Delivered Straight to Your Inbox<\/h2><p>Subscribe now to receive all the latest updates, delivered directly to your inbox.<\/p><form class=\"nwsl-form\" id=\"newsletter_block_\" novalidate><div class=\"messages\"><\/div><div class=\"form-group\"><label for=\"input_newsletter_block_\"><input type=\"email\"name=\"email\"id=\"input_newsletter_block_\"placeholder=\"Enter your email address\"novalidatedisabled=\"disabled\"\/><\/label><button type=\"submit\"class=\"btn btn--brand\"disabled=\"disabled\"><span>Sign Me Up!<\/span><svg width=\"21\" height=\"14\" viewBox=\"0 0 21 14\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n<path d=\"M13.8523 0.42524L12.9323 1.34521C12.7095 1.56801 12.7132 1.9304 12.9404 2.14865L16.7241 5.7823H0.5625C0.251859 5.7823 0 6.03416 0 6.3448V7.6573C0 7.96794 0.251859 8.2198 0.5625 8.2198H16.7241L12.9405 11.8535C12.7132 12.0717 12.7095 12.4341 12.9323 12.6569L13.8523 13.5769C14.072 13.7965 14.4281 13.7965 14.6478 13.5769L20.8259 7.39879C21.0456 7.17913 21.0456 6.82298 20.8259 6.60327L14.6477 0.42524C14.4281 0.205584 14.0719 0.205584 13.8523 0.42524Z\" fill=\"white\"\/>\n<\/svg>\n<\/button><\/div><\/form><\/div>\n\n\n<h2 id=\"h2_the-next-iteration-server-side-rendering-ssr\" class=\"wp-block-heading\">The next iteration: server-side rendering (SSR)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To address the issues caused by client-side rendering, the React community adopted Server-Side Rendering (SSR).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With SSR, the server handles rendering the code to HTML before sending it over.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This complete, rendered HTML is then transferred to your browser\/mobile, ready to be viewed, so the app doesn\u2019t need to be <em>compiled<\/em> during runtime like it would without SSR.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Here\u2019s how SSR works:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"2400\" height=\"1800\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_.webp\" alt=\"Diagram showing how server-side rendering works, with browser requesting HTML from server\" class=\"wp-image-48953 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_.webp 2400w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-300x225.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-1024x768.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-768x576.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-1536x1152.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-2048x1536.webp 2048w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-600x450.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-1200x900.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-730x548.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-1460x1095.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-784x588.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-1568x1176.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-877x658.webp 877w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/03_how_server_side_rendering_works_-1754x1316.webp 1754w\" data-sizes=\"(max-width: 2400px) 100vw, 2400px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2400px; --smush-placeholder-aspect-ratio: 2400\/1800;\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The server renders the initial HTML for each request.<\/li>\n\n\n\n<li>The client receives a fully formed HTML structure, allowing for faster initial page loads.<\/li>\n\n\n\n<li>The client then downloads React and your application code, a process called \u201chydration,\u201d which makes the page interactive.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The HTML structure rendered on the server has no functionality yet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After the JavaScript downloads, React \u201cattaches\u201d your components\u2019 logic to the HTML the server generated. In the React team\u2019s <a href=\"https:\/\/react.dev\/reference\/react-dom\/client\/hydrateRoot\" target=\"_blank\" rel=\"noreferrer noopener\">own words<\/a>, hydration \u201cturns the initial HTML snapshot from the server into a fully interactive app that runs in the browser.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why does SSR work so well?<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Faster initial load times<\/strong>: Users see the content almost instantly because the browser receives fully formed HTML, eliminating the time required for the JavaScript to load and execute.<\/li>\n\n\n\n<li><strong>Improved SEO<\/strong>: Search engines easily crawl and index server-rendered HTML. This direct access translates to better search engine optimization for your application.<\/li>\n\n\n\n<li><strong>Enhanced performance on slower devices:<\/strong> SSR lightens the load on a user\u2019s device. The server shoulders the work, making your application more accessible and performant, even on slower connections.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">SSR, however, caused a number of additional problems, calling for an even better solution:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Slow Time to Interactive (TTI): <\/strong>Server-side rendering and hydration delay the user\u2019s ability to see and interact with the app until the entire process is complete.<\/li>\n\n\n\n<li><strong>Server load: <\/strong>The server needs to do more work, further slowing down response times for <a href=\"https:\/\/www.dreamhost.com\/blog\/how-to-hire-web-developer\/\" target=\"_blank\" rel=\"noreferrer noopener\">complex applications<\/a>, especially when there are many users simultaneously.<\/li>\n\n\n\n<li><strong>Setup complexity: <\/strong>Setting up and maintaining SSR can be more complex, especially for large applications.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h2_finally-the-react-server-components\" class=\"wp-block-heading\">How do React Server Components work?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">React Server Components are now a stable, production-ready part of React. They shipped with <a href=\"https:\/\/react.dev\/blog\/2024\/12\/05\/react-19\" target=\"_blank\" rel=\"noreferrer noopener\">React 19<\/a> on December 5, 2024, and Next.js builds on them by default in its App Router, which is the main way developers use RSCs in production today. But they started life back in December 2020, when the React team introduced \u201c<a href=\"https:\/\/react.dev\/blog\/2020\/12\/21\/data-fetching-with-react-server-components\" target=\"_blank\" rel=\"noreferrer noopener\">Zero-Bundle-Size React Server Components<\/a>\u201d as a research project.<\/p>\n\n\n\n<style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }<\/style><div class='embed-container'><iframe data-src='https:\/\/www.youtube.com\/embed\/TQQPAU21ZUw' frameborder='0' allowfullscreen src='data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==' class='lazyload' data-load-mode='0'><\/iframe><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">This changed not only how we thought about building React apps but also how React apps work behind the scenes. RSCs solved many problems we had with CSR and SSR.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One thing RSCs <em>don\u2019t<\/em> do is replace server-side rendering. Server components render to a serialized description of the UI rather than finished HTML. That output can still be server-side rendered to HTML for a fast first paint, and it can be re-fetched from the server later without wiping out client-side state (<a href=\"https:\/\/react.dev\/reference\/rsc\/server-components\" target=\"_blank\" rel=\"noreferrer noopener\">per the React docs<\/a>). Think of them as teammates: SSR handles the initial HTML, while RSCs decide which components ship JavaScript at all.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201c[Server Components] are rendered before your application is bundled, and can pass data and JSX as props to Client Components.\u201d \u2014 <a href=\"https:\/\/react.dev\/reference\/rsc\/server-components\" target=\"_blank\" rel=\"noreferrer noopener\">the React documentation<\/a><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Let\u2019s now look at the benefits that RSCs bring to the table:<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Zero bundle size<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">RSCs are rendered entirely on the server, eliminating the need to send JavaScript code to the client. This results in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dramatically smaller JavaScript bundle sizes.<\/li>\n\n\n\n<li>Faster page loads, particularly on slower networks.<\/li>\n\n\n\n<li>Improved performance on less powerful devices.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Unlike SSR, where the entire React component tree is sent to the client for hydration, RSCs keep server-only code on the server. This leads to those significantly smaller client-side bundles we talked about, making your applications lighter and more responsive.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Direct backend access<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">RSCs can interact directly with databases and file systems without requiring an API layer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As you can see in the code below, the <strong>courses<\/strong> variable is fetched directly from the database, and the UI prints a list of the <strong>course.id<\/strong> and <strong>course.name<\/strong> from the <strong>courses.map<\/strong>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>async function CourseList() {<br>&nbsp; const db = await connectToDatabase();<br>&nbsp; const courses = await db.query('SELECT * FROM courses');<br><br>&nbsp; return (<br>&nbsp; &nbsp; &lt;ul&gt;<br>&nbsp; &nbsp; &nbsp; {courses.map(course =&gt; (<br>&nbsp; &nbsp; &nbsp; &nbsp; &lt;li key={course.id}&gt;{course.name}&lt;\/li&gt;<br>&nbsp; &nbsp; &nbsp; ))}<br>&nbsp; &nbsp; &lt;\/ul&gt;<br>&nbsp; );<br>}<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is simpler in contrast to traditional SSR, where you\u2019d need to set up separate API routes for fetching individual pieces of data. It\u2019s also safer by default: because this component\u2019s code never leaves the server, your database credentials and queries never reach the browser.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Automatic code splitting<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">With RSCs, you also get more granular code splitting and better code organization.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">React keeps server-only code on the server and ensures that it never gets sent over to the client. The client components are automatically identified and sent to the client for hydration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And the overall bundle becomes extremely optimized since the client now receives exactly what\u2019s needed for a fully functional app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On the other hand, SSR needs careful manual code splitting to optimize performance for each additional page.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-4-reduced-waterfall-effect-and-streaming-rendering\">4. Reduced waterfall effect and streaming rendering<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">React Server Components combine streaming rendering and parallel data fetching. This powerful combination significantly reduces the \u201cwaterfall effect\u201d often seen in traditional server-side rendering.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Waterfall effect<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The \u201cwaterfall effect\u201d slows down web development. Basically, it forces the operations to follow one another as if a waterfall were flowing over a series of rocks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each step must wait for the previous one to finish. This \u201cwait\u201d is especially noticeable in data fetching. One API call must be completed before the next one begins, causing page load times to slow.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"547\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-1024x547.webp\" alt=\"Table from Chrome Network Tab displays the waterfall effect of network requests\" class=\"wp-image-48955 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-1024x547.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-300x160.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-768x410.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-1536x820.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-2048x1093.webp 2048w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-600x320.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-1200x641.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-730x390.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-1460x779.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-784x418.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-1568x837.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-877x468.webp 877w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/04_waterfall_effect-1754x936.webp 1754w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/547;\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Streaming rendering<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Streaming rendering offers a solution. Instead of waiting for the entire page to render on the server, the server can send pieces of the UI to the client as soon as they\u2019re ready.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"2400\" height=\"1691\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering.webp\" alt=\"Diagram shows streaming server rendering: network requests and JavaScript execution timeline\" class=\"wp-image-48957 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering.webp 2400w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-300x211.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-1024x721.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-768x541.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-1536x1082.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-2048x1443.webp 2048w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-600x423.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-1200x846.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-730x514.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-1460x1029.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-784x552.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-1568x1105.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-877x618.webp 877w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/05_streaming_server_rendering-1754x1236.webp 1754w\" data-sizes=\"(max-width: 2400px) 100vw, 2400px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2400px; --smush-placeholder-aspect-ratio: 2400\/1691;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">React Server Components make rendering and fetching data much smoother. They create multiple server components that work in parallel, avoiding this waterfall effect.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The server starts sending HTML to the client the moment any piece of the UI is ready.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>So, compared to server-side rendering, RSCs:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Allow each component to fetch its data independently and in parallel.<\/li>\n\n\n\n<li>The server can stream a component as soon as its data is ready, without waiting for other components to catch up.<\/li>\n\n\n\n<li>Users see the content loading one after the other, enhancing their perception of performance.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">CSR vs. SSR vs. RSC at a glance<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th><\/th><th>CSR<\/th><th>SSR<\/th><th>RSC<\/th><\/tr><\/thead><tbody><tr><td>Where rendering happens<\/td><td>In the browser<\/td><td>On the server, then hydrated in the browser<\/td><td>On the server (build time or per request)<\/td><\/tr><tr><td>JavaScript sent to the client<\/td><td>The whole app<\/td><td>The whole app (for hydration)<\/td><td>Only client components<\/td><\/tr><tr><td>SEO<\/td><td>Weak \u2014 barebones initial HTML<\/td><td>Strong<\/td><td>Strong<\/td><\/tr><tr><td>Time to interactive<\/td><td>Slow on big apps<\/td><td>Delayed by hydration<\/td><td>Faster \u2014 less JavaScript to hydrate<\/td><\/tr><tr><td>Data fetching<\/td><td>From the browser, after load<\/td><td>On the server, often via API routes<\/td><td>Directly in the component, in parallel<\/td><\/tr><tr><td>Hydration<\/td><td>Not needed (full client render)<\/td><td>Entire component tree<\/td><td>Client components only<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">5. Smooth interaction with client components<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now, using RSCs doesn\u2019t necessarily imply that you have to skip using client-side components.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both components can co-exist and help you create a great overall app experience.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Think of an e-commerce application. With SSR, the entire app needs to be rendered server side.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In RSCs, however, you can select which components to render on the server and which ones to render on the client side.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For instance, you could use server components to fetch product data and render the initial product listing page.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then, client components can handle user interactions like adding items to a shopping cart or managing product reviews.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">How do you mark a client component?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">With the <code>\"use client\"<\/code> directive. In an RSC setup, every component is a server component by default. To make a component interactive, add <code>\"use client\"<\/code> at the top of its file, and React ships that component\u2019s JavaScript to the browser:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\"use client\";<br><br>import { useState } from \"react\";<br><br>export default function AddToCart({ productId }) {<br>&nbsp; const [added, setAdded] = useState(false);<br><br>&nbsp; return (<br>&nbsp; &nbsp; &lt;button onClick={() =&gt; setAdded(true)}&gt;<br>&nbsp; &nbsp; &nbsp; {added ? \"Added!\" : \"Add to cart\"}<br>&nbsp; &nbsp; &lt;\/button&gt;<br>&nbsp; );<br>}<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And you can drop it straight into a server component. The <code>CourseList<\/code> example from earlier could render <code>&lt;AddToCart productId={course.id} \/&gt;<\/code> next to each course name: the list renders on the server, and only the button ships JavaScript.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The directive marks the boundary between the two worlds. Everything a <code>\"use client\"<\/code> file imports becomes part of the client bundle, while server components can pass data (and even rendered JSX) to client components as props, as long as those props are serializable (<a href=\"https:\/\/react.dev\/reference\/rsc\/server-components\" target=\"_blank\" rel=\"noreferrer noopener\">per the React docs<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One common misconception: there\u2019s no directive for marking server components. <code>\"use server\"<\/code> doesn\u2019t do that; instead, it marks server functions that client components can call. Server components need no directive at all; they\u2019re the default.<\/p>\n\n<h2 id=\"h2_should-you-add-rsc-implementation-on-your-roadmap\" class=\"wp-block-heading\">Should you add RSC implementation to your roadmap?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Our verdict? RSCs add a <em>lot<\/em> of value to React development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They solve some of the most pressing problems with the SSR and CSR approaches: performance, data fetching, and developer experience. <a href=\"https:\/\/www.dreamhost.com\/blog\/best-online-resources-learn-to-code\/\" target=\"_blank\" rel=\"noreferrer noopener\">For developers just starting out with coding<\/a>, this has made life easier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And this is no longer a bet on an experiment. React Server Components are stable in React 19 (the <a href=\"https:\/\/react.dev\/reference\/rsc\/server-components\" target=\"_blank\" rel=\"noreferrer noopener\">React team says<\/a> they \u201cwill not break between minor versions\u201d), and Next.js ships them out of the box. Other frameworks and bundlers are still building their integrations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So, should you add RSC implementation to your roadmap? Our answer is still the dreaded <em>it depends<\/em>. But the maturity question is settled; what it depends on now is your framework and your app.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Where can you use RSCs today?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Only inside a framework that implements them. RSCs need bundler-level integration to work out which components run where and to serialize the server output, so you can\u2019t drop them into a plain client-side React setup. In practice, that means Next.js\u2019s App Router today, with other frameworks and bundlers adding support (the implementer-facing APIs are still evolving, <a href=\"https:\/\/react.dev\/reference\/rsc\/server-components\" target=\"_blank\" rel=\"noreferrer noopener\">per react.dev<\/a>). If your app is a classic single-page React app, adopting RSCs means adopting one of these frameworks. It\u2019s a migration rather than a switch you flip.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The trade-offs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">RSCs aren\u2019t free, and we\u2019d be hyping if we pretended otherwise:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>No interactivity in server components:<\/strong> They can\u2019t use state, effects, or browser APIs. Anything with a click handler has to be a client component.<\/li>\n\n\n\n<li><strong>More to think about:<\/strong> You now decide where every component runs and what crosses the server\/client boundary. That\u2019s real mental-model overhead, especially for a team used to plain client-side React.<\/li>\n\n\n\n<li><strong>Framework lock-in:<\/strong> Because RSCs only work through a framework\u2019s implementation, you\u2019re committing to that framework\u2019s conventions and upgrade path.<\/li>\n\n\n\n<li><strong>Sometimes they\u2019re overkill:<\/strong> A highly interactive app behind a login (think dashboards) gains little, since almost everything needs to be a client component anyway.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Your app may be working perfectly fine without RSCs. In that case, adding another layer of abstraction may not do much. However, if you\u2019re already on (or moving to) a framework that supports them, and bundle size or data fetching is a pain point, try making small changes and scaling from there.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What does an RSC app need from its hosting?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">It depends on when your components render, and <a href=\"https:\/\/react.dev\/reference\/rsc\/server-components\" target=\"_blank\" rel=\"noreferrer noopener\">the React docs<\/a> support both modes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Build-time rendering:<\/strong> If your server components run only at build time, the output is static files. Any host or CDN can serve it, and no live server is required.<\/li>\n\n\n\n<li><strong>Per-request rendering:<\/strong> If components render on each request, you need an always-on server running a JavaScript runtime like Node.js. A static file host won\u2019t cut it.<\/li>\n\n\n\n<li><strong>Server resources:<\/strong> Moving rendering to the server means the server does the work your visitors\u2019 browsers used to do. Budget CPU and RAM for your traffic, and leave room to scale.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">And if you need a powerful server to test RSCs, spin up a <a href=\"https:\/\/www.dreamhost.com\/hosting\/vps\/\" target=\"_blank\" rel=\"noreferrer noopener\">DreamHost VPS<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DreamHost VPS hosting gives you full root access and unmetered bandwidth, so you can install Node.js and run whichever RSC framework you choose. Rather skip server maintenance altogether? <a href=\"https:\/\/www.dreamhost.com\/hosting\/managed-vps\/\" target=\"_blank\" rel=\"noreferrer noopener\">DreamHost Managed VPS<\/a> handles the upkeep for you.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">FAQs about React Server Components<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Are React Server Components the same as server-side rendering?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">No. SSR renders your components to HTML for the first paint but still ships all their JavaScript for hydration. Server components never send their JavaScript at all, and their output can itself be server-side rendered. Most RSC frameworks use both together.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Are React Server Components stable?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. RSCs shipped as stable in React 19 (December 2024), and the React team says they will not break between minor versions. Only the lower-level APIs for bundler and framework authors are still evolving.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Do I need Next.js to use React Server Components?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">You need a framework or bundler with RSC support, and Next.js\u2019s App Router is the most established option today. A plain client-side React setup can\u2019t use them.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">How do I deploy a React app that uses server components?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">If everything renders at build time, upload the static output to any host or CDN. If components render per request, deploy to a server with a Node.js-compatible runtime (a VPS works well) and keep it running continuously.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Can server components replace my REST or GraphQL API?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Often, for your own app: server components read your data layer directly, no API routes needed, per the React docs. You\u2019ll still want an API if other clients, like a mobile app or third-party integrations, need the same data.<\/p>\n\n\n\n\n<div class=\"article-cta-shared article-cta-small article-cta--product\">\n\t<div class=\"tr-img-wrap-outer jsLoading\"><img decoding=\"async\" class=\"js-img-lazy \" src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/themes\/blog2018\/assets\/img\/lazy-loading-transparent.webp\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/03\/product-cta-vps-hosting-877x586.webp 1x, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/03\/product-cta-vps-hosting.webp 2x\"  alt=\"VPS Hosting\" \/><\/div>\n\n\t<a href='https:\/\/www.dreamhost.com\/hosting\/managed-vps\/' class='link-top' target='_blank' rel='noopener noreferrer'>\n\t\t<span>Managed VPS<\/span>\n\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 384 512\" width=\"15\"><path d=\"M342.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L274.7 256 105.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z\"\/><\/svg>\n\t<\/a>\n\n\t<div class=\"content-btm\">\n\t\t<h2 class=\"h2--md\">\n\t\t\tWhen You Expect Performance Get DreamHost VPS\n\t\t<\/h2>\n\t\t<p class=\"p--md\">\n\t\t\tBig or small, website or application &#8211; we have a VPS configuration for you.\n\t\t<\/p>\n\n\t\t        <a\n            href=\"https:\/\/www.dreamhost.com\/hosting\/managed-vps\/\"\n                        class=\"btn btn--white-outline btn--sm btn--round\"\n                                    target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            >\n                            See More                    <\/a>\n\n\t<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Want to get your head around the basics of React Server Components? Our guide will get you up to speed on when to add them to your roadmap (or not).<\/p>\n","protected":false},"author":1058,"featured_media":48941,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_yoast_wpseo_opengraph-title":"What Are React Server Components? RSCs Explained - DreamHost","_yoast_wpseo_opengraph-description":"What are React Server Components? Learn how RSCs render on the server, ship zero JS to the browser, and work with Next.js.","_yoast_wpseo_twitter-title":"What Are React Server Components? RSCs Explained - DreamHost","_yoast_wpseo_twitter-description":"What are React Server Components? Learn how RSCs render on the server, ship zero JS to the browser, and work with Next.js.","toc_headlines":"[[\"h-what-are-react-server-components\",\"What are React Server Components?\"],[\"h2_traditional-react-client-side-rendering-csr\",\"Traditional React: client-side rendering (CSR)\"],[\"h2_the-next-iteration-server-side-rendering-ssr\",\"The next iteration: server-side rendering (SSR)\"],[\"h2_finally-the-react-server-components\",\"How do React Server Components work?\"],[\"h2_should-you-add-rsc-implementation-on-your-roadmap\",\"Should you add RSC implementation to your roadmap?\"]]","hide_toc":false,"show_updated_at":"1","footnotes":""},"categories":[10025],"tags":[],"class_list":["post-48940","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech-talk"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>What Are React Server Components? RSCs Explained - DreamHost<\/title>\n<meta name=\"description\" content=\"What are React Server Components? Learn how RSCs render on the server, ship zero JS to the browser, and work with Next.js.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dreamhost.com\/blog\/react-server-components\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What Are React Server Components? RSCs Explained - DreamHost\" \/>\n<meta property=\"og:description\" content=\"What are React Server Components? Learn how RSCs render on the server, ship zero JS to the browser, and work with Next.js.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dreamhost.com\/blog\/react-server-components\/\" \/>\n<meta property=\"og:site_name\" content=\"DreamHost Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DreamHost\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-28T14:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-25T16:22:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/1220x628_ogimage_react_server_components.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"942\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Ian Hernandez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"What Are React Server Components? RSCs Explained - DreamHost\" \/>\n<meta name=\"twitter:description\" content=\"What are React Server Components? Learn how RSCs render on the server, ship zero JS to the browser, and work with Next.js.\" \/>\n<meta name=\"twitter:creator\" content=\"@dreamhost\" \/>\n<meta name=\"twitter:site\" content=\"@dreamhost\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ian Hernandez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"What Are React Server Components? RSCs Explained - DreamHost","description":"What are React Server Components? Learn how RSCs render on the server, ship zero JS to the browser, and work with Next.js.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/","og_locale":"en_US","og_type":"article","og_title":"What Are React Server Components? RSCs Explained - DreamHost","og_description":"What are React Server Components? Learn how RSCs render on the server, ship zero JS to the browser, and work with Next.js.","og_url":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/","og_site_name":"DreamHost Blog","article_publisher":"https:\/\/www.facebook.com\/DreamHost\/","article_published_time":"2024-08-28T14:00:00+00:00","article_modified_time":"2026-08-25T16:22:15+00:00","og_image":[{"width":1800,"height":942,"url":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/1220x628_ogimage_react_server_components.webp","type":"image\/webp"}],"author":"Ian Hernandez","twitter_card":"summary_large_image","twitter_title":"What Are React Server Components? RSCs Explained - DreamHost","twitter_description":"What are React Server Components? Learn how RSCs render on the server, ship zero JS to the browser, and work with Next.js.","twitter_creator":"@dreamhost","twitter_site":"@dreamhost","twitter_misc":{"Written by":"Ian Hernandez","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/#article","isPartOf":{"@id":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/"},"author":{"name":"Ian Hernandez","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/person\/6b2312bf0bff4ec04f50c319af67d0f7"},"headline":"React Server Components: The Future of React Development","datePublished":"2024-08-28T14:00:00+00:00","dateModified":"2026-08-25T16:22:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/"},"wordCount":2797,"publisher":{"@id":"https:\/\/www.dreamhost.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/1460x1095_blog_hero_react_server_components.webp","articleSection":["Tech Talk"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/","url":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/","name":"What Are React Server Components? RSCs Explained - DreamHost","isPartOf":{"@id":"https:\/\/www.dreamhost.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/#primaryimage"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/1460x1095_blog_hero_react_server_components.webp","datePublished":"2024-08-28T14:00:00+00:00","dateModified":"2026-08-25T16:22:15+00:00","description":"What are React Server Components? Learn how RSCs render on the server, ship zero JS to the browser, and work with Next.js.","breadcrumb":{"@id":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dreamhost.com\/blog\/react-server-components\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/#primaryimage","url":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/1460x1095_blog_hero_react_server_components.webp","contentUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2024\/08\/1460x1095_blog_hero_react_server_components.webp","width":2190,"height":1643,"caption":"React Server Components: The Future of React Development"},{"@type":"BreadcrumbList","@id":"https:\/\/www.dreamhost.com\/blog\/react-server-components\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.dreamhost.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React Server Components: The Future of React Development"}]},{"@type":"WebSite","@id":"https:\/\/www.dreamhost.com\/blog\/#website","url":"https:\/\/www.dreamhost.com\/blog\/","name":"DreamHost Blog","description":"","publisher":{"@id":"https:\/\/www.dreamhost.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dreamhost.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.dreamhost.com\/blog\/#organization","name":"DreamHost","url":"https:\/\/www.dreamhost.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/dhblog.dream.press\/blog\/wp-content\/uploads\/2019\/01\/dh_logo-blue-2.png","contentUrl":"https:\/\/dhblog.dream.press\/blog\/wp-content\/uploads\/2019\/01\/dh_logo-blue-2.png","width":1200,"height":168,"caption":"DreamHost"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DreamHost\/","https:\/\/x.com\/dreamhost","https:\/\/www.instagram.com\/dreamhost\/","https:\/\/www.linkedin.com\/company\/dreamhost\/","https:\/\/www.youtube.com\/user\/dreamhostusa"]},{"@type":"Person","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/person\/6b2312bf0bff4ec04f50c319af67d0f7","name":"Ian Hernandez","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2022\/04\/ian-hernandez-dreamhost-150x150.png","url":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2022\/04\/ian-hernandez-dreamhost-150x150.png","contentUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2022\/04\/ian-hernandez-dreamhost-150x150.png","caption":"Ian Hernandez"},"description":"Ian is a Product Designer based in Los Angeles, California. He is responsible for driving brand and product design at DreamHost, developing and maintaining our internal design system, and writing frontend code when he can. In his free time, he enjoys walking his dog, learning history, and discovering new music online and irl. Connect with him on LinkedIn: https:\/\/www.linkedin.com\/in\/ianhernandez23\/","url":"https:\/\/www.dreamhost.com\/blog\/author\/ianh\/"}]}},"lang":"en","translations":{"en":48940,"es":48920,"ru":50735,"pt":54931,"uk":54946,"de":54958,"pl":54981,"it":68387,"fr":70369,"nl":70399},"pll_sync_post":{},"_links":{"self":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/48940","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/users\/1058"}],"version-history":[{"count":2,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/48940\/revisions"}],"predecessor-version":[{"id":87919,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/48940\/revisions\/87919"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/media\/48941"}],"wp:attachment":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/media?parent=48940"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/categories?post=48940"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/tags?post=48940"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}