Vue Router原始碼分析之install方法

2021-09-11 13:52:10 字數 2375 閱讀 9965

系列文章:

vue-router 原始碼學習之我們從api中看些門道

vue-router原始碼分析之index.js

vue-router原始碼分析之install方法

使用過vue的coder都知道,如果想註冊乙個vue的外掛程式,在vue物件上能夠使用的話(並不是綁在vue.prototype上的那種暴力方式),必須使用vue.use(你的外掛程式)的方式來註冊外掛程式,

vue.use方法會尋找外掛程式上的install方法,並且執行,如果外掛程式沒有install方法的話,就會報錯,無法使用use來註冊外掛程式。 哦喲,是真的傲嬌的一匹,所以想要使用vuerouter外掛程式的話,就必須擁有乙個install方法,

所以我們來看看vuerouter的install方法都做了什麼?

**實在是不少,我是真的沒辦法一口氣複製過來,截個圖先給大家做乙個展示吧

簡單看來: vue.mixin:侵入式的對每個vue component進行了擴充套件

用es5的defineproperty的方式設定$router$route屬性。

建立了routerview 與routerlink兩個元件

對路由鉤子進行乙個統一設定(這塊沒看vue.config.optionmergestrategies)的原始碼,目前還不是很熟,當然這不重要了。先往下看

大家都知道,vue.mixin、vue.component都是vue類的方法,vue-router想要使用的話就必須引入vue,這是毋庸置疑的,但是如果把vue打包進入vue-router的原始碼內,這必然導致vue-router的包變得很大,

關鍵問題!!! 目前沒有發現用vue開發時哪個使用vue-router開發不提前引入vue的。

// 宣告乙個私有的_vue用來接收外部的vue類。

export

let _vue

//install方法接收乙個引數,也就是vue類

export

function

install (vue)

}複製**

說到這裡可能會很亂,我們先留下來這個內容,一會去看看**會呼叫它。

vue.mixin( else 

registerinstance(this, this)

},destroyed ()

})複製**

看到這裡我們應該了解,vue-router在install的時候侵入了每個vue componet的beforecreate以及destroyed生命週期鉤子中,在建立之前以及摧毀的時候做一些事情。 做了什麼呢? 我們好像看到了registerinstance方法。

// 接受了vue componet自己

registerinstance(this, this)

複製**

這個時候重新看一下這個方法,意思就是尋找這個方法去呼叫一下,this.$options._parentvnode.data.registerrouteinstance(這個方法誰有呢?) 這個我也不知道,我就寫在乙個子元件內的方法,去檢視一下它的父元件們族譜中誰有這個方法。

(function(t)else

}return

'not find'

})(t)

複製**

各位看官這是乙個很拙劣的方法(勿學)以後會優化這個方法的。 然後發現這個this是誰呢?就是在你使用vue-router時,那個我們對每個元件設定path的那個元件。可以看下面

new vuerouter(]

})複製**

每個有這個方法的應該都是這裡面設定過的元件,所有我就有乙個猜測,是不是路由的改變會導致該路徑跳轉前後的元件進行生成與摧毀(展示與隱藏)在這些元件建立之前會呼叫registerinstance方法(這個方法我還沒看內部實現)。以後會去驗證這個猜測的準確程度。

//所以所有的vue component的_routerroot、_router、都是一樣的。

// this.$options.router存在嗎?==》 是不是已經繫結萬_routerroot的根節點

if (isdef(this.$options.router)) else

registerinstance(this, this)

複製**

所以大家可以嘗試的在vue專案中列印出元件本身,檢視_routerroot屬性時,每個元件的uid都是一樣的,$el也是根節點標籤的id 。這不實錘了!!

我們可以看出來在vuerouter在註冊方面有哪些重要的事?

install方法就介紹到這裡,下一節會開始講述vue-router的主建構函式。前端er,下一期不見不散

1 關於vue router的原始碼分析

1 vue router 例項化時會初始化 this.history,不同mode對應不同的history constructor options routeroptions 2 這裡以hashhistory為例,vue router1的push方法實現如下 push location rawloc...

vue router原始碼解讀

vue router是vue全家桶中的一員。當初學習的時候,因為內容比較簡單,只是匆匆瀏覽了一下文件就開始對照api幹活了,對history mode的實現也僅僅是知道用到了h5的history的方法。這次其實是為了看看vue router是怎麼用roll up打包的,但下下來之後發現 量很少,說白...

vue router原始碼隨筆

外掛程式執行入口 if inbrowser window.vue 外掛程式給vue物件例項暴露了兩個屬性 object.defineproperty vue.prototype,router this.routerroot在beforecreate中定義。object.defineproperty ...