Vue.use的原理和设计源码探究

目录
  • 前言
    • 基本使用
    • 源码解析
    • 控制反转

前言

这段时间打算回顾一下Vue的全局方法,脑海里第一个跳出来的方法就是Vue.use,之所以会首先想到它,我觉得和我平时看的面试题相关~~~

Vue.use的原理是面试中常问的点,因为相对于其他全局方法,Vue.use源代码逻辑清晰,如果了解它,也就代表这个人是看过Vue源码的!!!

基本使用

在Vue官网中是这样说明的:通过全局方法 Vue.use(plugin) 使用插件

首先要知道什么是插件,插件通常用来为 Vue 添加全局功能(过滤器、指令、组件),平时我们使用的UI组件、Axios、Vuex都是插件

Vue.use装载插件的方式也很简单

 import Vue from "vue"
 import Element from 'element-ui'
 Vue.use(Element)

并且在Vue官网还介绍了我们如何去开发插件,只需要暴露一个install方法就可以,在如果Vue.use方法使用插件时,会主动调用install方法

install方法第一个参数是Vue构造函数,剩下的参数则是调用Vue.use方法时,除第一个参数以外的剩余参数

 import Vue from "vue"
 let MyPlugin = {
     install(_Vue) {
         console.log(_Vue === Vue)       // true
     }
 }
 Vue.install(MyPlugin)

源码解析

废话不说,直接上源码~~~

 import type { GlobalAPI } from 'types/global-api'
 import { toArray, isFunction } from '../util/index'
 export function initUse(Vue: GlobalAPI) {
     // plugin:类型是 Function|any
   Vue.use = function (plugin: Function | any) {
     // this是Vue构造函数
     // _installedPlugins保存了已经被过使用插件
     const installedPlugins = this._installedPlugins || (this._installedPlugins = [])
     // 判断当前插件是否已经被使用过
     if (installedPlugins.indexOf(plugin) > -1) {
       // 如果已经被使用,就直接返回Vue构造函数
       return this
     }
     // 获取排除第一个参数之后所剩余的参数
     const args = toArray(arguments, 1)
     // 向头部添加Vue构造函数
     args.unshift(this)
     // 如果 plugin.install 是方法
     if (isFunction(plugin.install)) {
       // 执行plugin.install方法
       plugin.install.apply(plugin, args)
     }
     // 如果 plugin 是函数
     else if (isFunction(plugin)) {
       // 执行plugin.install函数
       plugin.apply(null, args)
     }
     // plugin已经被使用过了,添加到已使用缓存中
     installedPlugins.push(plugin)
     return this
   }
 }

源码不一定都很很难,像Vue.use源码是不是就很简单

我们从源码中得到以下信息:

  • Vue.use会防止重复加载同一个插件
  • Vue.use可以链式调用
  • plugin只有类型是函数或者对象的时候才有用,为函数时,直接运行这个函数;当为对象时,会判断对象中是否存在install方法,如果存在,就执行这个方法

控制反转

谈论了Vue.use使用和原理,那再讲一讲设计吧~~~

我们从框架设计者的角度出发,现在需要允许Vue插件,你会怎样设计喃?

 function show() {
     console.log("我是插件");
 }

现在需要把show方法添加到Vue原型上,如果没有提供Vue.use方法,那就会这样,开发者手动添加到原型上

 function show() {
     console.log("我是插件");
 }
 Vue.prototype.show = show

显然这样是不对,如果明天在有show2方法喃?不可能让开发自己加呀,你就首先提出了Vue.use方法帮助开发者加载插件

 Vue.use = function (plugin) {
     if (typeof plugin === "object") {
         if (plugin.add) {
             plugin.add()
         }
         if (plugin.use) {
             plugin.use()
         }
     } else {
     }
 }

但是这又遇到一个难题,插件的类型多种多样,有些插件暴露的是add方法,有些时候use,不可能都要适配吧!!!

所以这个时候你就通知所以插件开发商,让他们插件都要向外暴露install方法,没有这个方法的我们不管,所以问题也都解决了

回到正题,谈设计,原本需要开发者实现的业务,交给了Vue本身,开发者只需要提供插件,这种设计叫做控制反转

也就是把代码的控制权从开发者交给Vue本身,如果Vue.use注入插件也叫做依赖注入

以上就是Vue.use的原理和设计源码探究的详细内容,更多关于Vue.use原理设计的资料请关注我们其它相关文章!

(0)

相关推荐

  • Vue.use()的用法和install的用法解析

    目录 Vue.use()和install用法 介绍 为什么这样做? Vue.use为什么要使用install 疑问 从源码分析 vue官网是这样说的 Vue.use()和install用法 介绍 在vue的main.js中,我们经常使用Vue.use(xx)方法.比如我们引入elementUI,在main.js中,我们一般通过如下代码引入: import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.cs

  • Vue 实现创建全局组件,并且使用Vue.use() 载入方式

    自定义vue组件,一般是局部引用的方式载入,使用的时候,在应用的组件中使用 import moduleName from 'module' 导入,在components中注册 <template> <div class="app-NewsInfo"> <h3>{{info.title}}</h3> <!-- 新闻评论子组件. --> <comment :id="id"></comment&

  • Vue中Vue.use()的原理及基本使用

    目录 前言 1. 举例理解 2. 分析源码 3. 小结 总结 前言 相信很多人在用 Vue 使用别人的组件时,会用到 Vue.use() .例如:Vue.use(VueRouter).Vue.use(MintUI).但是用 axios时,就不需要用 Vue.use(axios),就能直接使用.那这是为什么呐? 因为 axios 没有 install. 1. 举例理解 在新建的项目中创建两个文件:plugins.js use.js: // plugins.js const Plugin1 = {

  • 浅谈Vue.use到底是什么鬼

    我们在使用Vue做项目开发的时候,看到不少轮子都是通过Vue.use来进行使用,感觉甚是高大上. 不过Vue.use到底是什么鬼?不妨来看个究竟. 其实这些轮子都可以称之为插件,它的功能范围没有严格的限制,一般包含如下几种: 添加全局方法或者属性.如: vue-custom-element 添加全局资源:指令/过滤器/过渡/组件等.如 vue-touch 通过全局混入来添加一些组件选项.如 vue-router 添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现. 一个

  • 解析Vue.use()是干什么的

    目录 1. Vue.use是什么,了解一下!? 1.1 main.js中的Vue.use() 1.2 简单解释一下这里的import的逻辑, 1.3 Vue.use()代码 2. 看一下 vueEsign 插件的install是什么? 3.看一下 element-ui的install是什么? 4. Vue.use() 总结 5.为什么有的库就不需要使用Vue.use start 前几天使用了一个别人封装的电子签名组件:vueEsign. 在初始化的时候有这么一行代码:Vue.use(vueEsi

  • vue自定义组件(通过Vue.use()来使用)即install的用法说明

    在vue项目中,我们可以自定义组件,像element-ui一样使用Vue.use()方法来使用,具体实现方法: 1.首先新建一个Cmponent.vue文件 // Cmponent.vue <template> <div> 我是组件 </div> </template> <script> export default { } </script> <style scoped> div{ font-size:40px; col

  • Vue.use的原理和设计源码探究

    目录 前言 基本使用 源码解析 控制反转 前言 这段时间打算回顾一下Vue的全局方法,脑海里第一个跳出来的方法就是Vue.use,之所以会首先想到它,我觉得和我平时看的面试题相关~~~ Vue.use的原理是面试中常问的点,因为相对于其他全局方法,Vue.use源代码逻辑清晰,如果了解它,也就代表这个人是看过Vue源码的!!! 基本使用 在Vue官网中是这样说明的:通过全局方法 Vue.use(plugin) 使用插件 首先要知道什么是插件,插件通常用来为 Vue 添加全局功能(过滤器.指令.组

  • React Context原理深入理解源码示例分析

    目录 正文 一.概念 二.使用 2.1.React.createContext 2.2.Context.Provider 2.3.React.useContext 2.4.Example 三.原理分析 3.1.createContext 函数实现 3.2. JSX 编译 3.3.消费组件 - useContext 函数实现 3.4.Context.Provider 在 Fiber 架构下的实现机制 3.5.小结 四.注意事项 五.对比 useSelector 正文 在 React 中提供了一种「

  • JavaScript获取路径设计源码

    1.设计源码 复制代码 代码如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>JavaScript获取路

  • Vue实现简易翻页效果源码分享

    源码如下: <html> <head> <meta charset="UTF-8"> <title>slidePage</title> <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script> <style type="text/css"> *{ margin

  • Vue编译器AST抽象语法树源码分析

    目录 引言 baseCompile主要核心代码 如何写一个程序来识别 Token parse 函数解析模板字符串 引言 接上篇  Vue编译器源码分析compile 解析 baseCompile主要核心代码 // `createCompilerCreator` allows creating compilers that use alternative // parser/optimizer/codegen, e.g the SSR optimizing compiler. // Here we

  • go 熔断原理分析与源码解读

    目录 正文 熔断原理 熔断器实现 hystrixBreaker和googlebreaker对比 源码解读 结束语 正文 熔断机制(Circuit Breaker)指的是在股票市场的交易时间中,当价格的波动幅度达到某一个限定的目标(熔断点)时,对其暂停交易一段时间的机制.此机制如同保险丝在电流过大时候熔断,故而得名.熔断机制推出的目的是为了防范系统性风险,给市场更多的冷静时间,避免恐慌情绪蔓延导致整个市场波动,从而防止大规模股价下跌现象的发生. 同样的,在高并发的分布式系统设计中,也应该有熔断的机

  • Vue收集依赖与触发依赖源码刨析

    目录 定义依赖 收集依赖 触发依赖 总结 定义依赖 定义依赖是什么时候开始的呢?通过源码可以发现在执行_init函数的时候会执行initState(vm)方法: function initState(vm) { ... if (opts.data) { initData(vm); } else { var ob = observe((vm._data = {})); ob && ob.vmCount++; } ... } 先触发initData方法: function initData(v

  • Mybatis一级缓存和结合Spring Framework后失效的源码探究

    1.在下面的案例中,执行两次查询控制台只会输出一次 SQL 查询: mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"

  • Android源码探究之BaseDexClassLoader的使用

    目录 前言 一.dexPath(String) 二.optimizedDirectory 三.librarySearchPath 四.parent 五.总结 前言 一共有4个参数,分来来讲. 1:dexFile(String类型)2:optimizedDirectory(File类型)3:librarySearchPath(String类型)4:parent(ClassLoader类型) 一.dexPath(String) 官方的注释: * @param dexPath the list of

  • Vue源码探究之状态初始化

    继续随着核心类的初始化展开探索其他的模块,这一篇来研究一下Vue的状态初始化.这里的状态初始化指的就是在创建实例的时候,在配置对象里定义的属性.数据变量.方法等是如何进行初始处理的.由于随后的数据更新变动都交给观察系统来负责,所以在事先弄明白了数据绑定的原理之后,就只需要将目光集中在这一部分. 来仔细看看在核心类中首先执行的关于 state 部分的源码: initState // 定义并导出initState函数,接收参数vm export function initState (vm: Com

随机推荐