Олег Марков
Руководство по использованию плагинов в Nuxt
Введение
Плагины являются мощным инструментом в Nuxt, который позволяет подключать сторонние библиотеки, собственные функции и выполненный на стороне клиента или сервера код к вашему приложению. С помощью плагинов можно внедрять глобальные миксины, фильтры, собственные инъекции в контекст приложения и расширять возможности Nuxt практически без ограничений.
В ходе этой статьи я подробно покажу, как правильно создавать, подключать и использовать плагины в Nuxt, расскажу о типичных сценариях применения и тонкостях, которые стоит учитывать в продакшн-разработке.
Что такое плагин в Nuxt?
Плагин в Nuxt — это файл, который экспортирует функцию, получающую особый контекст Nuxt и позволяющую выполнять нужные действия до инициализации корневого экземпляра Vue (или любого экосистемного объекта, если речь о Nuxt 3). В Nuxt плагины широко применяются для:
- Подключения и глобальной инициализации библиотек (например, axios, moment.js).
- Реализации собственных инструментов или сервисов, доступных во всем приложении.
- Расширения контекста приложения через inject.
- Исполнения определенного кода по разным условиям (на клиенте, сервере, только один раз и др.).
Давайте перейдем к практическим аспектам.
Структура и размещение плагинов в Nuxt
Nuxt ожидает, что ваши плагины будут находиться в директории plugins
вашего проекта. Это может выглядеть следующим образом:
my-nuxt-project/
plugins/
axios.js
vue-mixins.js
custom-service.client.js
На практике каждое расширение или внешний модуль, инициализацию которого вы хотите произвести до старта приложения, оформляется отдельным файлом.
Наименование файлов
Имя файла может многое сказать Nuxt о том, когда и как будет загружаться плагин. Например:
my-plugin.js
— загружается везде (универсально).my-plugin.client.js
— загружается только на клиенте.my-plugin.server.js
— загружается только на сервере.
Такой подход позволяет тонко управлять поведением каждого плагина.
Создание и подключение плагинов
Создание базового плагина
Покажу вам простейший пример плагина:
// plugins/hello.js
export default (context, inject) => {
// В функцию попадает контекст Nuxt и функция inject
// Добавим в приложение глобальную функцию $hello
inject('hello', () => console.log('Привет, мир!'))
}
Этот фрагмент, после правильного подключения (см. ниже), позволит во всех компонентах обращаться к функции через this.$hello()
.
Подключение плагина в Nuxt 2
В Nuxt 2 плагины регистрируются в файле nuxt.config.js
:
export default {
plugins: [
'~/plugins/hello.js', // плагин будет подключен универсально
]
}
Если вы хотите подключить плагин только на клиенте, используйте суффикс .client.js
, либо явно укажите через объект:
export default {
plugins: [
{ src: '~/plugins/only-client.js', mode: 'client' }
]
}
Подключение плагина в Nuxt 3
В Nuxt 3 плагины регистрируются просто размещением их в папке plugins. Дополнительная регистрация не требуется — Nuxt автоматически включает все файлы из этой папки в приложение:
plugins/
axios.ts
my-tool.server.ts
- Файл
my-tool.server.ts
подхватится только на сервере. - Типизация поддерживается из коробки.
Плагины позволяют расширять функциональность Nuxt-приложения, добавляя собственные компоненты, библиотеки и сервисы. Умение создавать и использовать плагины — это важный навык для любого Nuxt-разработчика, позволяющий решать широкий круг задач. Если вы хотите детальнее погрузиться в мир Nuxt, освоить все его тонкости и стать настоящим профессионалом — приходите на наш большой курс Nuxt - fullstack Vue фреймворк. На курсе 129 уроков и 13 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Передача в inject: что это такое и как использовать
Inject — это мощное средство, позволяющее "впрыснуть" любой код или объект во все части вашего приложения таким образом, что он автоматически появится в каждом компоненте, сторе или другом сервисе.
Пример:
// plugins/logger.js
export default (context, inject) => {
// Внедряем глобально $log
inject('log', (message) => {
console.log('[App Log]', message)
})
}
Теперь в любом компоненте:
export default {
mounted() {
this.$log('Я был смонтирован!') // В консоли появится сообщение
}
}
Обратите внимание: все такие глобально внедренные сущности становятся доступны с префиксом $
.
Использование сторонних библиотек через плагины
Очень часто плагины применяют для глобального подключения инструментов. Например, подключим библиотеку moment.js для удобной работы с датами:
Установите библиотеку:
npm install moment
Создайте плагин:
// plugins/moment.js
import moment from 'moment'
export default (context, inject) => {
// Добавим во все компоненты доступ к moment через $moment
inject('moment', moment)
}
- Зарегистрируйте плагин в nuxt.config.js (для Nuxt 2):
export default {
plugins: ['~/plugins/moment.js']
}
Теперь используйте во всех компонентах:
export default {
mounted() {
const now = this.$moment().format('YYYY-MM-DD')
// Переменная now будет содержать сегодняшнюю дату
}
}
Ограничение области действия: плагины только для клиента или только для сервера
Иногда нужно, чтобы плагин запускался только на одной из сторон (например, при работе с браузерными API).
Примеры с оговорками по сторонам
Только клиент:
// plugins/localstorage.client.js
export default (context, inject) => {
inject('storage', {
get: (key) => localStorage.getItem(key),
set: (key, value) => localStorage.setItem(key, value)
})
}
Файл с суффиксом .client.js
гарантирует, что код не попадет на сервер.
Только сервер:
// plugins/db.server.js
export default (context, inject) => {
// Подключение к БД или серверные действия
inject('db', {
connect: () => { /* ... */ }
})
}
Такой плагин не будет мешать клиентским сборкам.
Жизненный цикл и порядок инициализации плагинов
Плагины инициализируются сразу после создания Nuxt-контекста и до старта рендера страницы. Это значит, что любые данные инициализации, а также внедряемые вами функции, будут доступны во всех сторонах приложения и сторе.
Порядок загрузки:
- Nuxt собирает все файлы из папки
plugins
(или прописанные вручную в Nuxt 2). - Последовательность инициализации определяется порядком, в котором плагины указаны (в Nuxt 2) или алфавитным порядком файлов (в Nuxt 3).
- Контекст приложения инициализирован, подключаются плагины, только затем стартует Vue/компонентная инициализация.
Влияние на SSR (Server Side Rendering):
- Если плагин определен как клиентский, ни одна из его частей не попадет в серверный рендеринг.
- Плагины серверные не тронут клиентскую часть.
Практические сценарии и кейсы использования
Чтобы вы лучше поняли, как плагины реально используются, приведу сразу несколько кейсов с кодом.
Инъекция глобальных настроек и утилит
Создадим утилиту для форматирования текста:
// plugins/formatter.js
export default (context, inject) => {
inject('formatTitle', str => str.trim().toUpperCase())
}
В компоненте:
// В шаблоне
{{ $formatTitle(' привет nuxt ') }} <!-- Выведет: ПРИВЕТ NUXT -->
Глобальный миксин через плагины
Можно добавить глобальный миксин:
// plugins/global-mixin.js
import Vue from 'vue'
export default () => {
Vue.mixin({
mounted() {
console.log('Компонент смонтирован! [MiXin]')
}
})
}
Каждый компонент приложения теперь будет выводить сообщение при монтировании.
Подключение сторонней Vue плагин-библиотеки
Давайте добавим библиотеку vue-toastification для всплывающих уведомлений:
Установите саму библиотеку:
npm install vue-toastification
Создайте плагин:
// plugins/toast.client.js
import Vue from 'vue'
import Toast from 'vue-toastification'
import 'vue-toastification/dist/index.css'
export default () => {
Vue.use(Toast)
}
Суффикс .client.js
нужен, потому что библиотека манипулирует DOM.
- Зарегистрируйте плагин (Nuxt 2):
export default {
plugins: ['~/plugins/toast.client.js']
}
Теперь вы можете использовать $toast
в шаблонах и методах компонентов.
Особенности и ограничения
Не используйте плагины для state management
Хотя через плагины удобно делать глобальные инъекции, не стоит использовать их для хранения состояния, критичного к реактивности. Для глобального стейта обычно применяют Vuex (Nuxt 2) или Pinia (Nuxt 3).
Плагины не предназначены для хранения "данных приложения"
Храните значения типа стейта и данных только в подходящих для этого местах (store, cookie, localStorage). Плагин — это место для функций и утилит, а не переменных.
Plug-инъекции не всегда доступны во вне компонентов
Инъекции через inject будут доступны только внутри экземпляров компонентов, в composables (Nuxt 3) или через context. Если вы работаете с чистым js-файлом без Nuxt-контекста, доступ через this.$xxx
невозможен.
Лучшая практика при создании плагинов
- Делайте плагины модульными и изолированными. Каждый должен отвечать только за одну задачу.
- Грамотно используйте ограничение по окружению. Не вставляйте код, который может вызвать ошибку на сервере, в неограниченные плагины.
- Старайтесь не нагружать плагины тяжелыми операциями. Всё, что можно вынести за пределы инициализации, лучше выносить.
- Писать плагины на TypeScript (Nuxt 3). Это даст дополнительную безопасность типов и удобство.
- Проверьте, что ваша инъекция не пересекается с именами других библиотек. Названия функций и классов должны быть уникальными и с префиксом
$
.
Что нового появилось в работе с плагинами в Nuxt 3
Большая часть концепций осталась прежней, но кое-что изменилось:
- Автоматическое подключение плагинов — не требуется прописывать в nuxt.config.
- Импорт плагинов поддерживает TypeScript из коробки.
- Новые хуки и возможности работы с контекстом.
- Явные ограничения через расширения имен файлов (.client.ts/.server.ts).
- Инъекция работает и в composables через useNuxtApp().$xxx.
Основные ошибки и пути их решения
Ошибка: "xxx is not a function" или "Cannot read property xxx of undefined"
Часто связано с тем, что плагин не был подключен или функция вызвана вне компонента. Проверьте регистрацию плагина и что вызов происходит действительно внутри компонента или через правильно переданный контекст (в asyncData, fetch, setup).
Ошибка: "window is not defined"
Это происходит при запуске кода, требующего DOM, на сервере. Ограничьте такой плагин режимом .client.js
.
Не видит инъекцию в setup()
Если вы работаете в setup() с Composition API (Nuxt 2.13+ или Nuxt 3):
import { useNuxtApp } from '#app'
setup() {
const { $hello } = useNuxtApp()
$hello('Привет!')
}
Заключение
В Nuxt плагины выступают гибким инструментом для глобального расширения функциональности приложения и интеграции внешних библиотек. Правильное понимание устройства и областей применения плагинов помогает создавать чистую, удобную и хорошо масштабируемую архитектуру. Не забывайте тестировать ваши плагины, следите за их последовательностью подключения и всегда четко разделяйте клиентскую и серверную логику, особенно если используете SSR.
Использование плагинов — это лишь один из аспектов разработки Nuxt-приложений. Чтобы стать настоящим профессионалом, необходимо освоить множество других навыков, таких как роутинг, работа с данными, стилизация и деплой. На курсе Nuxt - fullstack Vue фреймворк вы получите все необходимые знания и практические навыки для разработки современных веб-приложений на Nuxt. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Nuxt прямо сегодня.
Частозадаваемые технические вопросы по теме статьи и ответы на них
Как получить доступ к инъекциям плагинов в сторе (Vuex/Pinia)?
Ответ:
В Nuxt 2 инъекции из плагинов автоматически доступны в actions и getters Vuex через объект контекста. Пример:
js
actions: {
fetchData({ commit }, payload, { $axios }) {
// $axios будет доступен, если внедрен через inject в плагине
}
}
В Nuxt 3 с Pinia используйте:js
const { $myInject } = useNuxtApp()
Как использовать inject внутри Composition API (setup)?
Ответ:
В Nuxt 3 используйте useNuxtApp()
:
js
setup() {
const { $myApi } = useNuxtApp()
$myApi.doSomething()
}
В Nuxt 2.13+ с Composition API аналогично.
Почему мой плагин не виден компоненту, хотя я его зарегистрировал?
Ответ:
Проверьте, совпадает ли путь к файлу в nuxt.config, нет ли опечаток и не ограничен ли файл по суффиксу .client
или .server
(особенно если вы тестируете на другой стороне).
Как использовать несколько библиотек в одном плагине?
Ответ:
Вы можете импортировать и инициализировать сразу несколько библиотек, затем внедрять их по отдельности через inject:
js
// plugins/multilib.js
import libA from 'lib-a'
import libB from 'lib-b'
export default (ctx, inject) => {
inject('libA', libA)
inject('libB', libB)
}
Можно ли динамически подключать плагины в рантайме?
Ответ:
Нет, все плагины должны быть определены до запуска Nuxt-приложения. Для динамической загрузки используйте динамический импорт/инициализацию в компонентах или хранилище, а не через систему Nuxt-плагинов.
Постройте личный план изучения Nuxt до уровня Middle — бесплатно!
Nuxt — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Nuxt
Лучшие курсы по теме

Nuxt
Антон Ларичев
TypeScript с нуля
Антон Ларичев