Skip to content

Vue 插件

插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。当我们需要在整个应用中普遍使用某些功能时,例如添加全局方法、全局组件、全局指令或为 app 实例添加 property 时,插件就非常有用。

一个典型的例子是 vue-router。当我们执行 app.use(router) 时,实际上就是在安装 vue-router 插件。这个插件会为我们的应用提供 $router$route property,并注册 <router-link><router-view> 全局组件。

编写一个插件

一个插件可以是一个拥有 install() 方法的对象,也可以直接是一个函数,它将被作为 install() 方法。这个 install 方法会接收到 app 实例作为第一个参数,以及用户传入的选项作为第二个参数。

下面是一个简单的插件示例,它为所有组件提供一个全局的 i18n (国际化) 翻译函数。

src/plugins/i18n.js

js
export default {
  install: (app, options) => {
    // 插件的逻辑

    // 1. 在 app.config.globalProperties 上添加一个全局 property
    // 这样在任何组件的模板中都可以通过 $translate 访问它
    app.config.globalProperties.$translate = (key) => {
      // 通过 `key` 从 `options` 中检索翻译
      // 例如:options.greetings.hello
      return key.split('.').reduce((o, i) => {
        if (o) return o[i]
      }, options)
    }

    // 2. 提供一个全局可注入的 API
    // 这样在任何组件的 <script setup> 中都可以通过 inject() 访问
    app.provide('i18n', options)

    // 3. 注册一个全局自定义指令
    app.directive('my-directive', {
      /* ... */
    })

    // 4. 注册一个全局组件
    // app.component('MyComponent', MyComponent)
  }
}

使用插件

插件通过 app.use() 方法来安装。它必须在 app.mount() 被调用之前使用。

src/main.js

js
import { createApp } from 'vue'
import App from './App.vue'
import i18nPlugin from './plugins/i18n'

const app = createApp(App)

// 插件的选项
const i18nOptions = {
  greetings: {
    hello: '你好!',
    welcome: '欢迎!'
  }
}

// 安装插件并传入选项
app.use(i18nPlugin, i18nOptions)

app.mount('#app')

现在,我们就可以在任何组件的模板中使用 $translate 了。

MyComponent.vue

vue
<script setup>
import { inject } from 'vue'

// 在 <script setup> 中使用 inject 获取插件提供的 property
const i18n = inject('i18n')
console.log(i18n.greetings.hello)
</script>

<template>
  <h1>{{ $translate('greetings.hello') }}</h1>
</template>

插件是一种强大而整洁的方式,用于组织和分发可在整个 Vue 应用中复用的代码,避免了污染全局作用域,并保持了逻辑的封装性。