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 | 11x 11x 11x 11x 160x 18x 18x 52x 52x 21x 52x 28x 24x 18x 142x 207x 207x 250x 250x 185x 65x 207x 11x 154x 25x 129x 129x 129x 129x 129x 129x 129x 7x 7x 7x | 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) await resolveTeleports(context) return unrollBuffer(buffer as SSRBuffer) } 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 ) } } } |