亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【Vue源碼探究二】從 $mount 講起,一起探究Vue的渲染機(jī)制

LeanCloud / 1884人閱讀

摘要:的構(gòu)造函數(shù)將自動運(yùn)行啟動函數(shù)。我在閱讀源碼的過程中,發(fā)現(xiàn)源碼余行,而和模板編譯相關(guān)的代碼,則約有行左右。這個是創(chuàng)建的方法,作為第一個參數(shù)傳入。最后會返回一個節(jié)點(diǎn)。這個時候?qū)①x值為這個節(jié)點(diǎn),掛載完成

mount, 意思為掛載。可以理解為將vue實(shí)例(邏輯應(yīng)用),掛靠在某個dom元素(載體)上的一個過程。

一、創(chuàng)建Vue實(shí)例時的渲染過程

上一篇文章我們講到, 在創(chuàng)建一個vue實(shí)例的時候(var vm = new Vue(options))。Vue的構(gòu)造函數(shù)將自動運(yùn)行 this._init(啟動函數(shù))。啟動函數(shù)的最后一步為initRender(vm),

// Vue.prototype._init
    ...
    initLifecycle(vm);
    initEvents(vm);
    callHook(vm, "beforeCreate");
    initState(vm);
    callHook(vm, "created");
    initRender(vm);

initRender中調(diào)用vm.$mount(vm.$options.el),將實(shí)例掛載到dom上,至此啟動函數(shù)完成。

//initRender
  ...
  if (vm.$options.el) {
    vm.$mount(vm.$options.el);
  }

可以看出,vm.$mount為vue渲染的主要函數(shù)

二、Vue的渲染機(jī)制

上圖,展示的是獨(dú)立構(gòu)建時的一個渲染流程圖

模板字符串

//模板字符串
{{message}}

render函數(shù)

//render函數(shù)
function anonymous() {
with(this){return _h("div",{attrs:{"id":"app"}},["
  "+_s(message)+"
"])}
}

vnode

真實(shí)dom節(jié)點(diǎn)($el)

獨(dú)立構(gòu)建 與 運(yùn)行時構(gòu)建

我們先看一下官方文檔 獨(dú)立構(gòu)建和運(yùn)行時構(gòu)建

這兩個概念,我在初學(xué)的時候是一頭霧水。現(xiàn)在對照著渲染的流程圖,我們可以知道

獨(dú)立構(gòu)建:包含模板編譯器
渲染過程: html字符串 → render函數(shù) → vnode → 真實(shí)dom節(jié)點(diǎn)

運(yùn)行時構(gòu)建: 不包含模板編譯器
渲染過程: render函數(shù) → vnode → 真實(shí)dom節(jié)點(diǎn)

運(yùn)行時構(gòu)建通過砍掉模板編譯器,讓整個包少了30%(官方數(shù)據(jù))。我在閱讀源碼的過程中,發(fā)現(xiàn)vue源碼7000余行,而和模板編譯相關(guān)的代碼,則約有1000行左右??雌饋泶_實(shí)是輕便了。這是在鼓勵我們多用render函數(shù)嗎?

三、$mount函數(shù)

上面我們說到,運(yùn)行時構(gòu)建的包,會比獨(dú)立構(gòu)建少一個模板編譯器。在$mount函數(shù)上也不同

運(yùn)行時構(gòu)建的 $mount函數(shù)

而獨(dú)立構(gòu)建的 $mount函數(shù),會先用一個臨時變量mount保存上面的$mount方法

var mount = Vue$2.prototype.$mount;  //此處mount即為運(yùn)行時版的 $mount

然后重寫$mount函數(shù),這時,調(diào)用$mount就會包括模板編譯功能了

var mount = Vue$2.prototype.$mount;
Vue$2.prototype.$mount = function (el, hydrating) {
  ...省略代碼(里面為模板編譯器入口)...
  return mount.call(this, el, hydrating)
};

我們可以看到,不管獨(dú)立構(gòu)建還是運(yùn)行時構(gòu)建,都會調(diào)用 vm._mount方法我們來看看源碼

Vue.prototype._mount = function(el, hydrating) {
    ...一些防止運(yùn)行時的包,卻用了template的報(bào)錯代碼...


    callHook(vm, "beforeMount");

    vm._watcher = new Watcher(vm, function () {
      vm._update(vm._render(), hydrating);
    }, noop);
    
    hydrating = false;

    if (vm.$vnode == null) {
      vm._isMounted = true;
      callHook(vm, "mounted");
    }
    return vm    
    
}

使用過的vue的人,都會很敏銳地發(fā)現(xiàn), 在調(diào)用beforeMount生命周期,和mounted生命周期中間的關(guān)鍵代碼為

鑒于大牛已經(jīng)講過很多次這里的數(shù)據(jù)監(jiān)聽了,我們只講其中渲染部分

vm._update(vm._render(), hydrating);

vm._render函數(shù)返回一個vnode作為 vm._update的參數(shù)。 hydrating是與服務(wù)器渲染(SSR)相關(guān)的,瀏覽器端可以不用管。

vm._render (將render函數(shù)轉(zhuǎn)化成vnode)

最核心代碼為

var render = vm.$options.render
try{
  vnode = render.call(vm._renderProxy, vm.$createElement);
}catch{
  ...
}

此處,使用call方法, 將this指向 vm.renderProxy js功底差的同學(xué)要去補(bǔ)補(bǔ)知識了。
vm.renderProxy是個代理,代理vm,主要用來報(bào)錯,如果render函數(shù)上使用了vm上沒有的屬性或方法,就會報(bào)錯。
vm.$createElement 這個是創(chuàng)建vnode的方法,作為第一個參數(shù)傳入。

render函數(shù)
這里的h即是, vm.$createElement ,便是在vm._render這個階段被傳入。

vm._update (將vnode生成真實(shí)dom節(jié)點(diǎn))

最關(guān)鍵一句話為

 vm.$el = vm.__patch__(prevVnode, vnode);

vm.__patch__也是個大家伙,我之后會再去研究。
里面的方法,將新舊vnode使用 diff算法進(jìn)行比對,找出要替換的地方,這樣更新dom的性能會有較大優(yōu)化。
最后會返回一個dom節(jié)點(diǎn)。
這個時候?qū)m.$el 賦值為這個dom節(jié)點(diǎn),掛載完成!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/83077.html

相關(guān)文章

  • Vue源碼探究一】當(dāng)我們引入Vue,我們引入了什么?

    摘要:源碼版本構(gòu)造器實(shí)例選項(xiàng)讓我們用一段展示一下這三個概念其中的構(gòu)造器實(shí)例實(shí)例名可以任意取,這里我們便于理解保持和文檔一致選項(xiàng)即為傳入構(gòu)造器里的配置選項(xiàng)。其實(shí)構(gòu)造器上也綁了不少好用的方法。 源碼版本:2.0.5 構(gòu)造器、實(shí)例、選項(xiàng) 讓我們用一段demo展示一下這三個概念: //HTML {{ message }} //JS var vm = new Vue({ el: #app,...

    mengbo 評論0 收藏0
  • vue源碼分析系列之響應(yīng)式數(shù)據(jù)(一)

    摘要:代碼初始化部分一個的時候做了什么當(dāng)我們一個時,實(shí)際上執(zhí)行了的構(gòu)造函數(shù),這個構(gòu)造函數(shù)內(nèi)部掛載了很多方法,可以在我的上一篇文章中看到。合并構(gòu)造函數(shù)上掛載的與當(dāng)前傳入的非生產(chǎn)環(huán)境,包裝實(shí)例本身,在后期渲染時候,做一些校驗(yàn)提示輸出。 概述 在使用vue的時候,data,computed,watch是一些經(jīng)常用到的概念,那么他們是怎么實(shí)現(xiàn)的呢,讓我們從一個小demo開始分析一下它的流程。 dem...

    liujs 評論0 收藏0
  • Vue中父子組件生命周期執(zhí)行順序初探

    摘要:結(jié)論父子組件生命周期鉤子的執(zhí)行順序遵循從外到內(nèi),然后再從內(nèi)到外,不管嵌套幾層深,也遵循這個規(guī)律。組件化的設(shè)計(jì)思路大抵相同,中父子組件生命周期鉤子執(zhí)行順序,具體沒做探究,但是值得一提的是父組件的也是晚于子組件執(zhí)行的。 如今前端框架都流行組件化,頁面元素都可以使用組件進(jìn)行高度概括,那么處理組件之間的關(guān)系就如同處理頁面架構(gòu)一樣重要。正確理解組件之間的關(guān)系,才能讓代碼按照我們與預(yù)料方式工作。最...

    Yumenokanata 評論0 收藏0
  • 用WEB技術(shù)棧開發(fā)NATIVE應(yīng)用():WEEX 前端SDK原理詳解

    摘要:依舊采取傳統(tǒng)的開發(fā)技術(shù)棧進(jìn)行開發(fā),同時在終端的運(yùn)行體驗(yàn)不輸。首先來看下前端開發(fā)框架目前與構(gòu)成了三大最流行的前端開發(fā)框架,具有組件化以及三大特性,還學(xué)習(xí)的,引入了狀態(tài)管理模塊。 摘要: WEEX依舊采取傳統(tǒng)的web開發(fā)技術(shù)棧進(jìn)行開發(fā),同時app在終端的運(yùn)行體驗(yàn)不輸native app。其同時解決了開發(fā)效率、發(fā)版速度以及用戶體驗(yàn)三個核心問題。那么WEEX是如何實(shí)現(xiàn)的?目前WEEX已經(jīng)完全開...

    ls0609 評論0 收藏0
  • vue生命周期解析并通過表單理解MVVM(不僅理論,圖文并茂)

    摘要:在前端頁面中,把用純對象表示,負(fù)責(zé)顯示,兩者做到了最大限度的分離。的顯示與否和的布爾值有關(guān),還是只關(guān)注數(shù)據(jù)的變化。兩個組件的布爾值通過兩個臨近的按鈕控制,初始值和的結(jié)果都是。組件的聲明在組件上,則完全沒有進(jìn)入生命周期。 開始前說一說 吐槽 首先, 文章有謬誤的地方, 請?jiān)u論, 我會進(jìn)行驗(yàn)證修改。謝謝。 vue真是個好東西,但vue的中文文檔還有很大的改進(jìn)空間,有點(diǎn)大雜燴的意思,對于怎么...

    silvertheo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<