Skip to content

Commit 1dc3574

Browse files
committed
wip: simplify ssr-react setup
1 parent 2e368a6 commit 1dc3574

File tree

2 files changed

+70
-9
lines changed

2 files changed

+70
-9
lines changed

playground/ssr-react/package.json

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,9 @@
33
"private": true,
44
"type": "module",
55
"scripts": {
6-
"dev": "node server",
7-
"build": "npm run build:client && npm run build:server",
8-
"build:client": "vite build --outDir dist/client",
9-
"build:server": "vite build --ssr src/entry-server.jsx --outDir dist/server",
10-
"generate": "vite build --outDir dist/static && npm run build:server && node prerender",
11-
"serve": "NODE_ENV=production node server",
12-
"debug": "node --inspect-brk server"
6+
"dev": "vite dev",
7+
"build": "vite build --app",
8+
"preview": "vite preview"
139
},
1410
"dependencies": {
1511
"react": "^18.3.1",
Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,75 @@
11
import { defineConfig } from 'vite'
22
import react from '@vitejs/plugin-react'
3+
import fs from 'node:fs'
4+
import path from 'node:path'
35

46
export default defineConfig({
5-
server: { port: 8907 /* Should be unique */ },
6-
plugins: [react()],
7+
appType: 'custom',
78
build: {
89
minify: false,
910
},
11+
environments: {
12+
client: {
13+
build: {
14+
outDir: 'dist/client',
15+
},
16+
},
17+
ssr: {
18+
build: {
19+
outDir: 'dist/server',
20+
rollupOptions: {
21+
input: 'src/entry-server.jsx',
22+
},
23+
},
24+
},
25+
},
26+
plugins: [
27+
react(),
28+
{
29+
name: 'ssr-middleware',
30+
configureServer(server) {
31+
return () => {
32+
server.middlewares.use(async (req, res, next) => {
33+
const url = req.originalUrl ?? '/'
34+
try {
35+
const { render } = await server.ssrLoadModule(
36+
'/src/entry-server.jsx',
37+
)
38+
const appHtml = render(url)
39+
let template = fs.readFileSync(
40+
path.resolve('index.html'),
41+
'utf-8',
42+
)
43+
template = await server.transformIndexHtml(url, template)
44+
const html = template.replace(`<!--app-html-->`, appHtml)
45+
res.setHeader('content-type', 'text/html').end(html)
46+
} catch (e) {
47+
next(e)
48+
}
49+
})
50+
}
51+
},
52+
configurePreviewServer(server) {
53+
const template = fs.readFileSync(
54+
path.resolve('dist/client/index.html'),
55+
'utf-8',
56+
)
57+
return () => {
58+
server.middlewares.use(async (req, res, next) => {
59+
const url = req.originalUrl ?? '/'
60+
try {
61+
const { render } = await import(
62+
path.resolve('dist/server/entry-server.js')
63+
)
64+
const appHtml = render(url)
65+
const html = template.replace(`<!--app-html-->`, appHtml)
66+
res.setHeader('content-type', 'text/html').end(html)
67+
} catch (e) {
68+
next(e)
69+
}
70+
})
71+
}
72+
},
73+
},
74+
],
1075
})

0 commit comments

Comments
 (0)