From 68341ba679cc09d14783bd36cd6579d4e9e40947 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Tue, 18 Jun 2024 16:34:59 -0400 Subject: [PATCH] Remove entry.server.spa.tsx implementation --- .changeset/tall-mangos-add.md | 5 ++ packages/remix-dev/cli/commands.ts | 4 +- packages/remix-dev/config.ts | 12 +-- .../config/defaults/entry.server.spa.tsx | 73 ------------------- 4 files changed, 7 insertions(+), 87 deletions(-) create mode 100644 .changeset/tall-mangos-add.md delete mode 100644 packages/remix-dev/config/defaults/entry.server.spa.tsx diff --git a/.changeset/tall-mangos-add.md b/.changeset/tall-mangos-add.md new file mode 100644 index 0000000000..7a960eeeaa --- /dev/null +++ b/.changeset/tall-mangos-add.md @@ -0,0 +1,5 @@ +--- +"@react-router/dev": minor +--- + +Remove internal entry.server.spa.tsx implementation diff --git a/packages/remix-dev/cli/commands.ts b/packages/remix-dev/cli/commands.ts index a378794e37..0eac22f476 100644 --- a/packages/remix-dev/cli/commands.ts +++ b/packages/remix-dev/cli/commands.ts @@ -121,9 +121,7 @@ export async function generateEntry( let defaultEntryServer = path.resolve( defaultsDirectory, - ctx?.reactRouterConfig.ssr === false - ? `entry.server.spa.tsx` - : `entry.server.node.tsx` + `entry.server.node.tsx` ); let isServerEntry = entry === "entry.server"; diff --git a/packages/remix-dev/config.ts b/packages/remix-dev/config.ts index ac7304874b..0f7e891243 100644 --- a/packages/remix-dev/config.ts +++ b/packages/remix-dev/config.ts @@ -487,17 +487,7 @@ export async function resolveEntryFiles({ let pkgJson = await PackageJson.load(rootDirectory); let deps = pkgJson.content.dependencies ?? {}; - if (!reactRouterConfig.ssr) { - // This is a super-simple default since we don't need streaming in SPA Mode. - // We can include this in a remix-spa template, but right now `npx remix reveal` - // will still expose the streaming template since that command doesn't have - // access to the `ssr:false` flag in the vite config (the streaming template - // works just fine so maybe instead of having this we _only have this version - // in the template...). We let users manage an entry.server file in SPA Mode - // so they can de ide if they want to hydrate the full document or just an - // embedded `
` or whatever. - entryServerFile = "entry.server.spa.tsx"; - } else if (userEntryServerFile) { + if (userEntryServerFile) { entryServerFile = userEntryServerFile; } else { if (!deps["@react-router/node"]) { diff --git a/packages/remix-dev/config/defaults/entry.server.spa.tsx b/packages/remix-dev/config/defaults/entry.server.spa.tsx deleted file mode 100644 index b3c9356549..0000000000 --- a/packages/remix-dev/config/defaults/entry.server.spa.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { PassThrough } from "node:stream"; - -import type { AppLoadContext, EntryContext } from "@react-router/node"; -import { createReadableStreamFromReadable } from "@react-router/node"; -import { RemixServer } from "react-router"; -import { renderToPipeableStream } from "react-dom/server"; - -const ABORT_DELAY = 5_000; - -export default function handleRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext, - loadContext: AppLoadContext -) { - return handleBotRequest( - request, - responseStatusCode, - responseHeaders, - remixContext - ); -} - -function handleBotRequest( - request: Request, - responseStatusCode: number, - responseHeaders: Headers, - remixContext: EntryContext -) { - return new Promise((resolve, reject) => { - let shellRendered = false; - const { pipe, abort } = renderToPipeableStream( - , - { - onAllReady() { - shellRendered = true; - const body = new PassThrough(); - const stream = createReadableStreamFromReadable(body); - - responseHeaders.set("Content-Type", "text/html"); - - resolve( - new Response(stream, { - headers: responseHeaders, - status: responseStatusCode, - }) - ); - - pipe(body); - }, - onShellError(error: unknown) { - reject(error); - }, - onError(error: unknown) { - responseStatusCode = 500; - // 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); - }); -}