说明
1 | # https://github.com/vuejs/vue/blob/2.6/.github/CONTRIBUTING.md#project-structure |
Vue原型定义及扩展
原型初始化入口
src/core/index.js
1 | // Vue 实例化核心方法,其中定义了Vue类(vue原型) |
初始化全局API
src/core/global-api/index.js
1 | import config from '../config' |
- 全局mixin
1 | /* @flow */ |
Vue实例化过程
Vue 实例化 ^1
- Vue 项目的起源,源于一次Vue的实例化
1 | new Vue({ |
实例化入口
src/core/instance/index.js
- https://github.com/vuejs/vue/blob/2.6/src/core/instance/index.js
1 | import { initMixin } from './init' |
initMixin
- 处理 options 选项 ^2
- options参数的处理:把业务逻辑以及组件的一些特性全都放到vm.$options中,后续的操作都可以从vm.$options拿到可用的信息。框架基本上都是对输入宽松,对输出严格,vue也是如此,不管使用户添加了什么代码,最后都规范的收入vm.$options中
src/core/instance/init.js
1 | import { extend, mergeOptions, formatComponentName } from '../util/index' |
mergeOptions
1 | export function mergeOptions ( |
mergeOptions时采用的策略:对不同的field采取不同的策略,Vue提供了一个strats对象,其本身就是一个hook,如果strats有提供特殊的逻辑,就走strats,否则走默认merge逻辑,用这种hook的方式就能很好的区分对待公共处理逻辑与特殊处理逻辑
- https://github.com/vuejs/vue/blob/2.6/src/core/util/options.js
1 | const strats = config.optionMergeStrategies // https://github.com/vuejs/vue/blob/2.6/src/core/config.js |
响应式数据原理(订阅-发布) ^3
- Vue.js的响应式原理依赖于Object.defineProperty,尤大大在Vue.js文档中就已经提到过,这也是Vue.js不支持IE8 以及更低版本浏览器的原因。Vue通过设定对象属性的 setter/getter 方法来监听数据的变化,通过getter进行依赖收集,而每个setter方法就是一个观察者,在数据变更的时候通知订阅者更新视图
Observer
1 | // https://github.com/vuejs/vue/blob/2.6/src/core/observer/index.js#L37 |
参考文章