Vue Plugins

Introduction

Vue plugins are self-contained pieces of code that add functionality to your Vue application. To use a plugin, you employ the app.use() method in your Vue application:

import { createApp } from 'vue';

const app = createApp({});
app.use(myPlugin, {
  /* optional options */
});

A plugin can be an object with an install() method or simply a function acting as the install function. The install function receives the app instance and additional options passed to app.use().

const myPlugin = {
  install(app, options) {
    // Configure the app
  },
};

Common use cases for plugins include registering global components, custom directives, making resources injectable throughout the app, and adding global instance properties or methods.

Writing a Plugin

Let's create a simplified i18n (Internationalization) plugin that provides a global translation function. Create a separate file for the plugin:

// plugins/i18n.js
export default {
  install: (app, options) => {
    app.config.globalProperties.$translate = (key) => {
      return key.split('.').reduce((o, i) => (o ? o[i] : null), options);
    };
  },
};

This plugin exposes a $translate function that looks up translated strings using a dot-delimited key.

Install the plugin and provide translation options:

import i18nPlugin from './plugins/i18n';

app.use(i18nPlugin, {
  greetings: {
    hello: 'Bonjour!',
  },
});

Now, you can use $translate in your templates:

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

Provide / Inject with Plugins

Plugins also allow providing a function or attribute to the plugin's users. For example, providing access to the translation options:

// plugins/i18n.js
export default {
  install(app, options) {
    app.provide('i18n', options);
  },
};

Plugin users can inject the options into their components:

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

const i18n = inject('i18n');
console.log(i18n.greetings.hello);
</script>

Note: Use global properties sparingly to avoid confusion when multiple plugins inject global properties.

Last updated