mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2025-12-13 07:46:06 +00:00
98 lines
3.5 KiB
TypeScript
98 lines
3.5 KiB
TypeScript
// This file isn't processed by Vite, see https://github.com/vikejs/vike/issues/562
|
|
// Consequently:
|
|
// - When changing this file, you needed to manually restart your server for your changes to take effect.
|
|
// - To use your environment variables defined in your .env files, you need to install dotenv, see https://vike.dev/env
|
|
// - To use your path aliases defined in your vite.config.js, you need to tell Node.js about them, see https://vike.dev/path-aliases
|
|
|
|
// If you want Vite to process your server code then use one of these:
|
|
// - vavite (https://github.com/cyco130/vavite)
|
|
// - See vavite + Vike examples at https://github.com/cyco130/vavite/tree/main/examples
|
|
// - vite-node (https://github.com/antfu/vite-node)
|
|
// - HatTip (https://github.com/hattipjs/hattip)
|
|
// - You can use Bati (https://batijs.github.io/) to scaffold a Vike + HatTip app. Note that Bati generates apps that use the V1 design (https://vike.dev/migration/v1-design) and Vike packages (https://vike.dev/vike-packages)
|
|
|
|
import compression from 'compression'
|
|
import express from 'express'
|
|
import { renderPage } from 'vike/server'
|
|
|
|
import { root } from './root.js'
|
|
|
|
const isProduction = process.env.NODE_ENV === 'production'
|
|
|
|
void startServer()
|
|
|
|
async function startServer() {
|
|
const app = express()
|
|
|
|
// Vite integration
|
|
if (isProduction) {
|
|
// In production, we need to serve our static assets ourselves.
|
|
// (In dev, Vite's middleware serves our static assets.)
|
|
const sirv = (await import('sirv')).default
|
|
// assets 1y caching
|
|
app.use(
|
|
'/assets',
|
|
sirv(`${root}/build/client/assets`, {
|
|
maxAge: 31536000, // 1Y
|
|
immutable: true,
|
|
gzip: true,
|
|
}),
|
|
)
|
|
// cache things for 10min
|
|
app.use(
|
|
sirv(`${root}/build/client`, {
|
|
maxAge: 600,
|
|
immutable: true,
|
|
gzip: true,
|
|
}),
|
|
)
|
|
} else {
|
|
// We instantiate Vite's development server and integrate its middleware to our server.
|
|
// ⚠️ We instantiate it only in development. (It isn't needed in production and it
|
|
// would unnecessarily bloat our production server.)
|
|
const vite = await import('vite')
|
|
const viteDevMiddleware = (
|
|
await vite.createServer({
|
|
root,
|
|
server: { middlewareMode: true },
|
|
})
|
|
).middlewares
|
|
app.use(viteDevMiddleware)
|
|
|
|
// on the fly compression
|
|
app.use(compression())
|
|
}
|
|
|
|
// ...
|
|
// Other middlewares (e.g. some RPC middleware such as Telefunc)
|
|
// ...
|
|
|
|
// Vike middleware. It should always be our last middleware (because it's a
|
|
// catch-all middleware superseding any middleware placed after it).
|
|
app.get('*', (req, res, next) => {
|
|
void (async (req, res, next) => {
|
|
const pageContextInit = {
|
|
urlOriginal: req.originalUrl,
|
|
}
|
|
const pageContext = await renderPage(pageContextInit)
|
|
const { httpResponse } = pageContext
|
|
if (!httpResponse) {
|
|
next()
|
|
} else {
|
|
const { body, statusCode, headers, earlyHints } = httpResponse
|
|
if (res.writeEarlyHints)
|
|
res.writeEarlyHints({ link: earlyHints.map((e) => e.earlyHintLink) })
|
|
headers.forEach(([name, value]) => res.setHeader(name, value))
|
|
res.status(statusCode)
|
|
// For HTTP streams use httpResponse.pipe() instead, see https://vike.dev/stream
|
|
res.send(body)
|
|
}
|
|
})(req, res, next)
|
|
})
|
|
|
|
const port = process.env.PORT || 3000
|
|
app.listen(port)
|
|
// eslint-disable-next-line no-console
|
|
console.log(`🚀 Server running at http://localhost:${port}`)
|
|
}
|