上一節講的new Vue的時候,vue的構造函數會執行this._init()函數,最後執行vm.$mount(vm.$options.el)將實例掛載到dom上。能夠看出,vm.$mount爲vue render主要函數。頁面就會從 {{ message }}變爲 ’hello vue‘。主要渲染流程是el、template->render表達式->Vnode->DOMhtml
接下來經過代碼來進一步分析前端
$mount函數在'src/platforms/web/entry-runtime-with-compiler'上被定義
vue
在代碼中能夠看出,el能夠是字符串或者是Element,而且調用了query方法,這個方法在platfomrs/web/util/index.js上被定義node
從query方法能夠看出,當query傳入的參數是字符串的話,會篩選出字符對應的dom節點,轉換成dom對象,而且判斷字符串不能是body或者html ,若是是的話,就會出現一個錯誤,防止被覆蓋。若是是element的話,就直接返回。webpack
從上圖能夠看出,接下來會判斷是否有render函數以及template,若vue實例中沒有render,則將template編譯成render,就是說vue只認render函數。同時,由於template能夠寫成多種形式,由於el也會轉換成template(getOutHTML函數),再轉換成render。web
在代碼的末尾定義了getOutHTML函數。瀏覽器
getOutHTML函數主要是得到el所對應的dom及其內容
weex
最後調用mount完成渲染dom
其中mount方法在platform/runtime/index.js被定義函數
這些方法主要是作一些判斷,並執行mountComponent方法,mountComponent核心就是調用vm._render方法生成虛擬節點,再實例化一個Watcher,在它的回調函數中會調用updateComponent方法,最終調用vm._uppdate更新DOM。
再來看看mountComponent這個方法,在src/core/instance/lifecycle.js能夠看到這個方法
這個函數的主要邏輯是判斷是否有render函數,若是沒有這個函數,則執行createEmptyVNode,又判斷版本。接着就是判斷若是沒有template方法也沒有render方法,就會提示報錯。
接着就是定義updateComponent方法
從函數體大概能夠看出,該方法主要是完成渲染和更新。