shack/renderer/_default.page.server.js

52 lines
1.3 KiB
JavaScript

// import { renderToString as renderToString_ } from '@vue/server-renderer';
import { renderToNodeStream } from '@vue/server-renderer';
import { escapeInject } from 'vite-plugin-ssr/server';
import { createApp } from './app';
import { useUser } from '../stores/user';
import logoUrl from './logo.svg';
async function render(pageContext) {
// See https://vite-plugin-ssr.com/head
const { documentProps } = pageContext.exports;
const title = (documentProps && documentProps.title) || 'shack';
const desc = (documentProps && documentProps.description) || 'Shack';
const { app, store } = createApp(pageContext);
const stream = renderToNodeStream(app);
const documentHtml = escapeInject`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="${logoUrl}" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="${desc}" />
<title>${title}</title>
</head>
<body>
<div id="app">${stream}</div>
</body>
</html>
`;
const userStore = useUser();
userStore.user = pageContext.session.user;
return {
documentHtml,
pageContext: {
initialState: store.state.value,
enableEagerStreaming: true,
},
};
}
export {
render,
};
export const passToClient = ['urlPathname', 'initialState', 'pageData', 'pageProps'];