Олег Марков
Интеграция 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 до уровня Middle — бесплатно!
Nuxt — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Nuxt
Лучшие курсы по теме

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