由于项目需求,最近需要学习vue和weex相关。所以先研究下vue的源码。
结构分析
研究的vue版本号是2.5.16。核心文件下的目录结构如下:
- components:组件模块;
- global-api:接口模块;
- instance:初始化模块;
- observer:观察者模块;
- util:工具模块;
- vdom:虚拟树模块;
- index.js:入口文件
入口分析
入口文件
先看入口文件index.js源码,内容不多,做了下面几件事。
- export的是instance里的index;
- 另外,还运行了global-api中的index文件暴露的initGlobalAPI接口;
- 使用Object.defineProperty对Vue绑定了$isServer、$ssrContext和FunctionalRenderContext的方法属性。这几个方法都是针对vue的服务端渲染的方法。这里的defineProperty方法也是vue浏览器兼容性支持限制的一个原因;
- 定义了Vue.version,初始化为’__VERSION__‘。1234567891011121314151617181920212223242526import 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 installationObject.defineProperty(Vue, 'FunctionalRenderContext', {value: FunctionalRenderContext})Vue.version = '__VERSION__'export default Vue
instance模块
所以要研究Vue,instance是关键的研究入口。打开instance文件夹的index.js文件,内容如下:
- 定义Vue构造函数,在函数中调用this._init(options),该方法在init.js中的initMixin方法中定义。
- 调用方法:initMixin(Vue)、stateMixin(Vue)、eventsMixin(Vue)、lifecycleMixin(Vue)和renderMixin(Vue)。这些方法的作用就是在Vue的原型 prototype 上挂载一系列方法或属性。1234567891011121314151617181920212223import { initMixin } from './init'import { stateMixin } from './state'import { renderMixin } from './render'import { eventsMixin } from './events'import { lifecycleMixin } from './lifecycle'import { warn } from '../util/index'function Vue (options) {if (process.env.NODE_ENV !== 'production' &&!(this instanceof Vue)) {warn('Vue is a constructor and should be called with the `new` keyword')}this._init(options)}initMixin(Vue)stateMixin(Vue)eventsMixin(Vue)lifecycleMixin(Vue)renderMixin(Vue)export default Vue
这篇文章先对整体结构进行分析,所以不详细研究instance模块的内部代码了。不过我们可以看到,初始化Vue后的函数结构如下:
initGlobalAPI
从入口文件可知,在引入instance文件的Vue模块后,调用了initGlobalAPI(Vue)方法。该方法代码如下:
由代码可知,调用了initGlobalAPI为Vue生成了新的属性方法:
其他
继续看core的代码:
- 设置Vue的实例属性$isServer和$ssrContext。服务器端渲染端属性。
- 设置Vue类属性 FunctionalRenderContext。也是为了ssr服务器端渲染提供的属性。
- 设置Vue类的版本号