import VueRouter 實際上導(dǎo)出的是VueRouter類哺徊,并將install作為公共靜態(tài)方法掛載,這將在執(zhí)行Vue.use時被執(zhí)行并傳入Vue
install函數(shù)如下
框紅一的位置,用來避免可能存在的多次install函數(shù)調(diào)用,因為保持在函數(shù)上的屬性installed和全局的_Vue在當(dāng)前作用域是永久性的
框紅二的位置,定義isDef函數(shù)判斷一個值是否存在;定義registerInstance函數(shù)崇棠,這將向vue組件實例上注冊路由
框紅三的位置,調(diào)用Vue的mixin方法向全局混入鉤子函數(shù)蔽午,那么在每個組件中都會被執(zhí)行一次易茬,那么當(dāng)組件被創(chuàng)建過程中,將會調(diào)用callHook函數(shù)執(zhí)行到beforeCreate
? ??????對于根組件及老,我們一般會將路由配置作為router屬性掛載抽莱,那么在根組件的創(chuàng)建過程中就將路由配置對象添加到當(dāng)前的vue實例中,并且使_routerRoot持有根路由骄恶,那么在子組件中執(zhí)行到beforeCreate時食铐,將進入else邏輯從_routerRoot中獲取,這保證了每一個組件中都能拿到路由
? ??????執(zhí)行init函數(shù)僧鲁,這在之后作具體分析
? ??????執(zhí)行Vue.util.defineReactive對_route進行觀測虐呻,這在之后作具體分析
框紅四的位置,將路由設(shè)置為響應(yīng)式對象寞秃,以便我們可以在組件中拿到路由配置對象斟叼。盡管我們一般不會這樣去做
框紅五的位置,定義全局組件春寿,這樣我們就可以在任意組件內(nèi)使用路由標(biāo)簽控制跳轉(zhuǎn)或路由視圖組合布局
最后定義一些合并策略
故朗涩,可得出兩點總結(jié):對于Vue插件一般通過install方法向Vue混入一些能力;VueRouter的初始化是在組件的beforeCreated生命周期函數(shù)中進行的