vue原始碼閱讀(二)

2022-07-06 14:48:11 字數 1350 閱讀 8254

那麼下邊這個則是例項化建構函式,也就是開始使用了,不管是作為框架,還是作為外掛程式,都需要new一下。

翻篇回去,先看vue的建構函式,this._init(options)是呼叫的第乙個方法,包括傳進來的引數options,不過在這之前,還判斷了下呼叫vue的是不是先new出來的。

根據注入的檔案 找到了 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原始碼閱讀(一)

之前想要研究下vue的原始碼 網上一般直接就上來甩出雙向繫結等等的函式 這次看原始碼 想從乙個漸進式的方向來解讀。當前版本基本上是最新的版本,18年6月的最新版,版本號是2.5.17 當我們接觸乙個專案或者乙個框架 在沒有交接文件的情況下 首先第一印象是啥?肯定是目錄 通過查資料和看 基本確定了這些...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

Webpack 原始碼(二) 如何閱讀原始碼

如果想要了解 webpack 的流程,只要閱讀 七珏 細說 webpack 之流程篇 所述的內容就夠了,講解地比較全面了 本文就不對 webpack 流程再做重複的描述,而是從另外乙個角度補充分析 webpack 原始碼 webpack 中最為重要的無非是 compiler compilation ...