| | import { type Express } from "express"; |
| | import { createServer as createViteServer, createLogger } from "vite"; |
| | import { type Server } from "http"; |
| | import viteConfig from "../../vite.config"; |
| | import fs from "fs"; |
| | import path from "path"; |
| | import { nanoid } from "nanoid"; |
| |
|
| | const viteLogger = createLogger(); |
| |
|
| | export async function setupVite(server: Server, app: Express) { |
| | const serverOptions = { |
| | middlewareMode: true, |
| | hmr: { server, path: "/vite-hmr" }, |
| | allowedHosts: true as const, |
| | }; |
| |
|
| | const vite = await createViteServer({ |
| | ...viteConfig, |
| | configFile: false, |
| | customLogger: { |
| | ...viteLogger, |
| | error: (msg, options) => { |
| | viteLogger.error(msg, options); |
| | process.exit(1); |
| | }, |
| | }, |
| | server: serverOptions, |
| | appType: "custom", |
| | }); |
| |
|
| | app.use(vite.middlewares); |
| |
|
| | app.use(async (req, res, next) => { |
| | const url = req.originalUrl; |
| |
|
| | try { |
| | const clientTemplate = path.resolve( |
| | import.meta.dirname, |
| | "..", |
| | "index.html", |
| | ); |
| |
|
| | |
| | let template = await fs.promises.readFile(clientTemplate, "utf-8"); |
| | template = template.replace( |
| | `client="/client/main.tsx"`, |
| | `client="/client/main.tsx?v=${nanoid()}"`, |
| | ); |
| | const page = await vite.transformIndexHtml(url, template); |
| | res.status(200).set({ "Content-Type": "text/html" }).end(page); |
| | } catch (e) { |
| | vite.ssrFixStacktrace(e as Error); |
| | next(e); |
| | } |
| | }); |
| | } |
| |
|