Сервис-воркер — это скрипт, который браузер запускает в фоновом режиме, отдельно от веб-страницы, и который способен перехватывать сетевые запросы, управлять кэшированием и обеспечивать работу веб-приложений офлайн. Workbox предоставляет высокоуровневый API для упрощения управления жизненным циклом сервис-воркеров, делая его более безопасным и предсказуемым.
Жизненный цикл сервис-воркера состоит из нескольких ключевых этапов: регистрация, установка, активация, работа с сообщениями и событиями fetch. Каждый этап имеет свои особенности и возможности для оптимизации приложений.
Регистрация сервис-воркера выполняется в основном скрипте страницы
через метод navigator.serviceWorker.register. Workbox
позволяет облегчить эту задачу с помощью функции
workbox-window:
import { Workbox } from 'workbox-window';
const wb = new Workbox('/service-worker.js');
wb.register();
Ключевые моменты регистрации:
installed, activated,
waiting, что важно для корректного обновления кэшированных
ресурсов.На этапе установки сервис-воркер обычно подготавливает кэш ресурсов.
Workbox предоставляет удобные методы для этого через стратегию
precache:
import { precacheAndRoute } from 'workbox-precaching';
precacheAndRoute([
{ url: '/index.html', revision: '12345' },
{ url: '/styles/main.css', revision: '12345' },
]);
Особенности этапа установки:
precacheAndRoute
автоматически сохраняет файлы в кэш и создает маршруты для их
последующей отдачи.install событие
выполняется асинхронно, и сервис-воркер не перейдет к следующему этапу,
пока промисы не будут выполнены.После успешной установки происходит активация. На этом этапе сервис-воркер получает контроль над клиентами (вкладками) и может выполнять очистку устаревшего кэша.
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cache) => {
if (cache !== 'my-cache-v2') {
return caches.delete(cache);
}
})
);
})
);
});
Особенности активации с Workbox:
cleanupOutdatedCaches, чтобы удалять
устаревшие версии кэша.activated событие через workbox-window для
уведомления интерфейса о готовности нового воркера.После активации сервис-воркер начинает перехватывать сетевые запросы. Workbox предоставляет готовые стратегии кэширования:
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'workbox-strategies';
registerRoute(
({ request }) => request.destination === 'image',
new StaleWhileRevalidate({
cacheName: 'images-cache',
})
);
Основные стратегии Workbox:
Эти стратегии помогают оптимизировать скорость загрузки, снижать нагрузку на сервер и поддерживать офлайн-режим.
Обновление сервис-воркера — критический момент. Workbox упрощает управление:
skipWaiting() используется внутри воркера, чтобы
активировать новую версию немедленно.waiting и методов postMessage можно уведомлять
вкладки о доступности обновлений.Workbox поддерживает двустороннюю связь между сервис-воркером и клиентом. Основные сценарии:
Пример обработки сообщений в сервис-воркере:
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});
images, scripts,
styles) повышает эффективность управления и удаления
устаревших данных.event.waitUntil, чтобы не
замедлять установку и активацию.install, activate, fetch,
message позволяет детально контролировать поведение воркера
и устранять потенциальные конфликты обновлений.Workbox делает управление жизненным циклом сервис-воркеров более прозрачным, безопасным и эффективным. Понимание этапов регистрации, установки, активации, перехвата запросов и обновлений позволяет создавать производительные веб-приложения с офлайн-поддержкой и надежной кэш-логикой.