perf(ssr): avoid unnecessary await ticks when unrolling sync buffers

This commit is contained in:
Evan You
2020-06-26 11:10:30 -04:00
parent 6bc0e0a31a
commit 30584bcc61
3 changed files with 54 additions and 10 deletions

View File

@@ -20,7 +20,8 @@ import {
isPromise,
isString,
isVoidTag,
ShapeFlags
ShapeFlags,
isArray
} from '@vue/shared'
import { ssrRenderAttrs } from './helpers/ssrRenderAttrs'
import { ssrCompile } from './helpers/ssrCompile'
@@ -35,7 +36,7 @@ const {
normalizeSuspenseChildren
} = ssrUtils
export type SSRBuffer = SSRBufferItem[]
export type SSRBuffer = SSRBufferItem[] & { hasAsync?: boolean }
export type SSRBufferItem = string | SSRBuffer | Promise<SSRBuffer>
export type PushFn = (item: SSRBufferItem) => void
export type Props = Record<string, unknown>
@@ -68,6 +69,11 @@ export function createBuffer() {
buffer.push(item)
}
appendable = isStringItem
if (isPromise(item) || (isArray(item) && item.hasAsync)) {
// promise, or child buffer with async, mark as async.
// this allows skipping unnecessary await ticks during unroll stage
buffer.hasAsync = true
}
}
}
}