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 92 93 94 95 96 97 98 | 11x 11x 11x 43x 43x 43x 11x 45x 45x 36x 36x 47x 36x 36x 3x 33x 33x 2x 31x 41x 22x 22x 33x 9x 3x 24x 32x 9x 3x 11x 11x 41x 21x 4x | import { ComponentInternalInstance, Slots } from 'vue' import { Props, PushFn, renderVNodeChildren, SSRBufferItem } from '../render' import { isArray } from '@vue/shared' export type SSRSlots = Record<string, SSRSlot> export type SSRSlot = ( props: Props, push: PushFn, parentComponent: ComponentInternalInstance | null, scopeId: string | null ) => void export function ssrRenderSlot( slots: Slots | SSRSlots, slotName: string, slotProps: Props, fallbackRenderFn: (() => void) | null, push: PushFn, parentComponent: ComponentInternalInstance, slotScopeId?: string ) { // template-compiled slots are always rendered as fragments push(`<!--[-->`) ssrRenderSlotInner( slots, slotName, slotProps, fallbackRenderFn, push, parentComponent, slotScopeId ) push(`<!--]-->`) } export function ssrRenderSlotInner( slots: Slots | SSRSlots, slotName: string, slotProps: Props, fallbackRenderFn: (() => void) | null, push: PushFn, parentComponent: ComponentInternalInstance, slotScopeId?: string, transition?: boolean ) { const slotFn = slots[slotName] if (slotFn) { const slotBuffer: SSRBufferItem[] = [] const bufferedPush = (item: SSRBufferItem) => { slotBuffer.push(item) } const ret = slotFn( slotProps, bufferedPush, parentComponent, slotScopeId ? ' ' + slotScopeId : '' ) if (isArray(ret)) { // normal slot renderVNodeChildren(push, ret, parentComponent, slotScopeId) } else { // ssr slot. // check if the slot renders all comments, in which case use the fallback let isEmptySlot = true if (transition) { isEmptySlot = false } else { for (let i = 0; i < slotBuffer.length; i++) { if (!isComment(slotBuffer[i])) { isEmptySlot = false break } } } if (isEmptySlot) { if (fallbackRenderFn) { fallbackRenderFn() } } else { for (let i = 0; i < slotBuffer.length; i++) { push(slotBuffer[i]) } } } } else if (fallbackRenderFn) { fallbackRenderFn() } } const commentTestRE = /^<!--.*-->$/s const commentRE = /<!--[^]*?-->/gm function isComment(item: SSRBufferItem) { if (typeof item !== 'string' || !commentTestRE.test(item)) return false // if item is '<!---->' or '<!--[-->' or '<!--]-->', return true directly if (item.length <= 8) return true return !item.replace(commentRE, '').trim() } |