Skip to content

Commit

Permalink
wip(ssr): improve buffer typing
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Jan 28, 2020
1 parent 78beed2 commit 8857b4f
Showing 1 changed file with 11 additions and 11 deletions.
22 changes: 11 additions & 11 deletions packages/server-renderer/src/renderToString.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,14 @@ import {
} from 'vue'
import { isString, isPromise, isArray, isFunction } from '@vue/shared'

// Each component has a buffer array.
// A buffer array can contain one of the following:
// - plain string
// - A resolved buffer (recursive arrays of strings that can be unrolled
// synchronously)
// - An async buffer (a Promise that resolves to a resolved buffer)
type SSRBuffer = SSRBufferItem[]
type SSRBufferItem = string | ResolvedSSRBuffer | Promise<SSRBuffer>
type SSRBufferItem = string | ResolvedSSRBuffer | Promise<ResolvedSSRBuffer>
type ResolvedSSRBuffer = (string | ResolvedSSRBuffer)[]

function createBuffer() {
Expand Down Expand Up @@ -53,10 +59,7 @@ function unrollBuffer(buffer: ResolvedSSRBuffer): string {
}

export async function renderToString(app: App): Promise<string> {
const resolvedBuffer = (await renderComponent(
app._component,
app._props
)) as ResolvedSSRBuffer
const resolvedBuffer = await renderComponent(app._component, app._props)
return unrollBuffer(resolvedBuffer)
}

Expand All @@ -65,7 +68,7 @@ export function renderComponent(
props: Record<string, any> | null = null,
children: VNode['children'] = null,
parentComponent: ComponentInternalInstance | null = null
): ResolvedSSRBuffer | Promise<SSRBuffer> {
): ResolvedSSRBuffer | Promise<ResolvedSSRBuffer> {
const vnode = createVNode(comp, props, children)
const instance = createComponentInstance(vnode, parentComponent)
const res = setupComponent(instance, null)
Expand All @@ -79,7 +82,7 @@ export function renderComponent(
function innerRenderComponent(
comp: Component,
instance: ComponentInternalInstance
): ResolvedSSRBuffer | Promise<SSRBuffer> {
): ResolvedSSRBuffer | Promise<ResolvedSSRBuffer> {
const { buffer, push, hasAsync } = createBuffer()
if (isFunction(comp)) {
renderVNode(push, renderComponentRoot(instance))
Expand All @@ -101,10 +104,7 @@ function innerRenderComponent(
// If the current component's buffer contains any Promise from async children,
// then it must return a Promise too. Otherwise this is a component that
// contains only sync children so we can avoid the async book-keeping overhead.
return hasAsync()
? // TS can't figure out the typing due to recursive appearance of Promise
Promise.all(buffer as any)
: (buffer as ResolvedSSRBuffer)
return hasAsync() ? Promise.all(buffer) : (buffer as ResolvedSSRBuffer)
}

export function renderVNode(push: (item: SSRBufferItem) => void, vnode: VNode) {
Expand Down

0 comments on commit 8857b4f

Please sign in to comment.