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

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

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

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

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

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

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

Этапы разработки

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

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1359
  • 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% и снижает нагрузку на сервер вдвое.

Недавний кейс из нашей практики: интернет-магазин на 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: /^https:\/\/api\.example\.ru/,
                        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 для улучшения 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. Свяжитесь с нами для консультации — мы бесплатно оценим ваш проект и предложим оптимальную стратегию внедрения.

Ссылки для углублённого изучения