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

Интеграция Swiper в Nuxt

Автор

Олег Марков

Введение

Интерактивные слайдеры — неотъемлемая часть современного веб-разработки. Они позволяют удобно размещать галереи, карусели товаров, отзывы клиентов, привлекательные баннеры и многое другое. Одно из самых популярных решений для создания слайдеров — библиотека Swiper. В вашем Nuxt-проекте Swiper помогает добиться анимации, адаптивности и гибкой настройки слайдов.

Здесь я покажу, как интегрировать Swiper в проект на Nuxt, объясню нюансы установки, настройки и динамического обновления содержимого слайдера. Особый акцент будет на best practices, отличиях при работе с Vue 2 и Vue 3 версиями Nuxt, а также на вопросах серверного рендеринга и оптимизации производительности.

Установка Swiper в Nuxt

Основные сценарии установки

Перед тем как начинает использовать Swiper в Nuxt, убедитесь, какая версия вашего фреймворка используется:

  • Nuxt 2 основан на Vue 2
  • Nuxt 3 работает с Vue 3

Это важно, так как Swiper с версией 7.0 перешёл на поддержку Vue 3.

Шаг 1 — Установка зависимостей

Для Nuxt 2:

npm install swiper@6 vue-awesome-swiper

Для Nuxt 3:

npm install swiper

Шаг 2 — Импорт и глобальная регистрация (Nuxt 2)

В Nuxt 2 удобнее делать регистрацию глобальной, особенно если вы используете Swiper на нескольких страницах.

Создайте файл плагина, например plugins/vue-awesome-swiper.js:

// plugins/vue-awesome-swiper.js
import Vue from 'vue'
import VueAwesomeSwiper from 'vue-awesome-swiper'

// Подключаем стили Swiper
import 'swiper/css/swiper.css'

Vue.use(VueAwesomeSwiper)

Не забудьте прописать плагин в nuxt.config.js:

export default {
  plugins: [{ src: '~/plugins/vue-awesome-swiper.js', mode: 'client' }]
}

Используем mode: 'client', чтобы Swiper рендерился только на клиенте.

Импорт компонентов в Nuxt 3 (Vue 3)

В Nuxt 3 вы используете компоненты Swiper напрямую.

<script setup>
import { Swiper, SwiperSlide } from 'swiper/vue'
// Импортируйте базовые стили
import 'swiper/css'
</script>

Swiper отлично работает в клиентских компонентах Nuxt 3 "из коробки", не требует отдельного плагина.

Swiper — это мощная и удобная библиотека для создания слайдеров и каруселей на веб-сайтах. Интеграция Swiper в Nuxt позволяет создавать привлекательные и интерактивные элементы интерфейса, улучшая пользовательский опыт. Если вы хотите детальнее погрузиться в мир Nuxt, освоить все его тонкости и стать настоящим профессионалом — приходите на наш большой курс Nuxt - fullstack Vue фреймворк. На курсе 129 уроков и 13 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Размещение Swiper в вашем компоненте

Возьмём пример простого горизонтального слайдера. Вот как это выглядит для обеих версий Nuxt:

Nuxt 2 (VueAwesomeSwiper):

<template>
  <swiper :options="swiperOptions">
    <swiper-slide v-for="(slide, idx) in slides" :key="idx">
      {{ slide }}
    </swiper-slide>
    <!-- Навигация -->
    <div class="swiper-pagination" slot="pagination"></div>
    <div class="swiper-button-prev" slot="button-prev"></div>
    <div class="swiper-button-next" slot="button-next"></div>
  </swiper>
</template>

<script>
export default {
  data() {
    return {
      slides: ['Слайд 1', 'Слайд 2', 'Слайд 3'],
      swiperOptions: {
        loop: true,
        pagination: { el: '.swiper-pagination', clickable: true },
        navigation: {
          nextEl: '.swiper-button-next',
          prevEl: '.swiper-button-prev',
        }
      }
    }
  }
}
</script>

Здесь задаются параметры для пагинации и управления стрелками.

Nuxt 3 (Swiper@7+):

<template>
  <Swiper
    :modules="[Navigation, Pagination]"
    :loop="true"
    :pagination="{ clickable: true }"
    :navigation="true"
  >
    <SwiperSlide v-for="(slide, idx) in slides" :key="idx">
      {{ slide }}
    </SwiperSlide>
  </Swiper>
</template>

<script setup>
import { Swiper, SwiperSlide } from 'swiper/vue'
import { Navigation, Pagination } from 'swiper'
import 'swiper/css'
import 'swiper/css/navigation'
import 'swiper/css/pagination'

const slides = ['Слайд 1', 'Слайд 2', 'Слайд 3']
</script>

В Nuxt 3 гораздо проще использовать модульный стиль и динамически управлять импортом нужных модулей и стилей.

Конфигурирование и расширенная настройка

Основные опции Swiper

Мощность Swiper заключается в большом количестве опций и модулей, которые можно включать как при инициализации, так и динамически:

  • loop — зацикливание слайдов
  • autoplay — автоматическая прокрутка (можно задать задержку)
  • speed — скорость анимации
  • slidesPerView — количество видимых слайдов
  • spaceBetween — расстояние между слайдами
  • navigation — стрелочки навигации
  • pagination — точки/кнопки навигации
  • scrollbar — ползунок
  • breakpoints — адаптивность под разные экраны

Смотрите, я покажу вам пример где добавляется автоматическая прокрутка и настраивается количество слайдов на различных разрешениях:

<Swiper
  :modules="[Autoplay, Pagination]"
  :autoplay="{ delay: 5000 }" // 5 секунд на слайд
  :slides-per-view="1"
  :space-between="10"
  :breakpoints="{
    640: { slidesPerView: 1, spaceBetween: 20 },
    768: { slidesPerView: 2, spaceBetween: 40 },
    1024: { slidesPerView: 3, spaceBetween: 50 }
  }"
  :pagination="{ clickable: true }"
>
  <SwiperSlide v-for="slide in slides" :key="slide.id">
    {{ slide.title }}
  </SwiperSlide>
</Swiper>

Такая настройка обеспечит разное количество видимых слайдов на мобильных, планшетах и десктопах.

Динамические данные в Swiper

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

В Nuxt 3, когда данные загружаются асинхронно, зачастую помогает структура такого типа:

<template>
  <Swiper v-if="slides.length">
    <SwiperSlide v-for="slide in slides" :key="slide.id">
      {{ slide.title }}
    </SwiperSlide>
  </Swiper>
</template>

<script setup>
import { Swiper, SwiperSlide } from 'swiper/vue'
import { ref, onMounted } from 'vue'

const slides = ref([])

onMounted(async () => {
  // Моделируем асинхронную загрузку данных с сервера
  slides.value = await fetch('/api/slides').then(res => res.json())
})
</script>

Здесь Swiper появляется только если массив слайдов не пустой.

Пользовательские кнопки и управление слайдером

Swiper поддерживает управление через методы и кастомные кнопки. Покажу на примере управления слайдером вручную:

<template>
  <Swiper ref="mySwiper" ...>
    <SwiperSlide>Первый</SwiperSlide>
    <SwiperSlide>Второй</SwiperSlide>
  </Swiper>
  <button @click="slidePrev">Назад</button>
  <button @click="slideNext">Вперёд</button>
</template>

<script setup>
import { Swiper, SwiperSlide } from 'swiper/vue'
import { ref } from 'vue'

const mySwiper = ref(null)

function slidePrev() {
  // Вызываем метод предыдущего слайда
  mySwiper.value.swiper.slidePrev()
}

function slideNext() {
  mySwiper.value.swiper.slideNext()
}
</script>

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

SSR (Server Side Rendering) и Nuxt

Swiper ориентирован на клиентский рендеринг, так как использует DOM. Если вы интегрируете с SSR, некоторые нюансы стоит учитывать.

  • В Nuxt 2 используйте плагины только на клиенте (mode: 'client').
  • В Nuxt 3 удобно использовать директиву <client-only> вокруг Swiper, чтобы избежать ошибок из-за отсутствия DOM на сервере.
<template>
  <client-only>
    <Swiper ...>
      <!-- слайды -->
    </Swiper>
  </client-only>
</template>

Этот подход позволяет избежать ошибок во время сборки статических страниц или при server-side rendering.

Ленивая загрузка изображений

Для производительных сайтов важно использовать lazy loading картинок в слайдере. У Swiper встроена поддержка lazy loading.

<Swiper :modules="[Lazy]" :lazy="true">
  <SwiperSlide v-for="img in images" :key="img.src">
    <img v-lazy="img.src" />
  </SwiperSlide>
</Swiper>

Или через обычный HTML с нужным классом:

<img class="swiper-lazy" data-src="image.jpg" />
<div class="swiper-lazy-preloader"></div>

Swiper сам подгружает изображение только при появлении нужного слайда.

Стилизация и кастомизация

Swiper по умолчанию поставляется с CSS, который можно импортировать. Для доработки внешнего вида удобно добавлять свои стили.

  • Используйте CSS-переменные для управления цветами кнопок и пагинации.
  • Для сложной кастомизации стилизуйте нужные CSS-классы (например, .swiper-button-next, .swiper-pagination-bullet).

Пример кастомизации стрелок:

.swiper-button-next,
.swiper-button-prev {
  color: #ff4500;
  background: rgba(255,255,255,0.6);
  border-radius: 50%;
  width: 40px;
  height: 40px;
}

Стили можно добавлять глобально или внутри компонента через <style scoped>.

Swiper позволяет полностью изменять внешний вид пагинации через прямые шаблоны или используя слот (в Nuxt 3 и Vue 3).

Использование Swiper c другими библиотеками и в модальных окнах

Если ваш слайдер появляется в модальном окне, после динамического mount требуется обновить Swiper, вызвать метод swiper.update(). Это можно реализовать через ref-ссылку на экземпляр слайдера:

// Вызывайте этот метод после открытия модального окна
mySwiper.value.swiper.update()

Это важно для корректного расчета размеров, иначе Swiper может неправильно отображать ширину слайдов.

Интеграция с Nuxt позволяет свободно совмещать Swiper с Vuex, Axios или Composition API — логику можно организовать максимально гибко.

Локализация, доступность и SEO

Swiper не предоставляет встроенной локализации, но позволяет работать с любыми строками, которые вы подгружаете в vue-компонент.

  • Для улучшения доступности (a11y) используйте модуль A11y.
  • Для SEO важно, чтобы основной контент был доступен для индексирования — если используете SSR, показывайте fallback-контент без Swiper.

Пример:

<template>
  <div v-if="showSwiper">
    <Swiper ...>
      <!-- слайды -->
    </Swiper>
  </div>
  <ul v-else>
    <li v-for="slide in slides" :key="slide.id">{{ slide.title }}</li>
  </ul>
</template>

<script setup>
const showSwiper = process.client
</script>

Такая схема позволяет иметь индексируемый контент и полноценный слайдер для пользователей.

Экзотические сценарии: вертикальный режим, фракционная пагинация, динамические модули

  • Меняйте направление слайдов через свойство direction: 'vertical'
  • Для отображения текущего номера слайда используйте тип pagination.type: 'fraction'
  • Swiper поддерживает динамическую загрузку и отключение модулей — подключайте только нужные для уменьшения bundle size.

Заключение

Swiper — мощный и гибкий инструмент для создания слайдеров и каруселей в Nuxt. Интеграция несложная и сводится к правильному подключению пакетов, импортам стилей, настройке опций и учёту особенностей SSR. Вы всегда можете кастомизировать стиль, поддерживать динамические данные и создать любой дизайн, который подходит именно вашему проекту. Следуйте этому гиду — и Swiper будет отлично работать в любом Nuxt-приложении.

Интеграция Swiper — это лишь один из способов расширить функциональность Nuxt-приложения. Чтобы создавать полноценные и сложные веб-приложения, необходимо освоить множество других навыков, таких как работа с данными, роутингом, компонентами и плагинами. На курсе Nuxt - fullstack Vue фреймворк вы получите комплексные знания и практический опыт, необходимые для успешной разработки веб-приложений на Nuxt. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Nuxt прямо сегодня.

Частозадаваемые технические вопросы по теме

Как настроить динамическую высоту Swiper, если слайды разной высоты?

Используйте опцию autoHeight: true при инициализации Swiper. Пример:

<Swiper :auto-height="true">
  <!-- слайды -->
</Swiper>

Это автоматически подгонит высоту под текущий слайд.

Почему появляются ошибки "window is not defined" при сборке с SSR?

Избегайте инициализации Swiper на сервере. Используйте <client-only> (Nuxt 3) или режим 'client' для плагинов (Nuxt 2). Так Swiper не будет пытаться получить доступ к window и DOM при SSR.

Как организовать синхронизацию двух слайдеров (thumbs и main)?

С помощью модуля Thumbs. В одном компоненте соедините два Swiper:

const thumbsSwiper = ref(null)

<Swiper :thumbs="{ swiper: thumbsSwiper }" ...>...</Swiper>
<Swiper ref="thumbsSwiper" ...>...</Swiper>

Главный Swiper будет синхронизироваться с превью.

Можно ли вынести Swiper в отдельный компонент и сделать его переиспользуемым?

Да. В Nuxt 3 создайте Vue-компонент, принимайте через props массив слайдов и конфиг. Внутри обрабатывайте эти данные и рендерьте Swiper и SwiperSlide с нужными опциями.

Что делать, если Swiper не реагирует на изменения размера окна или родителя?

Вызовите вручную метод обновления после ресайза окна либо используйте observer: true, observeParents: true в настройках Swiper. Это позволит Swiper автоматически подстраиваться под изменения в DOM.

Стрелочка влевоГайд по созданию адаптивных интерфейсов с Nuxt UIНастройка индикатора загрузки в NuxtСтрелочка вправо

Постройте личный план изучения 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 ₽
Подробнее

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