前言
Vue是一个渐进式的JavaScript框架,它的核心问题是解决视图渲染的问题,其他的功能我们可以通过安装插件的形式来解决,在分析Vue-Router和Vuex源码之前我们先了解一下Vue中插件的安装流程。
Vue.use
export function initUse (Vue: GlobalAPI) {
Vue.use = function (plugin: Function | Object) {
const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
if (installedPlugins.indexOf(plugin) > -1) {
return this
}
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.use是一个全局的API,它接受一个函数或者对象作为参数,在内部维护了一个installedPlugins变量用于存储安装过的插件,保证插件的过程只能被调用一次。
主要流程:
- 首先判断传入的插件是否已经安装过,如果安装过就直接返回
- 构造参数
args, 将Vue添加到args的第一个位置 - 判断插件上
install属性是否是一个函数,如果是一个函数就调用插件上的install方法 - 否则就判断传入的插件是否是一个函数,如果是一个函数就调用插件本身将构造的参数传递进去
- 最后将插件push到内部维护的
installedPlugins变量中 这里有一个优化的点就是将Vue作为一个参数传递给插件,而不是在插件中通过import Vue from 'vue'的形式引入,可以减少包的体积。