import { renderToString as renderToString_ } from '@vue/server-renderer' import { escapeInject, dangerouslySkipEscape } from 'vike/server' import logoUrl from '#assets/favicon.ico' import { META } from '#src/env' import { createApp } from './app' import type { PageContextServer } from '#types/PageContext' import type { App } from 'vue' // See https://vike.dev/data-fetching export const passToClient = ['pageProps', 'urlPathname', 'routeParams'] async function render(pageContext: PageContextServer) { const { Page, pageProps } = pageContext // This render() hook only supports SSR, see https://vike.dev/render-modes for how to modify render() to support SPA if (!Page) { throw new Error('My render() hook expects pageContext.Page to be defined') } const app = createApp(Page, pageProps, pageContext, false) const appHtml = await renderToString(app) // See https://vike.dev/head const { documentProps } = pageContext.exports const title = (documentProps && documentProps.title) || META.DEFAULT_TITLE const desc = (documentProps && documentProps.description) || META.DEFAULT_DESCRIPTION const documentHtml = escapeInject` ${title}
${dangerouslySkipEscape(appHtml)}
` return { documentHtml, pageContext: { // We can add some `pageContext` here, which is useful if we want to do page redirection https://vike.dev/page-redirection }, } } async function renderToString(app: App) { let err: unknown // Workaround: renderToString_() swallows errors in production, see https://github.com/vuejs/core/issues/7876 app.config.errorHandler = (err_) => { err = err_ } const appHtml = await renderToString_(app) if (err) throw err return appHtml } export { render }