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 86 87 88 89 90 91 | 13x 13x 13x 13x 183x 20x 20x 54x 54x 22x 54x 28x 26x 20x 163x 249x 249x 290x 290x 204x 86x 249x 13x 175x 26x 149x 149x 149x 149x 148x 148x 148x 1x 1x 148x 13x 249x 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) if (context.__watcherHandles) { for (const unwatch of context.__watcherHandles) { unwatch() } } 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]]) ) } } } |