From dbaee0c81ab0e8d995ce74bf899e4282af829e53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Sun, 15 Dec 2024 07:49:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E4=B8=8A=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E4=BA=86=E5=AF=B9=E4=BA=8ESSR=E7=9A=84=E5=AE=9E=E9=AA=8C?= =?UTF-8?q?=EF=BC=8C=E4=BD=86CSS=20Module=E7=9A=84=E5=AE=9E=E9=AA=8C?= =?UTF-8?q?=E6=9C=AA=E5=AE=8C=E6=88=90=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lockb | Bin 143774 -> 144122 bytes index.html | 24 +++++++++++++----------- package.json | 1 + server.ts | 25 +++++++++++++++++++++---- src/App.tsx | 20 +++++--------------- src/main.tsx | 4 ++-- src/pages/MainLayout.tsx | 2 ++ 7 files changed, 44 insertions(+), 32 deletions(-) diff --git a/bun.lockb b/bun.lockb index c1d33b109afdd9751641e05584ec37f21ecbd7d8..0a6ec4b7988ce519e0302f7bd15f3882aa1c2739 100755 GIT binary patch delta 21063 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 - - - - - - Vite + React + TS - - -
- - + + + + + + Vite + React + TS + + + +
+ + + diff --git a/package.json b/package.json index d376351..a3069ac 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@elysiajs/static": "^1.1.1", + "clsx": "^2.1.1", "elysia": "^1.1.26", "elysia-connect-middleware": "^0.0.3", "react": "^19.0.0", diff --git a/server.ts b/server.ts index dbc48dc..1adb8f4 100644 --- a/server.ts +++ b/server.ts @@ -1,20 +1,37 @@ import Elysia from 'elysia'; import { connect } from 'elysia-connect-middleware'; import { createElement } from 'react'; -import { renderToReadableStream } from 'react-dom/server'; +import { renderToString } from 'react-dom/server'; import { createServer } from 'vite'; import { App } from './src/App'; +const isProduction = process.env.NODE_ENV === 'production'; +const base = process.env.BASE || '/'; + +let template = ''; +if (!isProduction) { + const templateFile = Bun.file('index.html'); + template = await templateFile.text(); +} + const app = new Elysia(); const vite = await createServer({ server: { middlewareMode: true }, appType: 'custom', }); app.use(connect(vite.middlewares)); -app.get('/', async () => { +app.get('/', async ({ request }) => { + const url = request.url.replace(base, ''); const app = createElement(App); - const stream = await renderToReadableStream(app, { bootstrapScripts: ['/src/main.tsx'] }); - return new Response(stream, { + const rootComponent = await renderToString(app); + + if (!isProduction) { + template = await vite.transformIndexHtml(url, template); + } + + const html = template.replace(``, () => rootComponent); + + return new Response(html, { headers: { 'Content-Type': 'text/html', }, diff --git a/src/App.tsx b/src/App.tsx index 99bc758..1def252 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,21 +6,11 @@ import { MainLayout } from './pages/MainLayout'; export const App = () => { return ( - - - - - React SSR App - - - - - - } /> - - - - + + + } /> + + ); }; diff --git a/src/main.tsx b/src/main.tsx index ddfcadd..75c722f 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,8 +1,8 @@ // Boot styles -// import './index.css'; +import './index.css'; // Boot scripts import { hydrateRoot } from 'react-dom/client'; import { App } from './App'; -hydrateRoot(document, ); +hydrateRoot(document.getElementById('root'), ); diff --git a/src/pages/MainLayout.tsx b/src/pages/MainLayout.tsx index d9ecdcd..2993e13 100644 --- a/src/pages/MainLayout.tsx +++ b/src/pages/MainLayout.tsx @@ -1,3 +1,5 @@ +'use client'; + import { Outlet } from 'react-router-dom'; import styles from './MainLayout.module.css';