对 Vue app.use() 方法的理解

摘要:

上班摸鱼时间瞅了一眼 app.use() 的源码实现,随手写了一段理解,不保真,感兴趣随便看看。

源码

ts 复制代码
// 应用api use,使用各种plugin
  use(plugin: Plugin, ...options: any[]) {
    if (installedPlugins.has(plugin)) {
      __DEV__ && warn(`Plugin has already been applied to target app.`)
    } else if (plugin && isFunction(plugin.install)) {
      installedPlugins.add(plugin)
      plugin.install(app, ...options)
    } else if (isFunction(plugin)) {
      installedPlugins.add(plugin)
      plugin(app, ...options)
    } else if (__DEV__) {
      warn(
        `A plugin must either be a function or an object with an "install" ` +
          `function.`
      )
    }
    return app
  },

实现原理

插件的 install 方法包括一个 app 参数.

如:

ts 复制代码
export default const plugin = {
    install (app, options) {
        app.config.globalProperties.$tracker = tracker
        app.config.errorHandler = () => {
            ....
        }
    }
}

在执行 app.use(plugin) 时,相当于将应用实例化的 app 作为传入 install 的第一个参数,对应用内的 app 执行一遍 install 方法中的操作。

以下是一个应用内创建 Vue 应用的代码:

ts 复制代码
import { createApp } from 'vue'
import App from './App.vue'
import plugin from './plugin'

const app = createApp(App)
app.use(plugin)
app.mount('#app')

这段代码的作用,与下面一段代码一致:

ts 复制代码
import { createApp } from 'vue'
import App from './App.vue'
import plugin from './plugin'
import tracker from './tracker'

const app = createApp(App)
// app.use(plugin)
app.config.globalProperties.$tracker = tracker
app.config.errorHandler = () => {
    ....
}
app.mount('#app')

简单来说,app.use()方法,就是把插件中对 install 方法的第一个参数(app) 做的事添加到你的应用中创建的 app 实例上。

所以,看似神秘的 App.use() 方法,实则只是给代码的组织和扩展提供了一种 简洁 和 优雅 的实现方案,本质,还是对 app 实例进行的一些操作。

当然, App.use() 方法还包括一些防止重复注册的额外操作,但不是核心功能。

需要注意

本质上 app.use() 还是利用的 app 实例是引用类型这一点实现的,所以,在写插件时,千万不要对插件的 install(app, options) 方法的 app 参数用深拷贝,深拷贝后这个插件就废了。

相关推荐
小陈同学呦9 小时前
前端如何处理订单状态导航的数据竞态问题
前端·javascript
开发者每周简报9 小时前
网海三部曲·无名宗师传
javascript·人工智能
喵个咪9 小时前
GoWind Toolkit 前端代码生成|Vue3(ElementPlus/Vben)、React(AntDesign)全自动一键生成教程
前端·vue.js·react.js
qq_25183645710 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
之歆11 小时前
Day01_ES6+ 专业指南:从基础到实战的现代JavaScript开发(下)
前端·javascript·es6
kyriewen12 小时前
AI生成代码快如闪电,但我修了三个小时——它到底帮了谁?
前端·javascript·ai编程
竹林81813 小时前
用 wagmi v2 和 viem 手写 NFT 市场批量上架功能,我踩遍了所有异步坑
javascript
zithern_juejin13 小时前
数组扁平化
javascript
清溪54913 小时前
n8n表达式沙箱逃逸至RCE漏洞-CVE-2025-68613复现
javascript·安全
Hilaku13 小时前
多标签页并发请求导致 Token 刷新失败?只有 15行代码就能解决 !
前端·javascript·程序员