mirror of
https://git.hmsn.ink/kospo/svcm/dmz.git
synced 2026-03-20 07:33:32 +09:00
first
This commit is contained in:
67
server/serve/event.ts
Normal file
67
server/serve/event.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import { readFileSync } from 'node:fs'
|
||||
|
||||
import {
|
||||
setResponseStatus,
|
||||
setResponseHeader,
|
||||
getRequestURL,
|
||||
eventHandler,
|
||||
} from 'h3'
|
||||
import { isProduction, isDebug } from 'std-env'
|
||||
import type { ViteDevServer } from 'vite'
|
||||
|
||||
import type { VueroServerRender } from '../types'
|
||||
import { resolve } from '../utils'
|
||||
|
||||
export function createEventHandler({
|
||||
vite,
|
||||
render,
|
||||
template: baseTemplate,
|
||||
manifest,
|
||||
}: {
|
||||
vite?: ViteDevServer
|
||||
render: VueroServerRender
|
||||
template: string
|
||||
manifest: Record<string, any>
|
||||
}) {
|
||||
return eventHandler(async (event) => {
|
||||
try {
|
||||
// load template and render function from vue app
|
||||
let template = baseTemplate
|
||||
if (!isProduction && vite) {
|
||||
const url = getRequestURL(event)
|
||||
// always read fresh template in dev
|
||||
template = readFileSync(resolve('../index.html'), 'utf-8')
|
||||
template = await vite.transformIndexHtml(url.pathname, template)
|
||||
|
||||
// reload the server entrypoint on every request in dev
|
||||
render = (await vite.ssrLoadModule('/src/entry-server.ts')).render
|
||||
}
|
||||
|
||||
// render the vue app to HTML
|
||||
return await render({
|
||||
event,
|
||||
manifest,
|
||||
template,
|
||||
})
|
||||
}
|
||||
catch (error: any) {
|
||||
// handle error 500 page
|
||||
if (!isProduction || isDebug) {
|
||||
setResponseHeader(event, 'Cache-Control', 'no-cache, no-store, must-revalidate')
|
||||
setResponseStatus(event, 500)
|
||||
|
||||
vite?.ssrFixStacktrace(error)
|
||||
console.error('[dev] [pageError] ', error)
|
||||
|
||||
return error.message
|
||||
}
|
||||
else {
|
||||
setResponseHeader(event, 'Cache-Control', 'no-cache, no-store, must-revalidate')
|
||||
setResponseStatus(event, 500)
|
||||
|
||||
console.error('[pageError] ' + error)
|
||||
return 'Internal Server Error'
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
20
server/serve/process-handlers.ts
Normal file
20
server/serve/process-handlers.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import { isProduction, isDebug } from 'std-env'
|
||||
|
||||
export function registerProcessHandlers() {
|
||||
if (!isProduction || isDebug) {
|
||||
process.on('unhandledRejection', error =>
|
||||
console.error('[dev] [unhandledRejection]', error),
|
||||
)
|
||||
process.on('uncaughtException', error =>
|
||||
console.error('[dev] [uncaughtException]', error),
|
||||
)
|
||||
}
|
||||
else {
|
||||
process.on('unhandledRejection', error =>
|
||||
console.error('[unhandledRejection] ' + error),
|
||||
)
|
||||
process.on('uncaughtException', error =>
|
||||
console.error('[uncaughtException] ' + error),
|
||||
)
|
||||
}
|
||||
}
|
||||
68
server/serve/renderer.ts
Normal file
68
server/serve/renderer.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
||||
|
||||
import { readFileSync } from 'node:fs'
|
||||
import type { ViteDevServer } from 'vite'
|
||||
|
||||
import type { VueroServerRender } from '../types.js'
|
||||
import { isProduction } from 'std-env'
|
||||
import { resolve } from '../utils.js'
|
||||
|
||||
export async function createRenderer() {
|
||||
let vite: ViteDevServer | undefined
|
||||
let render: VueroServerRender
|
||||
|
||||
if (!isProduction) {
|
||||
const createServer = await import('vite').then(m => m.createServer)
|
||||
|
||||
vite = await createServer({
|
||||
root: process.cwd(),
|
||||
logLevel: 'info',
|
||||
appType: 'custom',
|
||||
server: {
|
||||
middlewareMode: true,
|
||||
},
|
||||
define: {
|
||||
__VUERO_SSR_BUILD__: true,
|
||||
},
|
||||
})
|
||||
|
||||
// mock renderer, it will be reloaded on each request in dev
|
||||
render = async () => ''
|
||||
}
|
||||
else {
|
||||
/**
|
||||
* Otherwise, we load compiled version,
|
||||
* and we register compression and serve-static express handlers in h3
|
||||
*
|
||||
* @see https://github.com/expressjs/compression
|
||||
* @see https://github.com/expressjs/serve-static
|
||||
*/
|
||||
|
||||
// @ts-ignore - file present only when built
|
||||
render = await import('../../dist/server/entry-server.mjs').then(m => m.render)
|
||||
}
|
||||
|
||||
return {
|
||||
vite,
|
||||
render,
|
||||
}
|
||||
}
|
||||
|
||||
export async function loadAssets() {
|
||||
const manifest: Record<string, any> = isProduction
|
||||
? await import(
|
||||
// @ts-ignore - file present only when built
|
||||
'../../dist/client/.vite/ssr-manifest.json',
|
||||
{ assert: { type: 'json' } }
|
||||
)
|
||||
: {}
|
||||
|
||||
const template = isProduction
|
||||
? readFileSync(resolve('../dist/client/index.html'), 'utf-8')
|
||||
: ''
|
||||
|
||||
return {
|
||||
manifest,
|
||||
template,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user