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 | 30x 30x 30x 30x 30x 4x 4x 4x 4x 4x 6x 6x 6x 30x 4x 4x 4x 4x 6x 6x 4x | import { ComponentNode, TransformContext, buildSlots, createFunctionExpression, FunctionExpression, TemplateChildNode, createCallExpression, SlotsExpression } from '@vue/compiler-dom' import { SSRTransformContext, processChildrenAsStatement } from '../ssrCodegenTransform' import { SSR_RENDER_SUSPENSE } from '../runtimeHelpers' const wipMap = new WeakMap<ComponentNode, WIPEntry>() interface WIPEntry { slotsExp: SlotsExpression wipSlots: Array<{ fn: FunctionExpression children: TemplateChildNode[] }> } // phase 1 export function ssrTransformSuspense( node: ComponentNode, context: TransformContext ) { return () => { if (node.children.length) { const wipEntry: WIPEntry = { slotsExp: null!, // to be immediately set wipSlots: [] } wipMap.set(node, wipEntry) wipEntry.slotsExp = buildSlots(node, context, (_props, children, loc) => { const fn = createFunctionExpression( [], undefined, // no return, assign body later true, // newline false, // suspense slots are not treated as normal slots loc ) wipEntry.wipSlots.push({ fn, children }) return fn }).slots } } } // phase 2 export function ssrProcessSuspense( node: ComponentNode, context: SSRTransformContext ) { // complete wip slots with ssr code const wipEntry = wipMap.get(node) Iif (!wipEntry) { return } const { slotsExp, wipSlots } = wipEntry for (let i = 0; i < wipSlots.length; i++) { const { fn, children } = wipSlots[i] fn.body = processChildrenAsStatement(children, context) } // _push(ssrRenderSuspense(slots)) context.pushStatement( createCallExpression(context.helper(SSR_RENDER_SUSPENSE), [ `_push`, slotsExp ]) ) } |