Реалізація Service Worker: стратегії кешування та офлайн-режим

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

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

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Реалізація Service Worker: стратегії кешування та офлайн-режим
Середній
~2-3 дні
Часті запитання

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

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    957
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    947

При завантаженні сайту кожен зайвий запит до сервера збільшує LCP. Без SW ресурси завантажуються з мережі при кожному переході, що особливо критично для мобільних користувачів з нестабільним з'єднанням. Ми вирішуємо цю проблему, впроваджуючи фоновий скрипт, який перехоплює запити. Правильна конфігурація стратегій дозволяє скоротити LCP на 40–60%, а TTFB — у 3–5 разів. Наш досвід показує, що грамотне налаштування Service Worker підвищує конверсію на 10–20% і знижує навантаження на сервер вдвічі. Економія часу завантаження дозволяє зекономити до 5 000 грн на рекламному бюджеті щомісяця завдяки кращим Core Web Vitals.

Нещодавній кейс з нашої практики: інтернет-магазин на Next.js мав LCP 4.2 с замість норми 2.5 с. Після налаштування SW зі стратегією Network First для сторінок і Cache First для статики LCP впав до 1.8 с, конверсія зросла на 15%. За 6 років роботи ми реалізували понад 80 проектів з PWA, гарантуючи покращення Core Web Vitals щонайменше на 30%.

У цій статті розберемо, як реалізувати кешування правильно, щоб користувачі отримували контент миттєво навіть при обриві мережі. Ви дізнаєтеся, які стратегії обрати для різних типів ресурсів і як уникнути типових помилок.

Які проблеми вирішує Service Worker

Service Worker усуває кілька типових вузьких місць:

  • Повільне завантаження повторних відвідувань: без кешу всі ресурси запитуються заново. SW повертає їх з кешу миттєво.
  • Відсутність офлайн-доступу: при обриві мережі користувач бачить порожню сторінку. SW може показувати кешовану версію.
  • Високий TTFB: якщо API-запити не кешуються, кожен рендер сторінки чекає відповіді сервера. SW може відповідати з кешу, оновлюючи дані у фоні.
  • Hydration mismatch: при SSR невідповідність між серверним і клієнтським HTML. Кешування статики зменшує час гідратації.

Стратегії кешування: порівняння

Основні стратегії: Cache First, Network First, Stale While Revalidate. Вибір стратегії залежить від типу ресурсу та необхідної свіжості.

Стратегія Застосування Час завантаження (в ідеалі) Змінність ресурсу Ризик застарівання
Cache First Статика (CSS, JS, шрифти) 0–50 мс (з кешу) Ні Низький, якщо версіонувати файли
Network First HTML-сторінки, API 200–500 мс (мережа) або 0 (офлайн) Середня Низький, кеш оновлюється після кожного успіху
Stale While Revalidate Зображення, товари 0 (кеш) + 100 мс (фон) Низька Помірний, видача застарілого до оновлення

Cache First забезпечує завантаження з кешу в 10 разів швидше, ніж Network First, для статики. Перша стратегія підходить для незмінних файлів, друга — для сторінок, які мають бути завжди свіжими, третя — для ресурсів, де можна показати застарілу версію на 1–2 секунди.

Як ми це робимо: кейс впровадження

Працюємо з React, Next.js, Vite. Для production використовуємо бібліотеку Workbox — вона позбавляє від ручного кешування і дає готові обробники. Приклад налаштування з vite-plugin-pwa:

// vite.config.ts
import { defineConfig } from 'vite';
import { VitePWA } from 'vite-plugin-pwa';

export default defineConfig({
    plugins: [
        VitePWA({
            registerType: 'autoUpdate',
            workbox: {
                globPatterns: ['**/*.{js,css,html,ico,png,svg,woff2}'],
                runtimeCaching: [
                    {
                        urlPattern: /^\/api\/.*/,
                        handler: 'NetworkFirst',
                        options: {
                            cacheName: 'api-cache',
                            networkTimeoutSeconds: 3,
                            expiration: {
                                maxEntries: 50,
                                maxAgeSeconds: 300,
                            },
                        },
                    },
                    {
                        urlPattern: /\.(?:webp|avif|jpg|png|svg)$/,
                        handler: 'StaleWhileRevalidate',
                        options: {
                            cacheName: 'images-cache',
                            expiration: {
                                maxEntries: 200,
                                maxAgeSeconds: 30 * 24 * 60 * 60,
                            },
                        },
                    },
                ],
            },
        }),
    ],
});
Приклад реєстрації
// src/service-worker-registration.ts
export function registerServiceWorker() {
    if ('serviceWorker' in navigator) {
        window.addEventListener('load', () => {
            navigator.serviceWorker.register('/sw.js', { scope: '/' })
                .then(registration => {
                    console.log('SW registered:', registration.scope);
                    setInterval(() => registration.update(), 60 * 60 * 1000);
                })
                .catch(err => console.error('SW registration failed:', err));
        });
    }
}

Чому важливо кешувати API-запити?

API-запити — часта причина високого TTFB. Якщо не кешувати відповіді, кожен перехід на сторінку викличе новий запит. Стратегія Network First з коротким часом життя кешу (наприклад, 5 хвилин) прискорює повторні перегляди. У разі невдачі мережі користувач отримає хоча б кешовані дані, а не помилку. Час відповіді API може досягати 500 мс, а кешування скорочує його до 0–50 мс.

Як оновлювати кеш без втрати користувачів?

При оновленні Service Worker важливо коректно керувати версіями кешу. У activate-події ми видаляємо старі кеші, залишаючи лише актуальний. Для сповіщення користувача про новий SW використовуємо подію updatefound і показуємо кнопку «Оновити»:

navigator.serviceWorker.ready.then(registration => {
    registration.addEventListener('updatefound', () => {
        const newWorker = registration.installing!;
        newWorker.addEventListener('statechange', () => {
            if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
                showUpdateNotification(() => {
                    newWorker.postMessage({ type: 'SKIP_WAITING' });
                    window.location.reload();
                });
            }
        });
    });
});

Процес роботи

  1. Аналітика: аудит поточних Core Web Vitals, визначення вузьких місць (LCP, CLS).
  2. Проектування: вибір стратегій для кожної групи ресурсів, визначення scope.
  3. Реалізація: написання Service Worker (вручну або через Workbox), інтеграція з билд-системою.
  4. Тестування: перевірка в Chrome DevTools (Application > Service Workers), Lighthouse, WebPageTest.
  5. Деплой: поетапний rollout, моніторинг помилок.

Строки орієнтовно

Базове налаштування під ключ — за 1-2 дні. Якщо потрібна кастомна логіка (наприклад, кешування GraphQL), термін збільшується до 4–5 днів. Вартість розраховується індивідуально — зв'яжіться з нами для оцінки проекту.

Що входить в роботу

  • Конфігурація Service Worker зі стратегіями для статики, сторінок та API.
  • Налаштування Workbox (якщо використовується Vite/Webpack).
  • Реалізація сповіщення про оновлення.
  • Створення офлайн-сторінки.
  • Тестування та профілювання.
  • Документація зі стратегій та експлуатації.
  • Пост-релізна підтримка (2 тижні).

Типові помилки при впровадженні Service Worker

Помилка Наслідок Рішення
Неправильний scope Service Worker не перехоплює запити Вказуйте scope: '/'
Відсутність очищення старих кешів Накопичення версій, зайвий трафік Видаляйте старі кеші в activate
Кешування без версіонування Користувач бачить застарілі дані Використовуйте Network First або короткий термін життя

Оптимізація завантаження за допомогою Service Worker кешування — це ключовий етап для швидкого сайту. Замовте впровадження Service Worker під ключ для покращення Core Web Vitals. Пишіть нам, щоб оцінити проект — звертайтеся за консультацією.

MDN Web Docs: Service Worker API

Коли додаток не відкривається без інтернету, користувач іде до конкурентів

PWA перетворює сайт на надійний додаток, який працює навіть в офлайні, надсилає push-повідомлення та встановлюється на головний екран. Розробка PWA додатків — це впровадження Service Worker, налаштування кеш-стратегій та інтеграція Web Push. На відміну від нативних додатків, вам не потрібні дві команди під iOS та Android — один код працює у всіх сучасних браузерах. Замовте аудит вашого проекту на PWA-сумісність — ми безкоштовно оцінимо потенціал та терміни.

Як Service Worker керує мережевими запитами?

Service Worker — це JavaScript-проксі між браузером та мережею. Працює в окремому потоці, перехоплює запити та вирішує, звідки їх віддавати: з кешу, з мережі або комбінацією. Розглянемо три базові стратегії на реальних сценаріях.

Стратегія кешування Використання Поведінка при офлайн
Cache First статика (CSS/JS з content hash) віддається з кешу, миттєво
Network First API, замовлення, новини спочатку мережа, при помилці — кеш
Stale While Revalidate контент соцмереж, стрічка сторінок одразу кеш, потім оновлення

Cache First застосовується для активів з хешем в імені — файл ніколи не зміниться, можна кешувати назавжди. Stale While Revalidate оптимальна для контенту, де допустима невелика затримка актуалізації. Workbox від Google автоматизує версіонування кешу та інвалідацію — без нього коректний Service Worker вимагатиме 300+ рядків коду з нетривіальними edge cases. Vite + vite-plugin-pwa генерує Service Worker з конфігу, включаючи precaching статики.

import { VitePWA } from 'vite-plugin-pwa';
export default {
  plugins: [
    VitePWA({
      registerType: 'autoUpdate',
      includeAssets: ['favicon.ico'],
      manifest: { /* name, icons, start_url, display */ },
      workbox: {
        globPatterns: ['**/*.{js,css,html,ico,png,svg}'],
        runtimeCaching: [
          { urlPattern: /^https?:\/\/api\./,
            handler: 'NetworkFirst',
            options: { cacheName: 'api-cache' }
          }
        ]
      }
    })
  ]
};

Як офлайн-режим реалізується на практиці?

«Працює офлайн» для різних продуктів означає різне. Ось три типові сценарії.

  • Офлайн-читання (новинні сайти, документація): Service Worker кешує сторінки при першому візиті, стратегія Stale While Revalidate + Background Sync для синхронізації після відновлення з'єднання.
  • Офлайн-редагування (нотатки, завдання): IndexedDB зберігає локальні дані, Background Sync API ставить операції в чергу — браузер синхронізує сам, навіть якщо вкладка закрита. Обмеження: Background Sync підтримується тільки в Chromium.
  • Офлайн-форма: користувач натиснув «Надіслати» без інтернету — дані не втрачаються, а ставляться в чергу та надсилаються автоматично. Для медичних та страхових форм це критично.

Проблема, про яку часто забувають: конфлікти при синхронізації. Якщо користувач А редагував запис офлайн, а користувач Б змінив його онлайн — потрібна стратегія вирішення (last-write-wins, three-way merge або показ конфлікту користувачеві). Ми опрацьовуємо ці сценарії на етапі проектування.

Як працюють Web Push-повідомлення?

Web Push доставляє повідомлення через браузер + Push Service (FCM для Chrome/Edge, APNs для Safari). Користувач надає дозвіл → браузер підписується на Push Service → ви отримуєте endpoint та ключі → надсилаєте повідомлення → Push Service доставляє в браузер. Реалізація через бібліотеку web-push (Node.js) або аналог для вашого бекенду. VAPID-ключі генеруються один раз, підписка зберігається в базі даних.

На поточний момент iOS (починаючи з версії 16.4) підтримує Web Push тільки для встановлених PWA, Chrome/Firefox/Edge — повна підтримка без встановлення. Частота та релевантність повідомлень безпосередньо впливають на відтік підписників — A/B тестування часу надсилання та формулювань стандартна практика.

Чому варто обрати PWA замість нативних додатків?

Економія на розробці під дві платформи — до 60% бюджету. Один код, єдина бізнес-логіка, автоматичне оновлення без магазинів. Ми виконали понад 30 PWA-проектів для e-commerce, фінтеху та корпоративних систем — гарантуємо сумісність з останніми версіями браузерів та відмінні показники Core Web Vitals (LCP, CLS, INP). PWA збільшує конверсію в середньому на 36% (дані Google). Сертифіковані спеціалісти з досвідом 7+ років у веб-розробці.

Що входить у розробку PWA під ключ?

Етап Результат Термін
Аудит поточного додатку Звіт PWA‑score, рекомендації 1–2 дні
Проектування офлайн‑сценаріїв Документація, прототип 2–3 дні
Розробка Service Worker + маніфест Код, автоматичне тестування 5–10 днів
Інтеграція Web Push (опціонально) Бекенд‑ендпоінт, підписка 3–5 днів
Тестування на реальних пристроях Звіт, правки 3–5 днів
Деплой та документація Доступи, інструкція, гарантія 1 місяць 1–2 дні

App Shell архітектура та precaching критичних ресурсів при першому встановленні дають миттєве завантаження оболонки додатку навіть при повільному з'єднанні.

Процес роботи та терміни

  1. Аудит поточного додатку (Lighthouse PWA score, аналіз сценаріїв).
  2. Визначення цінних офлайн-сценаріїв.
  3. Налаштування Service Worker через Workbox та реалізація маніфесту.
  4. Інтеграція Web Push (якщо потрібно).
  5. Тестування на реальних пристроях — Chrome DevTools, Safari Web Inspector.
  6. Деплой, документація, навчання команди.

Орієнтовні терміни: базова PWA (маніфест + Service Worker + кеш статики) — 1–2 тижні поверх готового додатку; Web Push — 1–2 тижні; офлайн-редагування з IndexedDB та Background Sync — 3–6 тижнів залежно від складності даних.

Вартість розраховується індивідуально після аудиту. PWA-проект зазвичай обходиться в 2–3 рази дешевше нативного додатку під обидві платформи. Додаткову економію дає відсутність витрат на публікацію в App Store та Google Play. Зв'яжіться з нами для консультації — ми безкоштовно оцінимо ваш проект та запропонуємо оптимальну стратегію впровадження.

Посилання для поглибленого вивчення