логотип PurpleSchool
логотип PurpleSchool

Руководство по использованию плагинов в 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 для удобной работы с датами:

  1. Установите библиотеку:

    npm install moment
  2. Создайте плагин:

// plugins/moment.js
import moment from 'moment'

export default (context, inject) => {
  // Добавим во все компоненты доступ к moment через $moment
  inject('moment', moment)
}
  1. Зарегистрируйте плагин в 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 для всплывающих уведомлений:

  1. Установите саму библиотеку:

    npm install vue-toastification
  2. Создайте плагин:

// 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.

  1. Зарегистрируйте плагин (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-плагинов.

Стрелочка влевоИспользование scripts в NuxtГайд по Nuxt JS для начинающихСтрелочка вправо

Постройте личный план изучения Nuxt до уровня Middle — бесплатно!

Nuxt — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Nuxt

Генерация статического сайта с помощью NuxtКак использовать useAsyncData в NuxtКак использовать SVG в NuxtКоманды для запуска NuxtРабота с JSON-данными в NuxtКак настроить HTML-шаблон в NuxtГенерация статического сайта с помощью NuxtРуководство по получению данных с Fetch в NuxtКак отключить определенные функции в NuxtРабота с данными в Nuxt с помощью useNuxtDataНастройка и использование cookie в NuxtГайд по аутентификации (auth) в NuxtКак создавать API-маршруты в Nuxt
Использование Vite для ускорения разработки в NuxtРуководство по использованию TypeScript в NuxtКак запустить Nuxt-приложение в productionКак работает Server-Side Rendering SSR в NuxtНастройка и оптимизация серверной части Nuxt-приложенияРуководство по настройке маршрутизации в NuxtКакие проекты разумно реализовывать на NuxtИнструкция по управлению пакетами NPM в NuxtИнтеграция Node.js для Nuxt-приложенияНастройка мета-тегов для SEO в NuxtНастройка и использование HTTPS в NuxtКак отлавливать и обрабатывать ошибки в NuxtКак развернуть Nuxt приложение в DockerРуководство по развертыванию приложений в Nuxt CloudКак оптимизировать сборку на NuxtИнтеграция Laravel и Nuxt
Открыть базу знаний

Лучшие курсы по теме

Иконка ракетыСкоро!
изображение курса

Nuxt

Антон Ларичев
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий