import fastify from 'fastify'
|
|
|
|
import { getPath, isDev, port } from './shared'
|
|
|
|
export async function fastifyServer() {
|
|
const app = fastify({
|
|
logger: {
|
|
prettyPrint: isDev
|
|
}
|
|
})
|
|
|
|
if (isDev) {
|
|
const vite = await import('vite')
|
|
const { createPageRenderer } = await import('vite-plugin-ssr')
|
|
|
|
await app.register(import('@fastify/express'))
|
|
app.register(import('@fastify/compress'), { global: false })
|
|
const viteDevServer = await vite.createServer({
|
|
root: getPath(),
|
|
server: { middlewareMode: 'ssr' },
|
|
})
|
|
app.use(viteDevServer.middlewares)
|
|
|
|
const renderPage = createPageRenderer({ viteDevServer, isProduction: !isDev, root: getPath() })
|
|
app.get('*', async (req, res) => {
|
|
const url = req.raw.url || req.url
|
|
const pageContextInit = {
|
|
url,
|
|
}
|
|
const pageContext = await renderPage(pageContextInit)
|
|
const { httpResponse } = pageContext
|
|
if (!httpResponse) return
|
|
const { body, statusCode, contentType } = httpResponse
|
|
res.status(statusCode).type(contentType).compress(body)
|
|
})
|
|
} else {
|
|
app.register(import('@fastify/static'), {
|
|
root: getPath('dist/client')
|
|
})
|
|
}
|
|
|
|
app.listen(port)
|
|
}
|
|
|
|
if (require.main === module) {
|
|
fastifyServer()
|
|
}
|