-
Notifications
You must be signed in to change notification settings - Fork 44
Expand file tree
/
Copy pathserver.mjs
More file actions
62 lines (46 loc) · 1.5 KB
/
server.mjs
File metadata and controls
62 lines (46 loc) · 1.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { createRsbuild, loadConfig, logger } from '@rsbuild/core';
import express from 'express';
const serverRender = (serverAPI) => async (_req, res) => {
const indexModule = await serverAPI.environments.node.loadBundle('index');
const markup = indexModule.render();
const template = await serverAPI.environments.web.getTransformedHtml('index');
const html = template.replace('<!--app-content-->', markup);
res.writeHead(200, {
'Content-Type': 'text/html',
});
res.end(html);
};
export async function startDevServer() {
const { content } = await loadConfig({});
// Init Rsbuild
const rsbuild = await createRsbuild({
rsbuildConfig: content,
});
const app = express();
// Create Rsbuild DevServer instance
const rsbuildServer = await rsbuild.createDevServer();
const serverRenderMiddleware = serverRender(rsbuildServer);
app.get('/', async (req, res, next) => {
try {
await serverRenderMiddleware(req, res, next);
} catch (err) {
logger.error('SSR render error, downgrade to CSR...');
logger.error(err);
next();
}
});
// Apply Rsbuild’s built-in middlewares
app.use(rsbuildServer.middlewares);
const httpServer = app.listen(rsbuildServer.port, () => {
// Notify Rsbuild that the custom server has started
rsbuildServer.afterListen();
});
rsbuildServer.connectWebSocket({ server: httpServer });
return {
close: async () => {
await rsbuildServer.close();
httpServer.close();
},
};
}
startDevServer();