@@ -20,6 +20,9 @@ import { registerRef } from './modules/ref'
20
20
21
21
export const emptyNode = new VNode ( '' , { } , [ ] )
22
22
23
+ // used for delaying component mounting for "progressive boot"
24
+ const hasRIC = typeof requestIdleCallback !== 'undefined'
25
+
23
26
const hooks = [ 'create' , 'activate' , 'update' , 'remove' , 'destroy' ]
24
27
25
28
function isUndef ( s ) {
@@ -87,7 +90,14 @@ export function createPatchFunction (backend) {
87
90
let inPre = 0
88
91
function createElm ( vnode , insertedVnodeQueue , parentElm , refElm , nested ) {
89
92
vnode . isRootInsert = ! nested // for transition enter check
90
- if ( createComponent ( vnode , insertedVnodeQueue , parentElm , refElm ) ) {
93
+ if ( isDef ( vnode . componentOptions ) ) {
94
+ if ( hasRIC && vnode . componentOptions . Ctor . options . bootAsync ) {
95
+ requestIdleCallback ( ( ) => {
96
+ createComponent ( vnode , insertedVnodeQueue , parentElm , refElm )
97
+ } )
98
+ } else {
99
+ createComponent ( vnode , insertedVnodeQueue , parentElm , refElm )
100
+ }
91
101
return
92
102
}
93
103
@@ -158,23 +168,11 @@ export function createPatchFunction (backend) {
158
168
}
159
169
160
170
function createComponent ( vnode , insertedVnodeQueue , parentElm , refElm ) {
161
- let i = vnode . data
162
- if ( isDef ( i ) ) {
163
- const isReactivated = isDef ( vnode . child ) && i . keepAlive
164
- if ( isDef ( i = i . hook ) && isDef ( i = i . init ) ) {
165
- i ( vnode , false /* hydrating */ , parentElm , refElm )
166
- }
167
- // after calling the init hook, if the vnode is a child component
168
- // it should've created a child instance and mounted it. the child
169
- // component also has set the placeholder vnode's elm.
170
- // in that case we can just return the element and be done.
171
- if ( isDef ( vnode . child ) ) {
172
- initComponent ( vnode , insertedVnodeQueue )
173
- if ( isReactivated ) {
174
- reactivateComponent ( vnode , insertedVnodeQueue , parentElm , refElm )
175
- }
176
- return true
177
- }
171
+ const isReactivated = isDef ( vnode . child ) && vnode . data . keepAlive
172
+ vnode . data . hook . init ( vnode , false /* hydrating */ , parentElm , refElm )
173
+ initComponent ( vnode , insertedVnodeQueue )
174
+ if ( isReactivated ) {
175
+ reactivateComponent ( vnode , insertedVnodeQueue , parentElm , refElm )
178
176
}
179
177
}
180
178
@@ -481,13 +479,16 @@ export function createPatchFunction (backend) {
481
479
}
482
480
vnode . elm = elm
483
481
const { tag, data, children } = vnode
484
- if ( isDef ( data ) ) {
485
- if ( isDef ( i = data . hook ) && isDef ( i = i . init ) ) i ( vnode , true /* hydrating */ )
486
- if ( isDef ( i = vnode . child ) ) {
487
- // child component. it should have hydrated its own tree.
488
- initComponent ( vnode , insertedVnodeQueue )
489
- return true
482
+ if ( isDef ( vnode . componentOptions ) ) {
483
+ // child component. it should have hydrated its own tree.
484
+ if ( hasRIC && vnode . componentOptions . Ctor . options . bootAsync ) {
485
+ requestIdleCallback ( ( ) => {
486
+ hydrateComponent ( vnode , insertedVnodeQueue )
487
+ } )
488
+ } else {
489
+ hydrateComponent ( vnode , insertedVnodeQueue )
490
490
}
491
+ return true
491
492
}
492
493
if ( isDef ( tag ) ) {
493
494
if ( isDef ( children ) ) {
@@ -530,6 +531,11 @@ export function createPatchFunction (backend) {
530
531
return true
531
532
}
532
533
534
+ function hydrateComponent ( vnode , insertedVnodeQueue ) {
535
+ vnode . data . hook . init ( vnode , true /* hydrating */ )
536
+ initComponent ( vnode , insertedVnodeQueue )
537
+ }
538
+
533
539
function assertNodeMatch ( node , vnode ) {
534
540
if ( vnode . tag ) {
535
541
return (
0 commit comments