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
// 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對象。數組