Press n or j to go to the next uncovered block, b, p or k for the previous block.
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | 12x 12x 12x 12x 180x 20x 20x 54x 54x 22x 54x 28x 26x 20x 160x 235x 235x 276x 276x 201x 75x 235x 12x 171x 26x 145x 145x 145x 145x 145x 145x 145x 12x 246x 9x 9x 9x | import { App, createApp, createVNode, ssrContextKey, ssrUtils, VNode } from 'vue' import { isPromise, isString } from '@vue/shared' import { SSRContext, renderComponentVNode, SSRBuffer } from './render' const { isVNode } = ssrUtils async function unrollBuffer(buffer: SSRBuffer): Promise<string> { if (buffer.hasAsync) { let ret = '' for (let i = 0; i < buffer.length; i++) { let item = buffer[i] if (isPromise(item)) { item = await item } if (isString(item)) { ret += item } else { ret += await unrollBuffer(item) } } return ret } else { // sync buffer can be more efficiently unrolled without unnecessary await // ticks return unrollBufferSync(buffer) } } function unrollBufferSync(buffer: SSRBuffer): string { let ret = '' for (let i = 0; i < buffer.length; i++) { let item = buffer[i] if (isString(item)) { ret += item } else { // since this is a sync buffer, child buffers are never promises ret += unrollBufferSync(item as SSRBuffer) } } return ret } export async function renderToString( input: App | VNode, context: SSRContext = {} ): Promise<string> { if (isVNode(input)) { // raw vnode, wrap with app (for context) return renderToString(createApp({ render: () => input }), context) } // rendering an app const vnode = createVNode(input._component, input._props) vnode.appContext = input._context // provide the ssr context to the tree input.provide(ssrContextKey, context) const buffer = await renderComponentVNode(vnode) const result = await unrollBuffer(buffer as SSRBuffer) await resolveTeleports(context) return result } export async function resolveTeleports(context: SSRContext) { if (context.__teleportBuffers) { context.teleports = context.teleports || {} for (const key in context.__teleportBuffers) { // note: it's OK to await sequentially here because the Promises were // created eagerly in parallel. context.teleports[key] = await unrollBuffer( (await Promise.all(context.__teleportBuffers[key])) as SSRBuffer ) } } } |