[go: up one dir, main page]

0% found this document useful (0 votes)
4 views9 pages

prerender – React

The document provides an overview of the 'prerender' API in React, which allows rendering a React tree to a static HTML string using Web Streams. It details the usage, parameters, and return values of the prerender function, emphasizing its suitability for static server-side generation (SSG) and the importance of waiting for all data to load before rendering. Additionally, it includes troubleshooting tips and examples for implementing prerender in applications.

Uploaded by

dungeon.dad87
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
4 views9 pages

prerender – React

The document provides an overview of the 'prerender' API in React, which allows rendering a React tree to a static HTML string using Web Streams. It details the usage, parameters, and return values of the prerender function, emphasizing its suitability for static server-side generation (SSG) and the importance of waiting for all data to load before rendering. Additionally, it includes troubleshooting tips and examples for implementing prerender in applications.

Uploaded by

dungeon.dad87
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 9

20/02/2025, 19:18 prerender – React

v19

API REFERENCE STATIC APIS

prerender
prerender renders a React tree to a static HTML string using a
Web Stream.

const {prelude} = await prerender(reactNode, options?)

Reference

prerender(reactNode, options?)

Usage

Rendering a React tree to a stream of static HTML


Rendering a React tree to a string of static HTML
Waiting for all data to load

Troubleshooting

My stream doesn’t start until the entire app is rendered

Note

This API depends on Web Streams. For Node.js, use


prerenderToNodeStream instead.

Reference

https://react.dev/reference/react-dom/static/prerender 1/9
20/02/2025, 19:18 prerender – React

prerender(reactNode, options?)

Call prerender to render your app to static HTML.

import { prerender } from 'react-dom/static';

async function handler(request) {


const {prelude} = await prerender(<App />, {
bootstrapScripts: ['/main.js']
});
return new Response(prelude, {
headers: { 'content-type': 'text/html' },
});
}

On the client, call hydrateRoot to make the server-generated HTML


interactive.

See more examples below.

Parameters

reactNode : A React node you want to render to HTML. For example, a


JSX node like <App /> . It is expected to represent the entire document,
so the App component should render the <html> tag.

optional options : An object with static generation options.

optional bootstrapScriptContent : If specified, this string will be


placed in an inline <script> tag.
optional bootstrapScripts : An array of string URLs for the <script>
tags to emit on the page. Use this to include the <script> that calls
hydrateRoot . Omit it if you don’t want to run React on the client at all.

optional bootstrapModules : Like bootstrapScripts , but emits


<script type="module"> instead.

optional identifierPrefix : A string prefix React uses for IDs


generated by useId . Useful to avoid conflicts when using multiple

https://react.dev/reference/react-dom/static/prerender 2/9
20/02/2025, 19:18 prerender – React

roots on the same page. Must be the same prefix as passed to


hydrateRoot .

optional namespaceURI : A string with the root namespace URI for the
stream. Defaults to regular HTML. Pass
'http://www.w3.org/2000/svg' for SVG or
'http://www.w3.org/1998/Math/MathML' for MathML.

optional onError : A callback that fires whenever there is a server error,


whether recoverable or not. By default, this only calls console.error .
If you override it to log crash reports, make sure that you still call
console.error . You can also use it to adjust the status code before
the shell is emitted.
optional progressiveChunkSize : The number of bytes in a chunk. Read
more about the default heuristic.
optional signal : An abort signal that lets you abort server rendering
and render the rest on the client.

Returns

prerender returns a Promise:

If rendering the is successful, the Promise will resolve to an object


containing:

prelude : a Web Stream of HTML. You can use this stream to send a
response in chunks, or you can read the entire stream into a string.

If rendering fails, the Promise will be rejected. Use this to output a fallback
shell.

Note

When should I use prerender ?

The static prerender API is used for static server-side generation


(SSG). Unlike renderToString , prerender waits for all data to load
before resolving. This makes it suitable for generating static HTML

https://react.dev/reference/react-dom/static/prerender 3/9
20/02/2025, 19:18 prerender – React

for a full page, including data that needs to be fetched using


Suspense. To stream content as it loads, use a streaming server-side
render (SSR) API like renderToReadableStream.

Usage

Rendering a React tree to a stream of static HTML

Call prerender to render your React tree to static HTML into a Readable
Web Stream::

import { prerender } from 'react-dom/static';

async function handler(request) {


const {prelude} = await prerender( <App /> , {
bootstrapScripts: ['/main.js']
});
return new Response(prelude, {
headers: { 'content-type': 'text/html' },
});
}

Along with the root component , you need to provide a list of bootstrap
<script> paths . Your root component should return the entire document

including the root <html> tag.

For example, it might look like this:

export default function App () {


return (
<html>
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale
https://react.dev/reference/react-dom/static/prerender 4/9
20/02/2025, 19:18 prerender – React

<link rel="stylesheet" href="/styles.css"></link>


<title>My app</title>
</head>
<body>
<Router />
</body>
</html>
);
}

React will inject the doctype and your bootstrap <script> tags into the
resulting HTML stream:

<!DOCTYPE html>
<html>
<!-- ... HTML from your components ... -->
</html>
<script src=" /main.js " async=""></script>

On the client, your bootstrap script should hydrate the entire document with
a call to hydrateRoot :

import { hydrateRoot } from 'react-dom/client';


import App from './App.js';

hydrateRoot(document, <App /> );

This will attach event listeners to the static server-generated HTML and
make it interactive.

DEEP DIVE

Reading CSS and JS asset paths from the build output


https://react.dev/reference/react-dom/static/prerender 5/9
20/02/2025, 19:18 prerender – React

Show Details

Rendering a React tree to a string of static HTML

Call prerender to render your app to a static HTML string:

import { prerender } from 'react-dom/static';

async function renderToString() {


const {prelude} = await prerender(<App />, {
bootstrapScripts: ['/main.js']
});

const reader = prelude.getReader();


let content = '';
while (true) {
const {done, value} = await reader.read();
if (done) {
return content;
}
content += Buffer.from(value).toString('utf8');
}
}

This will produce the initial non-interactive HTML output of your React
components. On the client, you will need to call hydrateRoot to hydrate that
server-generated HTML and make it interactive.

Waiting for all data to load

prerender waits for all data to load before finishing the static HTML

generation and resolving. For example, consider a profile page that shows a
cover, a sidebar with friends and photos, and a list of posts:

https://react.dev/reference/react-dom/static/prerender 6/9
20/02/2025, 19:18 prerender – React

function ProfilePage() {
return (
<ProfileLayout>
<ProfileCover />
<Sidebar>
<Friends />
<Photos />
</Sidebar>
<Suspense fallback={<PostsGlimmer />}>
<Posts />
</Suspense>
</ProfileLayout>
);
}

Imagine that <Posts /> needs to load some data, which takes some time.
Ideally, you’d want wait for the posts to finish so it’s included in the HTML. To
do this, you can use Suspense to suspend on the data, and prerender will
wait for the suspended content to finish before resolving to the static HTML.

Note

Only Suspense-enabled data sources will activate the Suspense


component. They include:

Data fetching with Suspense-enabled frameworks like Relay and


Next.js
Lazy-loading component code with lazy
Reading the value of a Promise with use

Suspense does not detect when data is fetched inside an Effect or


event handler.

The exact way you would load data in the Posts component above
depends on your framework. If you use a Suspense-enabled
framework, you’ll find the details in its data fetching documentation.

https://react.dev/reference/react-dom/static/prerender 7/9
20/02/2025, 19:18 prerender – React

Suspense-enabled data fetching without the use of an opinionated


framework is not yet supported. The requirements for implementing
a Suspense-enabled data source are unstable and undocumented.
An official API for integrating data sources with Suspense will be
released in a future version of React.

Troubleshooting

My stream doesn’t start until the entire app is


rendered

The prerender response waits for the entire app to finish rendering,
including waiting for all Suspense boundaries to resolve, before resolving. It
is designed for static site generation (SSG) ahead of time and does not
support streaming more content as it loads.

To stream content as it loads, use a streaming server render API like


renderToReadableStream.

PREVIOUS

Static APIs

NEXT

prerenderToNodeStream

Copyright © Meta Platforms, Inc

https://react.dev/reference/react-dom/static/prerender 8/9
20/02/2025, 19:18 prerender – React

uwu?

Learn React API Reference

Quick Start React APIs

Installation React DOM APIs

Describing the UI

Adding Interactivity

Managing State

Escape Hatches

Community More

Code of Conduct Blog

Meet the Team React Native

Docs Contributors Privacy

Acknowledgements Terms

https://react.dev/reference/react-dom/static/prerender 9/9

You might also like