Vue源码主入口:src/core/index.js

import Vue from './instance/index' // 引用Vue构造器
import { initGlobalAPI } from './global-api/index' // 调用initGlobalAPI方法,定义全局资源
import { isServerRendering } from 'core/util/env'
import { FunctionalRenderContext } from 'core/vdom/create-functional-component'

initGlobalAPI(Vue)
...

Vue.version = '__VERSION__'

export default Vue //暴露Vue

打印出Vue构造器的属性及原型对象属性,此时原型对象已额外定义了30个原型对象属性及一个自动获得的constructor(构造函数)属性(Vue.prototype.constructor === Vue)

clipboard.png

https://segmentfault.com/img/...
clipboard.png

该图片引用自:【Vue源码探究一】当我们引入Vue,我们引入了什么?
然后查看src/core/global-api/index中的initGlobalAPI方法,将Vue构造器作为参数传入

export function initGlobalAPI (Vue: GlobalAPI) {
  // config
  const configDef = {}
  /**
    // 全局配置: config中的参数
    config = {
        optionMergeStrategies: Object.create(null), // 合并策略的选项
        silent: false, // 取消 Vue 所有的日志与警告
        devtools: process.env.NODE_ENV !== 'production', // 配置是否允许 vue-devtools 检查代码。开发版本默认为 true,生产版本默认为 false。生产版本设为 true 可以启用检查。
        performance: false, // 设置为 true 以在浏览器开发工具的性能|时间线面板中启用对组件初始化、编译、渲染和打补丁的性能追踪。只适用于开发模式和支持 performance.mark API 的浏览器上
        errorHandler: null, // 指定组件的渲染和观察期间未捕获错误的处理函数
        warnHandler: null, // 为 Vue 的运行时警告赋予一个自定义处理函数。注意这只会在开发者环境下生效,在生产环境下它会被忽略。
        ignoredElements: [],
        keyCodes: Object.create(null), // 给 v-on 自定义键位别名
        isReservedTag: no,
        isReservedAttr: no,
        isUnknownElement: no,
        getTagNamespace: noop,
        parsePlatformTagName: identity,
    }
    **/
  configDef.get = () => config // import config from '../config'
  if (process.env.NODE_ENV !== 'production') {
    configDef.set = () => {
      util.warn(
        // Vue.config = {...}会触发setter,设置config中属性不会,Vue.config.silent = true (取消 Vue 所有的日志与警告)
        'Do not replace the Vue.config object, set individual fields instead.'
      )
    }
  }
  // 各种全局配置项
  Object.defineProperty(Vue, 'config', configDef)
  Vue.util = util // 各种工具函数,及一些兼容性的标志位
  Vue.set = set // Vue.set
  Vue.delete = del // Vue.delete
  Vue.nextTick = util.nextTick

  Vue.options = Object.create(null) // Vue默认提供的资源
  // ASSET_TYPES: ["component", "directive", "filter"]
  config._assetTypes.forEach(type => {
    Vue.options[type + 's'] = Object.create(null)
  })

  Vue.options._base = Vue

  //builtInComponents: {KeepAlive: KeepAlive}
  util.extend(Vue.options.components, builtInComponents)

  initUse(Vue) // Vue.use
  initMixin(Vue) // Vue.minxin
  initExtend(Vue) // Vue.extend
  initAssetRegisters(Vue)
}

ameng121
0 声望0 粉丝