import compression from 'compression'
|
|
import express from 'express'
|
|
import { createPageRenderer } from 'vite-plugin-ssr'
|
|
|
|
import { getPath, isProduction, port } from './shared'
|
|
|
|
export async function expressServer() {
|
|
const app = express()
|
|
|
|
app.use(compression())
|
|
|
|
let viteDevServer
|
|
if (isProduction) {
|
|
app.use(express.static(getPath('dist/client')))
|
|
} else {
|
|
const vite = require('vite')
|
|
viteDevServer = await vite.createServer({
|
|
root: getPath(),
|
|
server: { middlewareMode: 'ssr' },
|
|
})
|
|
app.use(viteDevServer.middlewares)
|
|
}
|
|
|
|
const renderPage = createPageRenderer({ viteDevServer, isProduction, root: getPath() })
|
|
app.get('*', async (req, res, next) => {
|
|
const url = req.originalUrl
|
|
const pageContextInit = {
|
|
url,
|
|
}
|
|
const pageContext = await renderPage(pageContextInit)
|
|
const { httpResponse } = pageContext
|
|
if (!httpResponse) return next()
|
|
const { body, statusCode, contentType } = httpResponse
|
|
res.status(statusCode).type(contentType).send(body)
|
|
})
|
|
|
|
app.listen(port)
|
|
console.log(`Server running at http://localhost:${port}`)
|
|
}
|
|
|
|
if (require.main === module) {
|
|
expressServer()
|
|
}
|