/
ssr.ts
28 lines (21 loc) · 951 Bytes
/
ssr.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import type { App } from 'vue'
import type { SSRContext } from '@vue/server-renderer'
export async function renderToStringWithMeta (app: App): Promise<[string, SSRContext]> {
const { renderToString } = await import('@vue/server-renderer')
const ctx: SSRContext = {}
const html = await renderToString(app, ctx)
// TODO: better way of determining whether meta was rendered with the component or not
if (!ctx.teleports || !ctx.teleports.head) {
const teleports = app.config.globalProperties.$metaManager.render()
await Promise.all(teleports.map((teleport: any) => renderToString(teleport, ctx)))
}
const { teleports } = ctx
for (const target in teleports) {
if (target.endsWith('Attrs')) {
const str = teleports[target]
// match from first space to first >, these should be all rendered attributes
teleports[target] = str.slice(str.indexOf(' ') + 1, str.indexOf('>'))
}
}
return [html, ctx]
}