@@ -91,15 +91,15 @@ export function createBuffer() {
91
91
export function renderComponentVNode (
92
92
vnode : VNode ,
93
93
parentComponent : ComponentInternalInstance | null = null ,
94
- parentSuspense : any ,
94
+ suspense : ssrSuspenseBoundary | null = null ,
95
95
slotScopeId ?: string
96
96
) : SSRBuffer | Promise < SSRBuffer > {
97
97
const instance = createComponentInstance ( vnode , parentComponent , null )
98
98
const res = setupComponent ( instance , true /* isSSR */ )
99
99
const hasAsyncSetup = isPromise ( res )
100
100
const prefetches = instance . sp /* LifecycleHooks.SERVER_PREFETCH */
101
101
if ( hasAsyncSetup || prefetches ) {
102
- parentSuspense && parentSuspense . deps ++
102
+ suspense && suspense . deps ++
103
103
let p : Promise < unknown > = hasAsyncSetup
104
104
? ( res as Promise < void > )
105
105
: Promise . resolve ( )
@@ -113,27 +113,32 @@ export function renderComponentVNode(
113
113
}
114
114
115
115
return p . then ( ( ) => {
116
- const subtree = renderComponentSubTree (
117
- instance ,
118
- parentSuspense ,
119
- slotScopeId
120
- )
121
- if ( __FEATURE_SUSPENSE__ && parentSuspense ) {
122
- parentSuspense . deps --
123
- if ( parentSuspense . deps === 0 ) {
124
- parentSuspense . resolve ( parentSuspense . vnode )
116
+ const subtree = renderComponentSubTree ( instance , suspense , slotScopeId )
117
+ if ( __FEATURE_SUSPENSE__ && suspense ) {
118
+ // resolve suspense
119
+ suspense . deps --
120
+ if ( suspense . deps <= 0 ) {
121
+ suspense . resolve ( suspense . vnode )
122
+ }
123
+
124
+ // resolve parent suspense
125
+ if ( suspense . parentSuspense ) {
126
+ suspense . parentSuspense . deps --
127
+ if ( suspense . deps <= 0 ) {
128
+ suspense . parentSuspense . resolve ( suspense . parentSuspense . vnode )
129
+ }
125
130
}
126
131
}
127
132
return subtree
128
133
} )
129
134
} else {
130
- return renderComponentSubTree ( instance , parentSuspense , slotScopeId )
135
+ return renderComponentSubTree ( instance , suspense , slotScopeId )
131
136
}
132
137
}
133
138
134
139
function renderComponentSubTree (
135
140
instance : ComponentInternalInstance ,
136
- parentSuspense : any ,
141
+ parentSuspense : ssrSuspenseBoundary | null ,
137
142
slotScopeId ?: string
138
143
) : SSRBuffer | Promise < SSRBuffer > {
139
144
const comp = instance . type as Component
@@ -226,6 +231,7 @@ function renderComponentSubTree(
226
231
push ,
227
232
( instance . subTree = renderComponentRoot ( instance ) ) ,
228
233
instance ,
234
+ parentSuspense ,
229
235
slotScopeId
230
236
)
231
237
} else {
@@ -241,7 +247,7 @@ export function renderVNode(
241
247
push : PushFn ,
242
248
vnode : VNode ,
243
249
parentComponent : ComponentInternalInstance ,
244
- parentSuspense : any ,
250
+ parentSuspense : ssrSuspenseBoundary | null = null ,
245
251
slotScopeId ?: string
246
252
) {
247
253
const { type, shapeFlag, children } = vnode
@@ -305,27 +311,24 @@ export function renderVNode(
305
311
) as ssrSuspenseBoundary
306
312
}
307
313
308
- // nested ???
309
- // if (parentSuspense) {
310
- // parentSuspense.deps++
311
- // }
314
+ // nested suspense
315
+ if ( parentSuspense ) {
316
+ parentSuspense . deps ++
317
+ ; ( vnode . suspense as ssrSuspenseBoundary ) . parentSuspense =
318
+ parentSuspense
319
+ }
312
320
renderVNode (
313
321
push ,
314
322
vnode . ssContent ! ,
315
323
parentComponent ,
316
- vnode . suspense ,
324
+ vnode . suspense as ssrSuspenseBoundary ,
317
325
slotScopeId
318
326
)
319
327
320
328
// sync
321
329
if ( vnode . suspense && vnode . suspense . deps ! <= 0 ) {
322
330
; ( vnode . suspense as ssrSuspenseBoundary ) . resolve ( vnode )
323
331
}
324
-
325
- // nested ???
326
- // if (parentSuspense) {
327
- // parentSuspense.deps--
328
- // }
329
332
} else {
330
333
warn (
331
334
'[@vue/server-renderer] Invalid VNode type:' ,
@@ -340,7 +343,7 @@ export function renderVNodeChildren(
340
343
push : PushFn ,
341
344
children : VNodeArrayChildren ,
342
345
parentComponent : ComponentInternalInstance ,
343
- parentSuspense : any ,
346
+ parentSuspense : ssrSuspenseBoundary | null ,
344
347
slotScopeId : string | undefined
345
348
) {
346
349
for ( let i = 0 ; i < children . length ; i ++ ) {
@@ -358,7 +361,7 @@ function renderElementVNode(
358
361
push : PushFn ,
359
362
vnode : VNode ,
360
363
parentComponent : ComponentInternalInstance ,
361
- parentSuspense : any ,
364
+ parentSuspense : ssrSuspenseBoundary | null ,
362
365
slotScopeId : string | undefined
363
366
) {
364
367
const tag = vnode . type as string
@@ -445,7 +448,7 @@ function renderTeleportVNode(
445
448
push : PushFn ,
446
449
vnode : VNode ,
447
450
parentComponent : ComponentInternalInstance ,
448
- parentSuspense : any ,
451
+ parentSuspense : ssrSuspenseBoundary | null ,
449
452
slotScopeId : string | undefined
450
453
) {
451
454
const target = vnode . props && vnode . props . to
0 commit comments