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

При завантаженні сайту кожен зайвий запит до сервера збільшує LCP. Без SW ресурси завантажуються з мережі при кожному переході, що особливо критично для мобільних користувачів з нестабільним з'єднанням. Ми вирішуємо цю проблему, впроваджуючи фоновий скрипт, який перехоплює запити. Правильна конфігур

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

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

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

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

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

Часті запитання

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

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

При завантаженні сайту кожен зайвий запит до сервера збільшує 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