vue.use()作了什麼

initUse的源碼:vue

// Vue源碼文件路徑:src/core/global-api/use.js

import { toArray } from '../util/index'

export function initUse (Vue: GlobalAPI) {
  Vue.use = function (plugin: Function | Object) {
    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
    if (installedPlugins.indexOf(plugin) > -1) {
      return this
    }

    // additional parameters
    const args = toArray(arguments, 1)
    args.unshift(this)
    if (typeof plugin.install === 'function') {
      plugin.install.apply(plugin, args)
    } else if (typeof plugin === 'function') {
      plugin.apply(null, args)
    }
    installedPlugins.push(plugin)
    return this
  }
}
複製代碼

源碼中vue的插件不容許重複註冊。 而且接收的plugin參數的限制是Function | Object兩種類型。 對於這兩種類型有不一樣的處理。 首先將咱們傳入的參數整理成數組 => const args = toArray(arguments, 1)。api

toArray源碼

// Vue源碼文件路徑:src/core/shared/util.js

export function toArray (list: any, start?: number): Array<any> {
  start = start || 0
  let i = list.length - start
  const ret: Array<any> = new Array(i)
  while (i--) {
    ret[i] = list[i + start]
  }
  return ret
}
複製代碼

對象中包含install方法,那麼咱們就調用這個plugin的install方法並將整理好的數組當成參數傳入install方法中。 => plugin.install.apply(plugin, args) 若是咱們傳入的plugin就是一個函數,那麼咱們就直接調用這個函數並將整理好的數組當成參數傳入。 => plugin.apply(null, args) 以後給這個插件添加至已經添加過的插件數組中,標示已經註冊過 => installedPlugins.push(plugin) 最後返回Vue對象。數組

相關文章
相關標籤/搜索