Vue initAssetRegisters()建立元件、指令、過濾器原始碼

進階__前端漫漫路發表於2020-12-30

// 註冊Vue.directive 、 vue.component() 、 Vue.filter()
initAssetRegisters(Vue)

/* @flow */

import { ASSET_TYPES } from 'shared/constants'
import { isPlainObject, validateComponentName } from '../util/index'

export function initAssetRegisters (Vue: GlobalAPI) {
  /**
   * Create asset registration methods.
   */
   // 遍歷 ASSET_TYPES 陣列,為Vue 定義相應的方法
   // ASSET_TYPES 包含 directive  component  filter
  ASSET_TYPES.forEach(type => {
    Vue[type] = function (
      id: string,
      definition: Function | Object
    ): Function | Object | void {
      if (!definition) { // 判斷是否有第二個引數,沒有的話去之前的option的元件或者指令
        return this.options[type + 's'][id]
      } else {
        /* istanbul ignore if */
        if (process.env.NODE_ENV !== 'production' && type === 'component') {
          validateComponentName(id)
        }
        // Vue.component("test",{template:""})
        // 判斷傳入的是不是一個原始物件
        if (type === 'component' && isPlainObject(definition)) {
          definition.name = definition.name || id
          // 把元件配置轉換為元件的建構函式
          definition = this.options._base.extend(definition)
        }
        if (type === 'directive' && typeof definition === 'function') {
          definition = { bind: definition, update: definition }
        }
        // 全域性註冊,儲存資源賦值
        // this.options
        this.options[type + 's'][id] = definition
        return definition
      }
    }
  })
}

相關文章