源码解读,最好从第一个版本开始看起,有时间的话也可以一个提交一个提交的去看,可以很好理解作者的思路历程,而且最初的版本一般更偏重最初的想法,偏重核心。我们反其道而行,先看当前版本。
当前master分支版本是:v2.5.0
对于vue来说,我们第一眼看到,第一次用到的最直观的就是:
index
实例化的过程中究竟发生了什么呢,让我们深入看看。打开源码工程,其核心代码在src/core目录下。下面我们从入口文件index.js开始进入:
vue功能类
下面我们来一步步验证我们的猜测,首先找到core/instance/index文件,可以清晰的看到:
这里简单定义了一个vue class,然后调用一系列的Mixin方式来初始化一些功能,这里最终导出了一个vue的功能类。
initGlobalAPI
接下来,我们接着看initGlobalAPI这个东西,其实在Vue官网上,就已经为我们说明了Vue的全局属性:
打开源码看看:
Vue.util对象的部分解释:
- Vue.util.warn
warn(msg, vm) 警告方法代码在util/debug.js,
通过var trac = generateComponentTrace(vm)方法vm=vm.$parent递归收集到msg出处。
然后判断是否存在console对象,如果有 console.error([Vue warn]: ${msg}${trace})。
如果config.warnHandle存在config.warnHandler.call(null, msg, vm, trace) - Vue.util.extend
extend (to: Object, _from: ?Object):Object Object类型浅拷贝方法代码在shared/util.js Vue.util.mergeOptions
合并,vue实例化和实现继承的核心方法,代码在shared/options.js
mergeOptions (
parent: Object,
child: Object,
vm?: Component
)
先通过normalizeProps、normalizeInject、normalizeDirectives以Object-base标准化,然后依据strats合并策略进行合并。
strats是对data、props、watch、methods等实例化参数的合并策略。除此之外还有defaultStrat默认策略。
后期暴露的mixin和Vue.extend()就是从这里出来的。Vue.util.defineReactive
大家都知道的数据劫持核心方法,代码在shared/util.js
defineReactive (
obj: Object,
key: string,
val: any,
customSetter?: ?Function,
shallow?: boolean
)
参考资料
Vue2 源码漫游(一)
入口开始,解读Vue源码(一)—— 造物创世
Vue技术内幕·内容更详细
Vue源码的最后一站
Vue2.1.7源码学习
Vue.js 技术揭秘·黄轶大大·慕课上有课