// 定义了Vue的实例 functionVue (options) { // 如果不是生产环境并且直接调用Vue会报warn if (process.env.NODE_ENV !== 'production' && // 这种写法可以判断构造函数是否被作为构造函数使用 !(thisinstanceof Vue) ) { warn('Vue is a constructor and should be called with the `new` keyword') } // 这个方法是由initMixin挂载到Vue.prototype上的 this._init(options) }
// a flag to avoid this being observed vm._isVue = true // merge options if (options && options._isComponent) { // optimize internal component instantiation // 优化内部组件实例化 // since dynamic options merging is pretty slow, and none of the // internal component options needs special treatment. // 这个方法见下方,貌似是处理内部组件的,之后遇到再看 initInternalComponent(vm, options) } else { // 合并配置,并赋值给实例的$options vm.$options = mergeOptions( // 不知道这种情况处理了那些配置 resolveConstructorOptions(vm.constructor), options || {}, vm ) } /* istanbul ignore else */ if (process.env.NODE_ENV !== 'production') { initProxy(vm) } else { vm._renderProxy = vm } // expose real self vm._self = vm // 初始化了一系列状态 initLifecycle(vm) initEvents(vm) initRender(vm) callHook(vm, 'beforeCreate') initInjections(vm) // resolve injections before data/props initState(vm) initProvide(vm) // resolve provide after data/props callHook(vm, 'created')
/* istanbul ignore if */ if (process.env.NODE_ENV !== 'production' && config.performance && mark) { vm._name = formatComponentName(vm, false) mark(endTag) measure(`vue ${vm._name} init`, startTag, endTag) }
if (vm.$options.el) { vm.$mount(vm.$options.el) } } }
proxy/initProxy方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
initProxy = functioninitProxy (vm) { // 这里判断Proxy是否可用 if (hasProxy) { // determine which proxy handler to use const options = vm.$options // 暂时不清楚这个render标记有什么用 const handlers = options.render && options.render._withStripped ? getHandler : hasHandler // 就是由于这个proxy当我们访问不存在的data时会有一个vue warn的报错,类似这种 // [Vue warn]: Property or method "b" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties. vm._renderProxy = newProxy(vm, handlers) } else { vm._renderProxy = vm } }