vue2.0源码解读(一)、new Vue;

222 阅读1分钟

new Vue 都干了什么?

    import Vue from 'vue'
    new Vue({
        render: h => h(App)
    }).$mount('#app')
  • 找到Vue的源码, src/core/instance/index.js
    function Vue (options) {
        ...
        this._init(options)
    }
  • 原来如此调用了一个_init方法啊,虽然我并不知道他是干嘛的,那就研究一下吧,只过大体流程,不然会越陷越深。 打开 src/core/init.js
    Vue.prototype._init = function (options) {
        const vm = this
        if (options && options._isComponent) {
            initInternalComponent(vm, options)
        } else {
            vm.$options = mergeOptions(
                resolveConstructorOptions(vm.constructor),
                options || {},
                vm
            )
        }
        initLifycycle(vm)
        initEvents(vm)
        initRender(vm)
        callHook(vm, 'beforeCreate')
        initInjections(vm)
        initState(vm)
        initProvide(vm)
        callHook(vm, 'created')
        ...
        vm.$mount(vm.$options.el)
    }
    

上面是精简代码,其实_init做的事情还是蛮多的,能做的都做了,我们只看主流程,细化的先不看,定义vm变量存储Vue实例,判断options中是否存在_isComponent属性,如果存在执行initInternalComponent, 这个函数干嘛的不管。 继续看,这时候有个疑问isComponent是不是就是指他是组件实例呢?答案是的。 那else就是说是根实例的操作了,巧了,看的就是你啊。我们看到在vm上定义了一个$options属性,然后执行mergeOptions方法,将返回值赋值给vm.$options,这时候我猜测,应该是将vm.constructor上的属性与options中的属性合并了,mergeOptions我们后面分析,还是那句话,看主流程,知道自己要看的是啥,看完主流程,在有目的的去看其他的。

合并完属性之后,就是一系列的初始化操作,各种init啊,同时还在中间插了两个生命周期的钩子,根据这个init的命名,我们大概能猜到是这些东西, 初始化生命周期初始化事件初始化renderbeforeCreate初始化inject初始化state(props、computed、data、methods、watch)初始化providecreated。 这样我们就大概知道了,原来生命周期breforeCreate之前初始化了这些东西, created之前初始化了这些东西,所以我们在created中就可以调用到data中的属性、methods中的方法、computed中的属性等。

最后在调用一个$mount完事。

总结

new Vue()做的事

  • 合并options
  • 初始化生命周期、事件、render、beforeCreate、inject、props、methods、data、computed、watch、provide、created。
  • 调用$mount
疑问
  • mergeOptions
  • 一系列的初始化过程是怎么样的?
  • $mount都干了啥?