@@ -20,6 +20,9 @@ import { registerRef } from './modules/ref'
2020
2121export const emptyNode = new VNode ( '' , { } , [ ] )
2222
23+ // used for delaying component mounting for "progressive boot"
24+ const hasRIC = typeof requestIdleCallback !== 'undefined'
25+
2326const hooks = [ 'create' , 'activate' , 'update' , 'remove' , 'destroy' ]
2427
2528function isUndef ( s ) {
@@ -87,7 +90,14 @@ export function createPatchFunction (backend) {
8790 let inPre = 0
8891 function createElm ( vnode , insertedVnodeQueue , parentElm , refElm , nested ) {
8992 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+ }
91101 return
92102 }
93103
@@ -158,23 +168,11 @@ export function createPatchFunction (backend) {
158168 }
159169
160170 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 )
178176 }
179177 }
180178
@@ -481,13 +479,16 @@ export function createPatchFunction (backend) {
481479 }
482480 vnode . elm = elm
483481 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 )
490490 }
491+ return true
491492 }
492493 if ( isDef ( tag ) ) {
493494 if ( isDef ( children ) ) {
@@ -530,6 +531,11 @@ export function createPatchFunction (backend) {
530531 return true
531532 }
532533
534+ function hydrateComponent ( vnode , insertedVnodeQueue ) {
535+ vnode . data . hook . init ( vnode , true /* hydrating */ )
536+ initComponent ( vnode , insertedVnodeQueue )
537+ }
538+
533539 function assertNodeMatch ( node , vnode ) {
534540 if ( vnode . tag ) {
535541 return (
0 commit comments