Vue源码01-基础流程分析

从毕业到现在也写的有两年Vue了,本着高深追求就去学习了Vue的源码,就把学习过程中的理解记录下来,这将是一个系列的文章,一次不可能写完,会不断更新,后续还会有vuex和vue-router系列
先从Vue的目录说起
image.png
  • scripts目录里面包含我们打包所需要的脚本
  • src里面包含的就是vue的源码目录了
    • compiler模版编辑器生成 render,ast,staticRenderFns
    • core vue的主要代码目录包含生命周期,静态方法,原型方法,属性,vdom,observe等一系列
    • platform 打包的入口 也是我们阅读源码的入口(这里只讲web)
    • server 服务端渲染相关
    • sfc 解析单文件组件
    • shared 项目包含的公共方法和常量
这里先讲解vue的加载流程

每行代码基本都有注释,请细看注释

分析packge.json
"build": "node scripts/build.js"  //告诉我们打包的入口是scripts/build.js
分析打包
 // build.js
 let builds = require('./config').getAllBuilds()   // 引入config
.....
build(builds)   // 打包通过分析config.js
// config.js,这里选择这一个  也是我们最常用的vue.min.js
  'web-full-prod': {    
    entry: resolve('web/entry-runtime-with-compiler.js'), // 将从这个目录读起
    dest: resolve('dist/vue.min.js'),
    format: 'umd',
    env: 'production',
    alias: { he: './entity-decoder' },
    banner
  },
分析web/entry-runtime-with-compiler.js

将会简化这里的代码后续慢慢补充

// web/entry-runtime-with-compiler.js 
const idToTemplate = cached(id => {   //将template缓存起来,避免重复解析
  const el = query(id)
  return el && el.innerHTML
})
const mount = Vue.prototype.$mount  // 来自runtime/index.js 运行mountComponent
Vue.prototype.$mount =function(){
 // 1解析template
 // 2生成options.render
}  // 挂载$mount 这里需要分析清楚这两个$mount
// runtime/index.js 
Vue.prototype.__patch__ = inBrowser ? patch : noop //添加patch
Vue.prototype.$mount= function(){
  // 运行mountComponent dom挂载已经beforeMount,beforeUpdate,mounted挂载
 return mountComponent(this, el, hydrating)
}

从上面的代码里面我们知道Vue来自core/index.js

分析core/index.js
initGlobalAPI(Vue) // 这里会给Vue挂载静态方法 use,mixin,extend,component,directive,filter
分析core/instance/index.js

到这里才见到Vue的构造函数,详情参考注释,每句都有注释

function Vue (options) {
  if (process.env.NODE_ENV !== 'production' &&
    !(this instanceof Vue)
  ) {
    warn('Vue is a constructor and should be called with the `new` keyword')
  }
  this._init(options)  // 运行_init 给vue进一步初始化,已经注册beforeCreate,created
}
// 在Vue的原型上面挂在相关方法 
initMixin(Vue)  // 挂载_init
stateMixin(Vue) // 挂载$data,$props,$set,$delete,$watch
eventsMixin(Vue) // $on,$once,$off,$emit
lifecycleMixin(Vue)// _update ,$forceUpdate,$destroy
renderMixin(Vue) //$nextTick,_render
     // init.js分析重要部分
    // 这里对options初始化**mergeOptions**后续会讲
    vm.$options = mergeOptions(
        resolveConstructorOptions(vm.constructor),
        options || {},
        vm
     )
    // 深入初始化
    initLifecycle(vm) // 初始化生命周期相关属性
    initEvents(vm) // 初始化事件相关属性
    initRender(vm) // 初始化render所需要的方法  vm._c  vm.$createElement
    callHook(vm, 'beforeCreate')  // 调用beforeCreate生命周期钩子
    initInjections(vm) // resolve injections before data/props
    initState(vm) // 初始化state
    initProvide(vm) // resolve provide after data/props
    callHook(vm, 'created') // 调用created生命周期钩子
    // 挂载
    if (vm.$options.el) {
      vm.$mount(vm.$options.el) // 这里调用的是web/entry-runtime-with-compiler.js 里面的mount
    }

这里有几个面试题
1 vue的provide 和 inject注册顺序以及怎么注册?
2 vue在beforeCreate之前干了什么?created之前做了什么?

通过上面的分析我们已经对Vue有了一个大概的认识能回答从new Vue()到mount做了哪一些事?后续我们会继续分析这些‘事’都是什么

小节Vue挂载流程:

  • Vue.prototype.patch 挂载patch方法
  • Vue.prototype.$mount 运行mountComponent
  • Vue.prototype.$mount 解析render
  • initGlobalAPI(Vue) 给Vue挂载静态方
  • 在Vue的原型上面挂在相关方法和属性
  • 调用_init()
  • 在initState里面干了什么?下章节将
  • 调用 3中的$mount()对render进行判断并且生成对应的render
  • 运行mountComponent
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339