vlambda博客
学习文章列表

Vue 源码解析 (一)初始化流程

Vue 源码解析 (一)初始化流程

最近疯狂的查看 Vue 源码,疯狂的调试代码,于是乎就有了这篇 Vue 初始化流程的文章出现,辛苦我了,今天我要去吃点好吃的,奖励以下自己,

<script src="../vue.js"></script>
   <div id="app"></
div>
<script>
   const vm = new Vue({
      el'#app'
   })
   console.log(vm)
</script>

我们把 debugger 断点打在如图这里

我们可以看到此时的 $data, $props 都为 undefined

$data: undefined
$isServerfalse
$propsundefined
$ssrContextundefined

接着往下走 debugger

此时我们发现 vm 开始出现 _uid,这个用于计算 Vuenew 过多少次

走到这一步 vm 开始出现 _isVue 属性,用来避免被 observed

options 合并策略

首先是处理内部的组件,像 keep-alive, router-link, router-view,自定义 这样的组件。

  • 通过 _isComponent 来判断 (initInternalComponent)

  • 合并 vm.constructor 的 options (resolveConstructorOptions, merge)

  • 此时 vm 才有了 $options

  • $options 里面有:

components: {}
directives: {}
el"#app"
filters: {}

initProxy

用于初始化代理数据,此时 vm 会出现一个叫做 _renderProxy

renderProxy: Proxy

initLifecycle

初始化生命周期函数

此时 vm 出现以下内容:

$children: []
$parentundefined
$refs: {}
$root: {}
_directInactivefalse
_inactivenull
_isBeingDestroyedfalse
_isDestroyedfalse
_isMountedfalse

initEvents

初始化事件,此时 vm 出现 _events

_events: {}

initRender

初始化渲染, 此时 vm 出现:

$scopedSlots: {}
$slots: {}
$vnodeundefined

callHook(vm,'beforeCreate')

初始化 beforeCreate 生命周期

initInjections

初始化注入内容

initState

初始化 state, 此时注意观察,我们发现 data 此时有了数据,el 还没有元素

initProvide

初始化提供

callHook(vm, 'created')

调用 created 生命周期函数,此时 el 没有元素

挂载元素

当执行了以下代码的时候,才是真正意义上挂载 DOM 元素,此时 vm 出现了 $el 元素

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