入口文件
- 重写$mount函数
- 完整版 src/platform/web/entry-runtime-with-compiler.js
- el 不能是 body 或者 html 标签
- 如果没有 render,把 template 转换成 render 函数
- 如果有 render 方法,直接调用 mount 挂载 DOM
- 运行时 src/platform/web/runtime/index.js
- 区别
- 完整版 支持template和render
- 运行时
- 不支持template编译
- 返回mountComponent(),其内部校验了模板警告
初始化vm Vue.prototype._init
initLifecycle(vm)
- vm 的生命周期相关变量初始化
$children/$parent/$root/$refs
initEvents(vm)
- vm 的事件监听初始化, 父组件绑定在当前组件上的事件emit,on,off,once
initRender(vm)
- vm 的编译render初始化
$slots/$scopedSlots/_c/$createElement/$attrs/$listeners
callHook(vm, 'beforeCreate')
initInjections(vm)
- 把 inject 的成员注入到 vm 上
- resolve injections before data/props
initState(vm)
- 初始化 vm 的 _props/methods/_data/computed/watch
initProvide(vm)
- 初始化 provide
- resolve provide after data/props
callHook(vm, 'created')
- 调用 $mount() 挂载
vm._self = vm
initLifecycle(vm)
initEvents(vm)
initRender(vm)
callHook(vm, 'beforeCreate')
initInjections(vm)
initState(vm)
initProvide(vm)
callHook(vm, 'created')
首次渲染过程
- Vue初始化,实例成员,静态成员
- new Vue()
this._init() Vue构造函数内部调用_init(),_initMixin中注册_init方法
vm.$mount() _init()调用$mount()
mountComponent()
- 触发
beforeMount
- 定义
updateComponent
- 创建
Watcher实例
- 触发
mounted
watcher.get()
