前言我们在使用Vue的时候,经常会使用和编写一些自定义的插件,然后使用Vue.use来导入。所以在写插件的时候,install方法是必不可少的。Vue.js插件应该公开一个`install`方法。此方法的第一个参数是Vue构造函数,第二个参数是一个可选的选项对象。这是Vue对Vue插件的官方规范。那么install函数到底是什么,Vue内部是做什么的,又是如何调用的,今天给大家源码一目了然。阅读本文后,您将了解到:install函数可以做什么;安装是如何在内部实现的;Vuex、Vue-Router插件在安装过程中做了什么;好了,废话不多说,直接开始吧!!!这里在Vuex&Vue-Router中install的处理首先抛出两个问题,大家可以想一想,是挖坑,然后一一回答:为什么我们可以直接使用$router$store获取值以及里面的一些方法该项目;为什么要用这两个插件先用Vue.use介绍。然后创建一个实例,并在Vue实例中传递;两者其实是一样的原理,这里我们以Vue-Router为例,先来看看它内部install的具体实现:classRouter{constructor(options){...}}Router.install=function(_Vue){_Vue.mixin({beforeCreate(){if(this.$options.router){_Vue.prototype.$router=this.$options.router}}})}exportdefault什么是Router;_Vue.mixinglobalmixin?相当于在所有组件中混合使用该方法;什么是beforeCreate?当然是Vue的一个生命周期,先于create执行;在这种情况下,我们做出大胆的判断。Vue-Router其实是在install函数中使用了一个全局的mix-in,在触发beforeCreate生命周期的时候将this.$options.router挂载到Vue原型上,这样我们就可以使用this.$router来调用router实例了。同学A:等一下,停下!!!你说我很李姐,可是这个.$options.router是什么东西,哪里来的?安,我们刚刚解决了第一个问题,让我们来填补第二个洞。我们通常使用Vue-Router,定义入口文件的Vue实例是这样的//router/index.jsimportVueRouterform'vue-router';importVuefrom'vue';Vue.use(VueRouter);const_router=[...]constRouter=newVueRouter(_router);exportdefaultRouter;//main.jsimportVuefrom'vue';importrouterfrom'router';newVue({router,...}).$安装('#app');结合第一个例子,我们先来分析一波。vue.use()主要是调用插件内部的install方法,将Vue实例作为参数传入;上面使用了this.$options.router,options通常代表配置项;在main.js中我们把Router实例作为配置项传入到Vue实例中!叮!!!检测到元素了,我们来大胆猜一猜。Vue-Router第一次使用其实是全局mix-in,目的是在合适的时间点获取Vue根实例配置项中的router实例,并执行挂载。然后在创建newVue()根实例时,注入路由实例,然后触发全局mixin中的生命周期。此时root实例的配置项this.$options中已经包含了router实例,挂载过程终于完成!!!光是这一段的代码就逻辑缜密,编程思路巧妙,堪称专家!猛哥,公屏打高手,呵呵。vue中install的内部实现看了常用库install的使用,不知道大家有没有收获。预热结束后,我们就可以开始看一下install的内部实现了,先上传源码。exportfunctioninitUse(Vue:GlobalAPI){//注册一个挂载在实例上的use方法Vue.use=function(plugin:Function|Object){//初始化当前插件数组constinstalledPlugins=(this._installedPlugins||(this._installedPlugins=[]))//如果这个插件已经被注册过,则不会处理if(installedPlugins.indexOf(plugin)>-1){returnthis}...//重点来了!!!if(typeofplugin.install==='function'){//当插件中的install是函数时,调用install方法,指向插件,将所有参数传递给plugin.install.apply(plugin,args)}elseif(typeofplugin==='function'){//当插件本身是函数时,作为install方法,指向插件,将所有参数传递给plugin.apply(null,args)}//将插件放入插件数组installedPlugins.push(plugin)returnthis}}源码非常简洁,可读性强。就是在使用的时候判断插件类型,执行install或者插件本身。其实要细化官网的解释,Class类的插件应该暴露一个install方法。结束语本次分享到此结束。不知道大家对Vue的插件机制有没有更深入的了解呢?其实在开发插件的时候,我们可以使用install来做很多事情。比如Vue-Router其实就是在install中注册了Router-view和Router-link的全局组件。有兴趣的同学可以看看vue-router的原理?让我们来一个vue-router吧!再次感谢阅读。好吧,再见了兄弟!
