Сервис-воркер — это скрипт, который браузер запускает в фоновом режиме, отдельно от веб-страницы, обеспечивая возможности для кэширования ресурсов, обработки сетевых запросов, push-уведомлений и фоновой синхронизации. Он не имеет прямого доступа к DOM, но взаимодействует с клиентскими страницами через postMessage и события.
Регистрация сервис-воркера выполняется на стороне клиента в основном JavaScript-файле приложения. Ключевым моментом является проверка поддержки сервис-воркеров в браузере:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js')
.then(registration => {
console.log('Сервис-воркер успешно зарегистрирован:', registration.scope);
})
.catch(error => {
console.error('Ошибка регистрации сервис-воркера:', error);
});
}
navigator.serviceWorker.register принимает путь к файлу
сервис-воркера.ServiceWorkerRegistration) или
отклоняется с ошибкой.registration.scope показывает область видимости
сервис-воркера, определяющую, какие URL он может контролировать.Область видимости сервис-воркера важна для контроля ресурсов, которые он будет перехватывать. Она задаётся вторым параметром при регистрации:
navigator.serviceWorker.register('/service-worker.js', { scope: '/' })
scope по умолчанию совпадает с директорией файла
сервис-воркера./sw.js, по умолчанию контролирует все страницы на
/.Браузер автоматически проверяет обновления сервис-воркера при каждой загрузке страницы. Однако Workbox предоставляет удобные методы для ручного контроля обновлений.
Пример: автоматическое уведомление о новой версии сервис-воркера:
navigator.serviceWorker.register('/service-worker.js').then(registration => {
registration.onupdatefo und = () => {
const newWorker = registration.installing;
newWorker.onstatecha nge = () => {
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
console.log('Доступна новая версия сервис-воркера');
}
};
};
});
onupdatefound срабатывает, когда обнаружена новая
версия.state сервис-воркера проходит через состояния:
installing, installed,
activating, activated,
redundant.navigator.serviceWorker.controller указывает, что
текущая страница уже контролируется сервис-воркером.Workbox упрощает регистрацию и управление сервис-воркерами, обеспечивая удобные методы кэширования и маршрутизации запросов. Для начала необходимо подключить Workbox:
import { Workbox } from 'workbox-window';
if ('serviceWorker' in navigator) {
const wb = new Workbox('/service-worker.js');
wb.addEventListener('installed', event => {
if (event.isUpdate) {
console.log('Доступна новая версия приложения');
}
});
wb.register();
}
Workbox предоставляет объект для управления жизненным
циклом сервис-воркера.installed уведомляет о завершении
установки.isUpdate позволяет определить, является ли это
обновлением существующего сервис-воркера./service-worker.js или /sw.js.import { precacheAndRoute } from 'workbox-precaching';
precacheAndRoute(self.__WB_MANIFEST);
__WB_MANIFEST формируется инструментами сборки
(например, Workbox Webpack Plugin).Важно обрабатывать исключения при регистрации сервис-воркера для обеспечения стабильности приложения:
navigator.serviceWorker.register('/service-worker.js')
.then(registration => {
console.log('Регистрация успешна:', registration);
})
.catch(error => {
console.error('Регистрация не удалась:', error);
});
Workbox позволяет отправлять сообщения в сервис-воркер и получать
ответы через postMessage:
navigator.serviceWorker.controller.postMessage({ type: 'CACHE_CLEANUP' });
self.addEventListener('message', event => {
if (event.data.type === 'CACHE_CLEANUP') {
// Логика очистки кэша
}
});
Правильная регистрация сервис-воркера с использованием Workbox обеспечивает надёжное кэширование, управление обновлениями и устойчивость приложения к сетевым сбоям. Разделение областей ответственности между клиентской частью и сервис-воркером, а также обработка событий жизненного цикла позволяют создавать масштабируемые и быстрые PWA-приложения.