vue源碼3

現(xiàn)在我轉(zhuǎn)變一下思路,用實例來看源碼。
首先用new vue生成實例,生成大概是這個樣子


image.png

即使源碼開始處的factory函數(shù),此函數(shù)最后 return Vue;那我們來看看vue初始化是什么,找到Vue定義是在4710行,是一個函數(shù),并申明是一個構(gòu)造函數(shù),必須用new 去生成實例。


image.png

其中函數(shù)中的options,即使 vue()中的對象,包括el,data等。繼續(xù)追this._init()函數(shù),最后發(fā)現(xiàn)在4575行的initMixin函數(shù),且在4722行執(zhí)行,函數(shù)內(nèi)主要在Vue的原型鏈上添加了_init函數(shù),
`

function initMixin (Vue) {
// 將_init函數(shù)添加到vue的原型鏈上
Vue.prototype._init = function (options) {
var vm = this;
//設(shè)置_uid唯一標(biāo)識,uid3為全局變量,初始化為0,是累加1 vm._uid = uid3++;

var startTag, endTag;
/* 主要是使用perfomance來實現(xiàn)組件性能監(jiān)控,獲取組件等在瀏覽器上的性能參數(shù),在1868-1885行主要定義了mark,message兩個方法,監(jiān)聽起始和結(jié)束標(biāo)簽的加載時間*/
if ("development" !== 'production' && config.performance && mark) {
  startTag = "vue-perf-start:" + (vm._uid);
  endTag = "vue-perf-end:" + (vm._uid);
  mark(startTag);
}

// 設(shè)置_isVue為true,標(biāo)記這是一個Vue的實例
vm._isVue = true;
// 區(qū)分是new生成的實例或者是Vue.component,Vue.direactrive生成的組件或者指令,
if (options && options._isComponent) {
  // optimize internal component instantiation
  // since dynamic options merging is pretty slow, and none of the
  // internal component options needs special treatment.
  initInternalComponent(vm, options);
} else {
  vm.$options = mergeOptions(
    resolveConstructorOptions(vm.constructor),
    options || {},
    vm
  );
}
/* istanbul ignore else */
{
 // 這個函數(shù)在1949行,如果支持proxy并且傳入的options里面有render,用proxy調(diào)用render方法
  initProxy(vm);
}
// 暴露自己
vm._self = vm;
initLifecycle(vm);
initEvents(vm);
initRender(vm);
callHook(vm, 'beforeCreate');
initInjections(vm); // resolve injections before data/props
initState(vm);
initProvide(vm); // resolve provide after data/props
callHook(vm, 'created');

/* istanbul ignore if */
if ("development" !== 'production' && config.performance && mark) {
  vm._name = formatComponentName(vm, false);
  mark(endTag);
  measure(("vue " + (vm._name) + " init"), startTag, endTag);
}

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

};
}

`

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ## 框架和庫的區(qū)別?> 框架(framework):一套完整的軟件設(shè)計架構(gòu)和**解決方案**。> > 庫(lib...
    Rui_bdad閱讀 3,151評論 1 4
  • 一、Native 每一個頁面都是一個 instance,framework 是全局唯一的,js 和 native ...
    Yang152412閱讀 5,906評論 0 50
  • 參加過去年的國考,備考國考時,當(dāng)時已經(jīng)到學(xué)校時大四上學(xué)期了,每天早上都是6點半起床,宿舍,圖書館,餐廳三點一...
    寧貴妃666閱讀 234評論 0 0
  • 進步是今天整理東西的時候發(fā)現(xiàn)有些東西是買了好久但一次都沒用過呢。 結(jié)果是都記不清是什么時候買的了,也不記得還有這些東西。
    愛你的Lisa閱讀 73評論 0 0
  • 昨天晚上九點收到領(lǐng)導(dǎo)微信說今天早上要來檢查,一看到微信就頭頭大,這么晚才說是怎么回事兒?然后通知一直負(fù)責(zé)的同...
    洛北北閱讀 401評論 0 4

友情鏈接更多精彩內(nèi)容