From 3df5540dea76309c5aed0320c39688c8db9d3e71 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Jul 2026 14:11:11 +0000 Subject: [PATCH] fix: render SSR-enabled build entries once by teeing the RSC stream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When ssr is enabled, build() rendered the identical element through two separate renderToReadableStream calls — one for SSR HTML and one for the app RSC payload. Every server component (and defer() call) therefore executed twice per entry. Render once and tee() the stream instead, so both consumers see byte-identical streams with half the rendering work. Closes #147 Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01ShuMmxpPtcxZrHMQZdbq2a --- packages/static/src/rsc/entry.tsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/static/src/rsc/entry.tsx b/packages/static/src/rsc/entry.tsx index f3361d0..113fe41 100644 --- a/packages/static/src/rsc/entry.tsx +++ b/packages/static/src/rsc/entry.tsx @@ -293,13 +293,12 @@ export async function build() { let appRscStream: ReadableStream; if (ssrEnabled) { - // SSR on: both streams have full tree - rootRscStream = renderToReadableStream({ + // SSR on: render the full tree once and tee the stream — one branch + // for SSR HTML, one for the app RSC payload. Rendering twice would + // execute every server component (and defer()) twice per entry (#147). + [rootRscStream, appRscStream] = renderToReadableStream({ root: {appNode}, - }); - appRscStream = renderToReadableStream({ - root: {appNode}, - }); + }).tee(); } else { // SSR off: root stream has shell, app stream has App only rootRscStream = renderToReadableStream({