对 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 参数用深拷贝,深拷贝后这个插件就废了。

相关推荐
智购科技自动售货机厂家21 分钟前
2026自动售货机AI视觉识别优化:从YOLOv11n模型量化到RKNN部署的端侧推理工程实践~YH
javascript·人工智能·yolo·机器学习·计算机视觉·目标跟踪·perl
晓说前端24 分钟前
TypeScript 核心语法应用 —— Vue 3 中的使用(下)
前端·javascript·typescript·类型系统
lancyu3 小时前
# Agent Loop:AI Agent 的唯一直心骨
开发语言·javascript·人工智能
半个落月4 小时前
JavaScript 单例模式详解:从唯一实例到按钮事件
javascript
weixin_BYSJ19875 小时前
springboot智慧公共交通系统---附源码51123
java·javascript·spring boot·python·django·flask·php
sir.山6 小时前
在 Vue 3 项目中使用 Mock 数据
前端·vue.js·vue3·vite
你别说话了15 小时前
Vue项目解决跨域
前端·javascript·vue.js
指尖时光.15 小时前
Three.js 超全入门综合案例
开发语言·javascript·ecmascript
唐青枫16 小时前
http-server:别再双击 index.html,一条命令把目录变成网站
前端·javascript
学习星球18 小时前
Solid.js 实战:拆解官方 RealWorld 项目
开发语言·javascript·vue.js