feat(server-renderer): render suspense in vnode mode (#727)

This commit is contained in:
Dmitry Sharshakov
2020-03-10 01:20:30 +03:00
committed by GitHub
parent e12ddd96ba
commit 589aeb402c
4 changed files with 133 additions and 4 deletions

View File

@@ -36,7 +36,8 @@ const {
setCurrentRenderingInstance,
setupComponent,
renderComponentRoot,
normalizeVNode
normalizeVNode,
normalizeSuspenseChildren
} = ssrUtils
// Each component has a buffer array.
@@ -248,7 +249,7 @@ function renderVNode(
} else if (shapeFlag & ShapeFlags.PORTAL) {
renderPortal(vnode, parentComponent)
} else if (shapeFlag & ShapeFlags.SUSPENSE) {
// TODO
push(renderSuspense(vnode, parentComponent))
} else {
console.warn(
'[@vue/server-renderer] Invalid VNode type:',
@@ -365,3 +366,19 @@ async function resolvePortals(context: SSRContext) {
}
}
}
async function renderSuspense(
vnode: VNode,
parentComponent: ComponentInternalInstance
): Promise<ResolvedSSRBuffer> {
const { content, fallback } = normalizeSuspenseChildren(vnode)
try {
const { push, getBuffer } = createBuffer()
renderVNode(push, content, parentComponent)
return await getBuffer()
} catch {
const { push, getBuffer } = createBuffer()
renderVNode(push, fallback, parentComponent)
return getBuffer()
}
}