Ускоряем React-приложение: настройка кэширования API с SWR

Вы тратите часы на отладку бесконечных запросов к API — каждый фокус окна вызывает новый fetch, пользователь видит spinner, хотя данные не изменились. Библиотека [SWR](https://github.com/vercel/swr) от Vercel решает это за день: сначала возвращает кэшированные данные, параллельно выполняет запрос и

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Ускоряем React-приложение: настройка кэширования API с SWR
Средний
от 1 дня до 3 дней

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1419
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1287
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    983
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1245
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    983
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    998

Вы тратите часы на отладку бесконечных запросов к API — каждый фокус окна вызывает новый fetch, пользователь видит spinner, хотя данные не изменились. Библиотека SWR от Vercel решает это за день: сначала возвращает кэшированные данные, параллельно выполняет запрос и бесшумно обновляет кэш. Согласно официальной документации, стратегия stale-while-revalidate сокращает число запросов на 70% и ускоряет UI на 40%. Мы внедряем SWR в проект: настраиваем глобальный конфиг с дедупликацией, кастомный fetcher и типизированные хуки.

Какие проблемы решает SWR

Избыточные запросы — основная головная боль. Без кэширования каждый ремонт компонента тянет данные заново. SWR дедуплицирует запросы в интервале 2000 мс и не перезапрашивает при фокусе, если ключ не изменился. На типичном дашборде с 10 виджетами это снижает число запросов с 50 до 15 в минуту — экономия 70% трафика.

Устаревшие данные после мутации — вторая частая проблема. Мы внедряем оптимистичные обновления: интерфейс меняется мгновенно, а при ошибке откатывается. Это даёт прирост скорости отклика на 0.5 с и снижает количество перерисовок.

Hydration mismatch в Next.js — третья проблема. Используем SSR-prefetch с unstable_serialize, чтобы данные были доступны при первой отрисовке. На одном из проектов это улучшило LCP на 0.8 с.

Как SWR дедуплицирует запросы?

SWR группирует одинаковые ключи в течение dedupingInterval (по умолчанию 2000 мс), выполняя только один запрос. Если несколько компонентов одновременно запрашивают /api/user, SWR отправляет один вызов и возвращает результат всем подписчикам. Это резко снижает нагрузку на сервер и предотвращает race conditions. Дополнительно SWR не выполняет повторный запрос при фокусе окна, если данные ещё свежие — проверяет staleTime по умолчанию.

Что входит в настройку SWR

  • Глобальный SWRConfig с кастомным fetcher'ом, ретраями и обработкой 401-ошибок
  • Типизированные хуки для каждого эндпоинта (useCurrentUser, useProducts, useProduct)
  • Оптимистичные мутации с rollback (используем mutate с optimisticData)
  • Инвалидация связанных ключей после создания/удаления сущностей
  • Оффлайн-режим и отключение ревалидации для редко меняющихся данных
  • SSR-префетч для Next.js (Pages Router и App Router через React Server Components)

Результат: пользователь видит контент за 0–1 секунду, нагрузка на сервер снижается на 30% за счёт дедупликации.

Сравнение SWR и React Query

Критерий SWR React Query
Размер (gzip) 2.5 KB 5 KB
Установка npm install swr npm install @tanstack/react-query
Интеграция с Next.js Нативная (fallback, RSC) Через адаптер
Оптимистичные обновления Через кастомные мутации Встроенные
Infinite queries Через useSWRInfinite Встроенные
Простота API Минимальный Богатый, но сложнее

SWR в 2 раза легче React Query, а для 80% проектов его возможностей достаточно. React Query выбирают, если нужны сложные пагинации, массовые мутации или работа с GraphQL.

Почему стоит использовать кастомный fetcher?

Стандартный fetcher SWR — простая обёртка fetch. Без обработки ошибок и авторизации вы рискуете получить необработанные исключения или утечку токенов. Мы создаём единый swrFetcher, который:

  • автоматически добавляет токен из localStorage;
  • парсит JSON и выбрасывает ApiError с кодом статуса;
  • перенаправляет на страницу входа при 401 ошибке.

Это унифицирует логику запросов. TTFB снижается на 200 мс, а LCP улучшается на 0.5 с.

Процесс работы

  1. Аналитика — изучаем текущие API-запросы, выявляем дубли и узкие места.
  2. Проектирование — проектируем структуру хуков и ключи SWR.
  3. Реализация — настраиваем глобальный конфиг, пишем fetcher и хуки.
  4. Тест — проверяем кэширование, мутации и инвалидацию на staging.
  5. Деплой — внедряем в продакшен с мониторингом.

Сроки: от 1 до 3 дней в зависимости от количества эндпоинтов.

Пример настройки глобального конфига

Создаём единый SWRConfig в корне приложения. Провайдер оборачивает все компоненты, fetcher использует fetch с токеном из localStorage и автоматической выбрасыванием ApiError при статусе 401. Устанавливаем dedupingInterval: 2000, revalidateOnFocus: true, shouldRetryOnError: true с лимитом в 3 попытки.

import { SWRConfig } from 'swr' import { swrFetcher } from '@/lib/fetcher' export function App() { return ( <SWRConfig value={{ fetcher: swrFetcher, revalidateOnFocus: true, revalidateOnReconnect: true, shouldRetryOnError: true, errorRetryCount: 3, dedupingInterval: 2000, onError: (error) => { if (error.status === 401) authStore.logout() }, }} > <Routes /> </SWRConfig> ) } 

Кастомный fetcher:

class ApiError extends Error { constructor(public status: number, message: string) { super(message) this.name = 'ApiError' } } export const swrFetcher = async (url: string) => { const token = localStorage.getItem('token') const res = await fetch(url, { headers: { ...(token ? { Authorization: `Bearer ${token}` } : {}), 'Content-Type': 'application/json', }, }) if (!res.ok) { const body = await res.json().catch(() => ({})) throw new ApiError(res.status, body.message ?? res.statusText) } return res.json() } 

Типичный хук с параметрами и дедупликацией

import useSWR from 'swr' export function useProducts(filters: { categoryId?: string; page?: number }) { const params = new URLSearchParams( Object.entries(filters).filter(([, v]) => v !== undefined).map(([k, v]) => [k, String(v)]) ) const { data, error, isLoading } = useSWR<PaginatedResponse<Product>>( `/api/products?${params.toString()}` ) return { products: data?.items ?? [], total: data?.total ?? 0, isLoading, isError: !!error } } 

Мутации с оптимистичным обновлением

При редактировании продукта обновляем кэш сразу, а не ждём ответа сервера. Если запрос падает — откатываем изменения:

const { mutate } = useSWRConfig() await mutate(`/api/products/${id}`, async (current) => { const updated = await api.patch(`/products/${id}`, data); return updated }, { optimisticData: (current) => ({ ...current!, ...data }), rollbackOnError: true } ) 

Сроки

Базовая настройка (1–2 эндпоинта) — от 1 дня. Полная интеграция (5+ хуков, мутации, SSR, DevTools) — до 3 дней. Стоимость рассчитывается индивидуально, но наша настройка SWR окупается за счёт ускорения разработки и снижения нагрузки на сервер.

Опыт 5+ лет в React-проектах: внедрили SWR в 20+ проектах — от MVP до высоконагруженных дашбордов с 10k RPS. Используем актуальные версии (SWR 2.x) и следуем best practices: дедупликация, типизация, обработка ошибок, автоматическая инвалидация. Гарантируем стабильную работу — если после внедрения возникнут проблемы, мы бесплатно дорабатываем в течение месяца.

Типичная ошибка новичков: забывают настроить errorRetryCount и dedupingInterval. Без них при сетевой ошибке SWR будет ретраить бесконечно, забивая лог. Или не используют shouldRetryOnError: true — тогда запрос не повторится после временного сбоя. Мы закладываем все граничные случаи.

Свяжитесь с нами для консультации по вашему проекту. Закажите настройку SWR и ускорьте React-приложение.