Прискорюємо 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
    1244
  • 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%. Ми впроваджуємо кешування даних React з 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% за рахунок дедуплікації. Економія на серверних ресурсах — до $2000 на місяць.

Порівняння 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. Деплой — впроваджуємо в продакшен з моніторингом.
  6. Рев'ю коду — оптимізуємо ключі та додаємо граничні випадки.

Терміни: від 1 до 3 днів залежно від кількості ендпоінтів. Ми пропонуємо налаштування SWR під ключ — пишіть нам, оцінимо ваш проект безкоштовно.

Приклад налаштування глобального конфігу

Створюємо єдиний 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 під ключ — від $500. Економія на серверних ресурсах — до $2000 на місяць. Наше налаштування окупається за рахунок прискорення розробки та зниження навантаження на сервер.

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

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

Зв'яжіться з нами для консультації по вашому проєкту. Замовте налаштування SWR під ключ і прискорте React-додаток. Пишіть на пошту або в Telegram — оцінимо проект безкоштовно.