UNPKG

rasengan

Version:

The modern React Framework

48 lines (47 loc) 1.53 kB
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} `; };