rasengan
Version:
The modern React Framework
48 lines (47 loc) • 1.53 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
* @returns
*/
export const renderToStream = async (Component, res) => {
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;
resolve(res);
pipe(res);
},
onShellError(error) {
reject(error);
},
onError(error) {
// Log streaming rendering errors from inside the shell. Don't log
// errors encountered during initial shell rendering since they'll
// reject and get logged in handleDocumentRequest.
if (shellRendered) {
console.error(error);
}
},
});
setTimeout(abort, ABORT_DELAY);
});
};
export const renderToString = (Component) => {
const html = ReactDOM.renderToString(Component);
return `
<!DOCTYPE html>
${html}
`;
};