美文网首页
阅读vue源码笔记(二)全局实例方法属性API的初始化赋值

阅读vue源码笔记(二)全局实例方法属性API的初始化赋值

作者: 景阳冈大虫在此 | 来源:发表于2020-03-09 19:15 被阅读0次

上篇说到,除了各种依赖之外(因为这些import语句在打包之后当然是找不到的),我们将断点打在了第一条语句initGlobalAPI(Vue)上,。
实际上我们再看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)

会发现第一条执行的是什么,得去看 ./instance/index

传入的Vue是什么
// src/core/instance/index.js
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) //  赋值Vue.prototype._init 
stateMixin(Vue)
eventsMixin(Vue)
lifecycleMixin(Vue)
renderMixin(Vue)

export default Vue

在Vue方法里,可以了解到,如果创建了一个Vue实例,则会调用this._init(options)
而我们在vue项目里一般创建实例是这样的

new Vue({
    el: '#app',
    router,
    template: '<App/>',
    components: { App }
});

对比function Vue (options)是不是具体了许多
整个instance/index.js里干的事情就是给各种Vue的实例方法属性赋值

instance/index.js
initGlobalAPI

再看initGlobalAPI

// src/core/global-api/index.js

export function initGlobalAPI (Vue: GlobalAPI) {
  // config
  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)

  // exposed util methods.
  // NOTE: these are not considered part of the public API - avoid relying on
  // them unless you are aware of the risk.
  Vue.util = {
    warn,
    extend,
    mergeOptions,
    defineReactive
  }

  Vue.set = set
  Vue.delete = del
  Vue.nextTick = nextTick

  // 2.6 explicit observable API
  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)
  })

  // this is used to identify the "base" constructor to extend all plain-object
  // components with in Weex's multi-instance scenarios.
  Vue.options._base = Vue

  extend(Vue.options.components, builtInComponents) // 提供内置组件 keep-alive

  initUse(Vue)
  initMixin(Vue)
  initExtend(Vue)
  initAssetRegisters(Vue)
}

在这个方法里,可以看到Vue的全局配置config,Vue的全局API extend、nextTick等, Vue.options 里components、filters等被初始化赋值。


initGlobalAPI

总结下来,在core/index.js里做的事情就是为这个文档(https://cn.vuejs.org/v2/api/)里出现的各种方法、属性等赋值

相关文章

  • 阅读vue源码笔记(二)全局实例方法属性API的初始化赋值

    上篇说到,除了各种依赖之外(因为这些import语句在打包之后当然是找不到的),我们将断点打在了第一条语句init...

  • Vue源码浅析01

    Vue源码大致可以理解分为:初始化属性、方法(Vue.use、***等等)和实例化(new Vue)执行的一些方法...

  • Vue系列-$set

    what:$set提供了属性赋值方法 vue实例额外提供了$set方法来进行对象的属性赋值 方法使用如下: $se...

  • vue学习笔记

    Vue学习笔记 Vue初始化对象 data和methods里面的属性都是Vue这个实例对象的代理属性,例:vm.m...

  • Vue 源码-Component

    全局组件在源码中如何定义的下图是Vue 初始化全局方法,其中包括 component,filter,directi...

  • Vue源码探究-全局API

    Vue源码探究-全局API 本篇代码位于vue/src/core/global-api/ Vue暴露了一些全局AP...

  • MRC内存管理

    以MRC为实验 使用属性赋值 使用实例变量赋值 全局的属性在VC的dealloc中释放。

  • 2019-11-26 Vue学习常用网站

    Vue中文官网 基础教程 Vue中文官网 API即Vue实例包含的默认属性和方法 Vue状态共享之Vuex Vue...

  • vue生命周期理解或应用

    beforeCreate() 实例初始化之后,但是属性,方法, 事件还未被创建时调用 应用:一般用于vue实例外的...

  • Vue

    一. Vue 实例 以后你可以在 API 参考中查阅到完整的实例属性和方法的列表。 实例生命周期钩子 比如 cre...

网友评论

      本文标题:阅读vue源码笔记(二)全局实例方法属性API的初始化赋值

      本文链接:https://www.haomeiwen.com/subject/zugwrhtx.html