1. 程式人生 > >vue源碼閱讀(二)

vue源碼閱讀(二)

new wiki eth 工具 download 分配 避免 其中 aid

一 一個實例

如果簡單了解過些Vue的API的話,肯定會對一下這個特別熟悉,在上一篇裏,分析了Vue的核心文件core的index.js構造vue函數執行的流程。

那麽下邊這個則是實例化構造函數,也就是開始使用了,不管是作為框架,還是作為插件,都需要new一下。

技術分享圖片

千呼萬喚,我們把它請出來之後,發現點不同的東西,router、filter、store暫時先不表,但是這個#app是個啥東西?

翻篇回去,先看Vue的構造函數,this._init(options)是調用的第一個方法,包括傳進來的參數options,不過在這之前,還判斷了下調用Vue的是不是先new出來的。

技術分享圖片

二 從init方法到Vue初始化做的第一件事

根據註入的文件 找到了 init方法的文件技術分享圖片,它是在core/instance/init.js

完整的方法如下

技術分享圖片

一開始是定義了兩個屬性 _uid 和_isVue

其中_uid是當前實例的唯一id,而且是遞增的實例id 保證不會重復,一般會自動分配,不建議操作,當然如果需要操作的話,可以手動分配

_isVue設置為true,避免監聽對象時自身被監聽

然後是判斷是否定義_isComponent(),這裏查了下註釋和代碼,is_Component = true是指內部的組件實例,而initInternalCompoent()函數是作者對組件內部實例化的優化,

一般我們寫的代碼都會走else的分支,也就是mergeOptions() 這個方法。

技術分享圖片

接下來就遇到了第一個比較重要的點,理解mergeOptions這個方法,他定義在工具類的options這個js文件夾下。

首先想到的是為什麽要進行策略對象的合並,而且是init的第一步,簡單的說,Vue在處理選項的時候,使用了這個策略對象把父子選項進行合並,並將最終的值賦值給實例下

的$options,更直白的說就是把vue實例上原有的屬性和傳入的option以及繼承和構造的所有屬性進行遞歸式的合並,確保一個vue實例是有一個$options.

先說下這個options,當我們new一個vue的實例時,可以傳一些數據,比如上面new的函數那樣,從前邊看,vue的實例在實例化後會加載很多其他的東西,例如生命周期鉤子、render函數等等。

而手動傳入的這個對象,就叫做options,也是上面vm.$options中傳入的第二個參數,關於vm.$options,是一個貫穿整個源碼的屬性,可以單獨拆出來講,但是為了文章的完整性,先簡單說一下,不然後邊的這個合並策略對象就會雲裏霧裏。

這是mergeOptions()執行的流程

技術分享圖片

技術分享圖片

這函數涉及到了很多復雜的合並策略,包括鉤子函數、props、methods、inject\computed、directives、filter、data,為了輕松的走完整個流程,這裏不展開

更具體的流程如下:

技術分享圖片

三 一個嵌套的三元表達式

看這些復雜的合並代碼有點腦殼疼,作者還特別秀的寫了個嵌套的三元表達式,他長這樣。

技術分享圖片

總結一下Vue的初始化:Vue的初始化主要就幹了這麽幾件事:合並配置、初始化生命周期、初始化事件和渲染邏輯、初始化data做數據劫持,這種把不同的功能和邏輯部分

拆分成一個個單獨的模塊,使得Vue的核心加載過程一目了然,這種編程思想是十分值得借鑒的。

vue源碼閱讀(二)