Skip to content

Commit

Permalink
feat: support preRender (#6675)
Browse files Browse the repository at this point in the history
* feat: support preRender

* feat: Pip after onAllReady when pre render SSR

* chore: revert onAllReady callback
  • Loading branch information
answershuto authored Nov 30, 2023
1 parent 72fc36c commit f1ee695
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 19 deletions.
1 change: 1 addition & 0 deletions packages/runtime/src/runServerApp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ export interface RenderOptions {
documentDataLoader?: DocumentDataLoaderConfig;
Document?: DocumentComponent;
documentOnly?: boolean;
preRender?: boolean;
renderMode?: RenderMode;
// basename is used both for server and client, once set, it will be sync to client.
basename?: string;
Expand Down
58 changes: 39 additions & 19 deletions packages/runtime/src/server/streamRender.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,19 @@ export function renderToNodeStream(
renderToNodeStreamOptions: RenderToNodeStreamOptions,
): NodeWritablePiper {
return (res, options) => {
const {
renderOptions,
} = renderToNodeStreamOptions;
const {
preRender = false,
} = renderOptions;

const { pipe } = ReactDOMServer.renderToPipeableStream(element, {
onShellReady() {
pipe(res);
// Pip after onAllReady when pre render SSR.
if (!preRender) {
pipe(res);
}
options?.onShellReady && options.onShellReady();
},
onShellError(error) {
Expand All @@ -44,28 +54,38 @@ export function renderToNodeStream(
options?.onError && options?.onError(error);
},
onAllReady() {
const {
renderOptions,
routerContext,
} = renderToNodeStreamOptions;
// For pre render SSR.
if (preRender) {
const {
renderOptions,
routerContext,
} = renderToNodeStreamOptions;

const {
assetsManifest,
} = renderOptions;
const {
assetsManifest,
} = renderOptions;

const {
matches,
loaderData,
} = routerContext;
const {
matches,
loaderData,
} = routerContext;

let renderAssets = getAllAssets(loaderData, matches, assetsManifest);
if (typeof window !== 'undefined' && window.renderAssets) {
renderAssets = renderAssets.concat(window.renderAssets);
}
let renderAssets = getAllAssets(loaderData, matches, assetsManifest);
if (typeof window !== 'undefined' && window.renderAssets) {
renderAssets = renderAssets.concat(window.renderAssets);
}

options?.onAllReady && options?.onAllReady({
renderAssets,
});
options?.onAllReady && options?.onAllReady({
renderAssets,
});

// Pipe after collecting assets.
pipe(res);
} else {
options?.onAllReady && options?.onAllReady({
renderAssets: [],
});
}
},
});
};
Expand Down

0 comments on commit f1ee695

Please sign in to comment.