Nuxt

По моему мнению, официальная документация nuxt.js в недостаточной мере раскрывает процесс внедрения плагина в ваше приложение, поэтому хочу рассказать об этом поподробней.

Cначала я покажу какие НЕправильные варианты я встречал на своем пути разработчика.

Внимание, это НЕправильный вариант!

Vue.use({
 install(Vue) {
  // Тут инициализируется плагин, затем добавляется в прототип Vue под аллиасом $plugin
  Vue.prototype.$plugin = $plugin
 }
})

// Затем импортируется функция, которая возвращает сам плагин
// Это требуется для асинхронного получения плагина
export default () => $plugin

И даже встречал такое изобретение.
Внимание, это тоже НЕправильный вариант!

export default {
 install (Vue) {
   // Тут загрязняется глобальный объект Vue, в плагинах мы имеем доступ к плагину под аллиасом plugin
   // в компонентах после инициализации Vue, по аллиасу $plugin
  Vue.prototype.$plugin = Vue.plugin = plugin
 }
}

Итак, давайте найдем правильное решение. Вот пример из официальной документации, но как видите, не самый развернутый. Давайте разбираться!

import Vue from 'vue'
import VueI18n from 'vue-i18n'

// Установили i18n в прототип
Vue.use(VueI18n)

export default ({ app }, inject) => {
 // В данном случае мы добавили плагин в наше приложение и это
 // даст возможность обратится к нему из middleware и на страницах в `asyncData`/`fetch`
 app.i18n = new VueI18n({})
}

Но есть еще одна проблема, как обратиться к плагину i18n из другого плагина?
Например, у меня есть плагин, который показывает нотификации на страницах и я хочу показывать переведенные нотификации.
Если вы подумали о простом импорте, то это не сработает из-за асинхронного подключения плагинов. В момент подключения плагина нотифицкации, плагин переводов скорее всего еще не подключен и вы получите undefined.

Тут к нам на помощь приходит функция inject, которая приходит вторым параметром и которую нужно вызвать с двумя параметрами, чтобы заинжектить плагин.
Первый параметр типа String — это название нашего плагина, к которому прибавится префикс $, наш плагин будет доступен в ctx.app.$pluginName , в плагинах и this.$pluginName в компонентах.
Второй параметр типа Function — это наш плагин, функция которая будет выполняться при вызове $pluginName().

Внимание, правильный вариант, в случае если вам требуется получить доступ к одному плагину, в другом.

Перепишем официальный пример на:

export default (ctx, inject) => {
   inject('i18n', new VueI18n())
}

Теперь в плагине, где нужен плагин переводчик мы имеем доступ вот так:

export default ({ app }) => {
   app.$i18n() // ура работает
}

Ну, а если вам не требуется доступ к вашему новосозданному плагину из других плагинов, то делаем так, как показано в официальной документации:

export default ({ app }) => {
    // Будет доступен в компонентах через this.$i18n
    app.i18n = new VueI18n()
}