vue 內部運行機制

閱讀 剖析 Vue.js 內部運行機制,自己做點小筆記,方便自己可以隨時翻看,大家喜歡這篇文章,也可以去點擊看原作哦~

初始化及掛載

image.png

看圖可知,new Vue() 后,會調用 _init 函數來初始化,這個過程,包括生命周期、data、props、methods、事件、computed、watch等。其中,Object.defineProperty 設置 setter 、getter 函數,用來實現「響應式」以及「依賴收集」。

初始化后調用 $mount 掛載組件,如果是運行時編譯,即不存在 render function但是存在 template 的情況,需要進行「編譯」步驟。

編譯

compile 編譯可以分成 parse、optimize 與 generate 三個階段,最終需要得到 render function


image.png

響應式

image.png

當 render function 被渲染的時候,因為會讀取所需對象的值,所以會觸發(fā) getter 函數進行「依賴收集」,「依賴收集」的目的是將觀察者 Watcher 對象存放到當前閉包中的訂閱者 Dep 的 subs 中。形成如下所示的這樣一個關系


image.png

在修改對象的值的時候,會觸發(fā)對應的 setter, setter 通知之前「依賴收集」得到的 Dep 中的每一個 Watcher,告訴它們自己的值改變了,需要重新渲染視圖。這時候這些 Watcher 就會開始調用 update 來更新視圖

Virtual DOM

render function 會被轉化成 VNode 節(jié)點。Virtual DOM 其實就是一棵以 JavaScript 對象(VNode節(jié)點)作為基礎的樹,用對象屬性來描述節(jié)點,實際上它是一層對真實 DOM的抽象。最終可以通過一系列操作使這棵樹映射到真實環(huán)境上。由于 Virtual DOM 是以 JavaScript 對象為基礎而不依賴真實平臺環(huán)境,所以使它具有了跨平臺的能力,比如說瀏覽器平臺、Weex、Node 等。
比如說:

{
    tag: 'div',                 /*說明這是一個div標簽*/
    children: [                 /*存放該標簽的子節(jié)點*/
        {
            tag: 'button',           /*說明這是一個a標簽*/
            text: 'click me'    /*標簽的內容*/
        }
    ]
}

渲染后:

<div>
    <button>click me</button>
</div>

這只是一個簡單的例子,實際上的節(jié)點有更多的屬性來標志節(jié)點,比如 isStatic (代表是否為靜態(tài)節(jié)點)、 isComment (代表是否為注釋節(jié)點)等

更新視圖

image.png

前面說到,修改一個對象值的時候,通過 setter -> Watcher -> update 的過程來修改對應的視圖,那么,最終如何更新到視圖呢?

當數據變化時,執(zhí)行 render function 可以得到一個新的 VNode 節(jié)點,如果想得到新的視圖,簡單的方法就是直接解析 VNode 節(jié)點,用 innerHTML 全部渲染到真實的 DOM 中。但是,如果只對其中一小部分進行修改,哪咋辦?

那么,這時候就需要用的 「patch」了。會將新的 VNode 與舊的 VNode 一起傳入 patch 進行比較,然后 diff 算法得到差異。最后將差異的地方進行渲染即可

講到這里,我們在一起看看全部的流程圖


image.png
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容

  • 1,vue的運行機制 在 new Vue() 之后。 Vue 會調用 init 函數進行初始化,其中最重要的是通過...
    李歡li閱讀 3,263評論 0 4
  • 用vue開發(fā)也有段時間了,簡直是愛死了vue這個輕量級的前端框架,代碼模塊化和數據雙向綁定讓我們很輕易能夠編寫出高...
    feXiaojin閱讀 9,075評論 0 5
  • 寫在前面 這篇文章算是對最近寫的一系列Vue.js源碼的文章(https://github.com/answers...
    染陌同學閱讀 2,166評論 0 14
  • 1.vue data屬性里面的getter和setter data的每個屬性都有兩個相對應的get和set屬性。 ...
    GXW_Lyon閱讀 687評論 0 0
  • 前幾天想學學Vue中怎么編寫可復用的組件,提到要對Vue的render函數有所了解。可仔細一想,對于Vue的ren...
    kangaroo_v閱讀 116,092評論 13 171