Server-side rendering (SSR)
This chapter introduces how to implement SSR functionality using Rsbuild.
Rsbuild does not ship with SSR by default. Instead, it offers low-level APIs and configurations so framework developers can build SSR support. If you need SSR that works out of the box, consider a full-stack framework built on Rsbuild, such as Modern.js.
What is SSR
SSR stands for "Server-Side Rendering". It means that the server generates the page's HTML and sends it to the client, rather than sending only an empty HTML shell and relying on JavaScript to generate the page content.
In traditional client-side rendering, the server sends an empty HTML shell and some JavaScript scripts to the client, which then fetches data from the server's API and fills the page with dynamic content. This leads to slow initial page loading times and negatively impacts user experience and SEO.
With SSR, the server generates HTML that already contains dynamic content and sends it to the client. This makes initial page loading faster and more SEO-friendly, as search engines can crawl the rendered page.
File structure
A typical SSR application will have the following files:
The index.html will need to include a placeholder where the server-rendered content should be injected:
Create SSR configuration
In SSR scenarios, you need to generate web and node outputs at the same time for client-side rendering (CSR) and server-side rendering (SSR).
You can then use Rsbuild's multi-environment builds capability to define the following configuration:
External dependencies
SSR server bundles usually run in Node.js. If your deployment installs node_modules together with the server bundle, configure dependencies as external so they can be loaded by Node.js at runtime instead of being bundled into the server output.
For this setup, prefer output.autoExternal:
Rsbuild will externalize dependencies declared in the root package.json, including subpath imports such as react/jsx-runtime, so runtime packages can be loaded directly by Node.js.
If you need a fully standalone server bundle, or if the deployment environment does not install the externalized dependencies, keep this option disabled or customize which dependency types are externalized.
Custom server
Rsbuild provides the Server API and environment API to allow you to implement SSR.
Here is a basic example:
Modify startup script
When you use a custom server, change the startup command from rsbuild dev to node ./server.mjs.
To preview the production SSR output, update the preview command as well. For an example of a production SSR server, see Example.
You can now run npm run dev to start the dev server with SSR and open http://localhost:3000/ to see the server-rendered content in the HTML page.
Get manifest
By default, Rsbuild automatically inserts the scripts and links for the current page into the HTML template. You can retrieve the compiled template with getTransformedHtml.
When you need to dynamically generate HTML on the server side, you will need to inject the URLs of JavaScript and CSS assets into the HTML. By configuring output.manifest, you can easily obtain the manifest information of these assets. Here is an example:
Examples
SSR-specific plugins
When developing Rsbuild plugins, if you need to add specific logic for SSR, you can distinguish it by target.
- Modify Rsbuild configuration for SSR via modifyEnvironmentConfig:
- Modify Rspack configuration for SSR via modifyRspackConfig:
- Transform code for SSR and client separately via transform:

