天地初開就是new Vue(options),裏面就一句話 this._init(options); (Vue.prototype.init 的賦值在initMixin(Vue)方法裏)vue
_init方法裏:node
initInternalComponent 和mergeOptions方法是合併option這個另說。react
initEvents是處理父組件(若是有)傳遞來的on事件函數
initRender很重要,主要是這一句 vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); }; 在vm實例上掛載一個_c方法,用處下面會講到性能
initState很重要,處理咱們在一個組件裏定義的參數,好比props,computed,watch,data等。剛開始是initProps,就是把父組件(若是有)傳遞進來的值從propsData中取出來,綁定給本身的對應的props裏的屬性,reactive以後再掛在vm上(至於爲何父組件的屬性能從本身的vm.$options.propsData中獲取出來,這個下面會講)。initMethods略,initData也簡單,就是遞歸reactive,initComputed和initWatch別的文章另說。this
再往下,if (vm.$options.el) {vm.$mount(vm.$options.el);}prototype
這一段最重要,若是vue的參數裏有el屬性(el是準備掛載的節點,第一次的new Vue()的話是有的,後面的Vue組件沒有,而是),進入$mount方法,點進去看只有一句return mountComponent(this, el, hydrating),可是這個方法後面被重寫了,添加了一部分邏輯,添加的邏輯的做用是根據template(若是沒有,根據el生成),生成render函數(裏面調用上面_c),返回值是一個虛擬節點Vnode,遞歸
最後是mountComponent,新建一個render Watcher,expOrFn方法是vm._update(vm._render(), hydrating)(由於這個Watcher的lazy是false,因此會當即執行get方法,把本身推動棧頂,讓被vm_render()引用到的屬性收集依賴),事件
而接下來執行update方法,調用的是patch方法,把render生成的vnode和舊的對比,操做真實node,這個另說。get
上面說的是建立週期
建立以後,就到了update更新週期,set方法致使vm._update這個方法被調用,把render生成的vnode和舊的對比,操做真實node等等。