Vue框架中Vue的定义 平常开发spa时,一般都能看到new Vue()这样的代码,然后就会思考,Vue这个框架到底是如何去定义Vue的?Vue到底是个什么东西?然后就去翻源码了。。。
其实在src/core/index.js
中你就可以看到Vue基本的实现了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 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 () { return this .$vnode && this .$vnode .ssrContext } }) Object .defineProperty (Vue , 'FunctionalRenderContext' , { value : FunctionalRenderContext }) Vue .version = '__VERSION__' export default Vue
这里第一二行就是定义Vue关键代码了,然后我们继续找到对应的js文件。 首先是./instance/index.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 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' 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
这不就是一个构造函数嘛?本质上就是一个Function实现的类,然后对这个类的原型上增加方法或属性,这个地方看起来还是能看懂的。 看完index之后在看看那个initGlobalAPI做了什么,是在./global-api/index这里。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 import config from '../config' import { initUse } from './use' import { initMixin } from './mixin' import { initExtend } from './extend' import { initAssetRegisters } from './assets' import { set, del } from '../observer/index' import { ASSET_TYPES } from 'shared/constants' import builtInComponents from '../components/index' import { observe } from 'core/observer/index' import { warn, extend, nextTick, mergeOptions, defineReactive } from '../util/index' export function initGlobalAPI (Vue : GlobalAPI ) { const configDef = {} configDef.get = () => config if (process.env .NODE_ENV !== 'production' ) { configDef.set = () => { warn ( 'Do not replace the Vue.config object, set individual fields instead.' ) } } Object .defineProperty (Vue , 'config' , configDef) Vue .util = { warn, extend, mergeOptions, defineReactive } Vue .set = set Vue .delete = del Vue .nextTick = nextTick Vue .observable = <T>(obj : T): T => { observe (obj) return obj } Vue .options = Object .create (null ) ASSET_TYPES .forEach (type => { Vue .options [type + 's' ] = Object .create (null ) }) Vue .options ._base = Vue extend (Vue .options .components , builtInComponents) initUse (Vue ) initMixin (Vue ) initExtend (Vue ) initAssetRegisters (Vue ) }
这里就是给Vue增加一些全局方法了,文档上的API应该都能在这里面找到。 看到这大概能知道Vue本质上就是Function实现的Class,然后在原型上扩展一些方法属性,然后基本上Vue就是这么定义的,当然里面还有很多很多具体的实现,在instance和global-api目录下还有很多模块,这个就留到后面慢慢琢磨吧。。