直接開始分析源碼 順便貼一下(toArray源碼) 總結: 第一,判斷這個插件是否被註冊過,如果已經註冊了,不允許重覆註冊。 第二,接收的plugin參數的限制是Function | Object兩種類型之一。 以後編寫插件的時候可以有兩種方式。一種是將這個插件的邏輯封裝成一個對象,最後在insta ...
直接開始分析源碼
// Vue源碼文件路徑:src/core/global-api/use.js import { toArray } from '../util/index'
//initUse函數接受也一個參數,參數值為Vue實例 export function initUse (Vue: GlobalAPI) {
//Vue.use函數接受的第一個參數為一個函數或者一個對象(註意:如果是對象,對象裡面一定個要有install屬性名,且值為一個函數) Vue.use = function (plugin: Function | Object) {
//聲明變數installedPluguns,並指向this._installedPluguns const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
//判斷插件是否註冊過,如果已經註冊了,不允許重覆註冊。 if (installedPlugins.indexOf(plugin) > -1) { return this } // 把通過Vue.use()傳入的參數,除開第一個,從第二個參數開始全部取出存儲在args中,並向args數組開頭添加一個元素,此元素為Vue實例,(所以plugin對應的方法在執行的時候,第一個參數永遠是Vue實例) const args = toArray(arguments, 1) args.unshift(this)
//開始執行要註冊的插件函數
//1.如果傳入的插件是一個對象,且對象中有install屬性,且此屬性對應的值是一個函數 if (typeof plugin.install === 'function') { plugin.install.apply(plugin, args)
//2.如果傳入的插件直接就是一個函數 } else if (typeof plugin === 'function') { plugin.apply(null, args) }
// 把剛剛註冊的插件添加到installedPlugins中,用作記錄是否註冊過此插件 installedPlugins.push(plugin) return this } }
順便貼一下(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 }
總結:
第一,判斷這個插件是否被註冊過,如果已經註冊了,不允許重覆註冊。
第二,接收的plugin
參數的限制是Function | Object
兩種類型之一。
以後編寫插件的時候可以有兩種方式。
一種是將這個插件的邏輯封裝成一個對象,最後在install編寫業務代碼暴露給Vue對象。
還有一種則是將所有邏輯都編寫成一個函數暴露給Vue。
兩種方法原理都一樣,第二種就是將這個插件直接當成install函數來處理。