rasengan
Version:
The modern React Framework
47 lines (46 loc) • 1.51 kB
JavaScript
import ReactDOM from 'react-dom/server';
import { renderToPipeableStream } from 'react-dom/server';
import { isServerMode, ServerMode } from '../runtime/mode.js';
/**
* Render a React component to a stream.
* @param Component
* @param res
* @param options
* @returns
*/
export const renderToStream = async (Component, res, options) => {
const ABORT_DELAY = 10_000;
let bootstrap = [];
if (isServerMode(process.env.NODE_ENV) &&
process.env.NODE_ENV === ServerMode.Development) {
bootstrap.push('/src/index');
}
return new Promise(async (resolve, reject) => {
let shellRendered = false;
const { pipe, abort } = renderToPipeableStream(Component, {
bootstrapModules: bootstrap,
onShellReady() {
shellRendered = true;
if (!res.headersSent && options?.responseHeaders) {
res.writeHead(options.statusCode ?? 200, options.responseHeaders);
}
resolve(res);
pipe(res);
},
onShellError(error) {
reject(error);
},
onError(error) {
if (shellRendered) {
console.error(error);
abort();
}
},
});
setTimeout(abort, ABORT_DELAY);
});
};
export const renderToString = (Component) => {
const html = ReactDOM.renderToString(Component);
return `<!DOCTYPE html>\n${html}`;
};