Метод clientsClaim является частью функционала Service
Worker в библиотеке Workbox и позволяет активировать новый Service
Worker немедленно после его установки, обеспечивая управление всеми
открытыми вкладками (clients) без необходимости перезагрузки страницы.
Он решает проблему «зависания» старого Service Worker, когда обновление
кода не вступает в силу до закрытия всех вкладок.
По умолчанию новый Service Worker переходит в состояние
activated только после того, как все страницы,
управляемые старым Service Worker, будут закрыты. Это предотвращает
конфликты между двумя версиями Service Worker. Включение
clientsClaim изменяет это поведение:
import { clientsClaim } from 'workbox-core';
clientsClaim();
После вызова clientsClaim() активированный Service
Worker автоматически берёт под контроль все открытые страницы (clients),
которые принадлежат его области действия, сразу после активации. Это
особенно полезно для динамического кэширования и мгновенного применения
обновлённого кода.
clientsClaim в фазе установки (install)
не имеет эффекта, он должен находиться в коде Service Worker после
установки, обычно на верхнем уровне скрипта.skipWaiting(). Часто
clientsClaim используется вместе с
skipWaiting(), чтобы полностью контролировать жизненный
цикл Service Worker:import { clientsClaim } from 'workbox-core';
import { skipWaiting } from 'workbox-core';
skipWaiting();
clientsClaim();
skipWaiting() пропускает фазу ожидания, а
clientsClaim() сразу назначает управление всем открытым
вкладкам, обеспечивая мгновенное применение нового кода.
Обновление кэша без перезагрузки страницы. При
изменении ресурсов (JS, CSS, изображения) Service Worker с
clientsClaim() позволяет новым версиям кэшированных файлов
сразу стать доступными для всех активных вкладок, минимизируя риск
отображения устаревшего контента.
Динамическое управление клиентами. Можно получать список клиентов и управлять ими через API Service Worker:
self.addEventListener('activate', (event) => {
event.waitUntil(
self.clients.claim().then(() => {
return self.clients.matchAll().then((clients) => {
clients.forEach((client) => {
client.postMessage({ type: 'NEW_VERSION_ACTIVATED' });
});
});
})
);
});
clientsClaim совместно с маршрутизацией
Workbox (workbox-routing) и стратегиями кэширования
(workbox-strategies) позволяет новым политикам кэширования
вступать в силу сразу после активации Service Worker:import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'workbox-strategies';
registerRoute(
({ request }) => request.destination === 'script',
new StaleWhileRevalidate()
);
Комбинируя это с clientsClaim(), новые стратегии
применяются мгновенно ко всем вкладкам, которые управляются Service
Worker.
skipWaiting()
для полной актуализации.clientsClaim() — активирует управление Service Worker
над всеми клиентами сразу после активации.skipWaiting() для полного
контроля жизненного цикла.Применение clientsClaim делает обновление Service Worker
предсказуемым и управляемым, особенно в сценариях постоянного
кэширования и динамического контента.