前言
new Vue都干了些啥,估计很多面试都会问到,文章也看过,但是还是想自己扒扒源码看看究竟,因为之前看Vue代码用的都是2.x的,这次也跟着用2.6.11,vue3的留之后吧,现在真的有点卷不动了。
解析Vue入口
一般源码都是从index开始的,看源码的时候要一部分一部分地看,一次性想看完会极度难受,而且这是一件不可能的事,这篇文章就只分析一下new Vue。Vue的入口是在vue/src/core/index.js里,代码如下:
import Vue from './instance/index'
import {
initGlobalAPI } from './global-api/index'
import {
isServerRendering } from 'core/util/env'
import {
FunctionalRenderContext } from 'core/vdom/create-functional-component'
initGlobalAPI(Vue)
Object.defineProperty(Vue.prototype, '$isServer', {
get: isServerRendering
})
Object.defineProperty(Vue.prototype, '$ssrContext', {
get () {
/* istanbul ignore next */
return this.$vnode && this.$vnode.ssrContext
}
})
// expose FunctionalRenderContext for ssr runtime helper installation
Object.defineProperty(Vue, 'FunctionalRenderContext', {
value: FunctionalRenderContext
})
Vue.version = '__VERSION__'
export default Vue
代码里可以看到Vue是从vue/src/core/instance/index里面引用过来的,也对引用过来的Vue进行了一些操作,比如initGlobalAPI,这名字一看就是初始化全局api的,应该是例如一些$set之类的全局钩子,然后还判断了一下是不是ssr,对ssr做了一些处理,这个不是重点,主要是找着Vue的入口。
打开vue/src/core/instance/index,代码如下:
import {
initMixin } from './init'
import {
stateMixin } from './state'
import {
renderMixin } from './render'
import {
eventsMixin } from './events'
import {
lifecycleMixin } from './lifecycle'
import {
warn } from '../util/index'
// new Vue()调用的其实是这个函数,这个函数里面判断了一下环境,如果是非生产环境下没有使用ne