API Работника Сервиса
Примечание: Эта функция доступна в Рабочих потоках веб-приложений.
Работники сервиса по существу действуют как прокси-серверы, расположенные между веб-приложениями, браузером и сетью (если доступна). Они предназначены, помимо прочего, для создания эффективных автономных опытов, перехвата сетевых запросов и принятия соответствующих действий в зависимости от доступности сети и обновления активов, хранящихся на сервере. Они также позволят доступ к API push-уведомлений и синхронизации в фоновом режиме.
Концепции и использование рабочих потоков сервиса
Работник сервиса — это управляемый событиями рабочий поток, зарегистрированный по отношению к источнику и пути. Он представлен файлом JavaScript, который может управлять веб-страницей/сайтом, к которому он привязан, перехватывая и изменяя запросы на навигацию и ресурсы и кешируя ресурсы очень детально, чтобы предоставить вам полный контроль над поведением приложения в определенных ситуациях (наиболее очевидной из которых является отсутствие сетевого соединения).
Рабочие потоки сервиса выполняются в контексте рабочего потока: поэтому они не имеют доступа к DOM и выполняются в другом потоке по сравнению с основным JavaScript, который питает ваше приложение. Они не блокирующие и предназначены для полной асинхронности. Вследствие этого такие API, как синхронный XHR и хранилище веб-данных, не могут использоваться внутри рабочего потока сервиса.
Рабочие потоки сервиса не могут динамически импортировать JavaScript-модули, и import() будет выброшен, если он вызывается в глобальной области видимости рабочего потока сервиса. Статические импорты с использованием import оператора разрешены.
Рабочие потоки сервиса выполняются только по HTTPS по соображениям безопасности. Наиболее существенно, что HTTP-соединения уязвимы для вредоносного внедрения кода посредством man-in-the-middle атак, и такие атаки могут быть хуже, если им разрешен доступ к этим мощным API. В Firefox API рабочего потока сервиса также скрыты и не могут быть использованы, когда пользователь находится в режиме частного просмотра.
Примечание: В Firefox для тестирования можно запускать рабочие потоки сервиса по HTTP (ненадежно); просто установите флажок Включить рабочие потоки сервиса по HTTP (при открытом инструменте разработчика) в параметрах/меню шестеренки Firefox DevTools.
Примечание: В отличие от предыдущих попыток в этой области, таких как AppCache, рабочие потоки сервиса не делают предположений о том, что вы пытаетесь сделать, но при этом не работают, если эти предположения не верны. Вместо этого рабочие потоки сервиса предоставляют вам гораздо больший контроль.
Примечание: Рабочие потоки сервиса активно используют обещания, так как обычно они будут ожидать получения ответов, после чего они ответят действием успеха или неудачи. Архитектура обещаний идеально подходит для этого.
Регистрация
Работник сервиса сначала регистрируется с помощью метода ServiceWorkerContainer.register(). При успешной регистрации ваш рабочий поток сервиса будет загружен на клиент и попытается установить/активировать (см. ниже) для URL-адресов, к которым пользователь имеет доступ в рамках всего источника или в подмножестве, указанном вами.
Загрузка, установка и активация
В этот момент ваш рабочий поток сервиса будет наблюдать за следующим жизненным циклом:
- Загрузка
- Установка
- Активация
Рабочий поток сервиса сразу загружается, когда пользователь впервые обращается к сайту/странице, управляемой рабочим потоком сервиса.
После этого он обновляется, когда:
- Происходит навигация на страницу в области действия.
- В рабочем потоке сервиса срабатывает событие, и он не загружался в течение последних 24 часов.
Установка пытается выполнить, когда загруженный файл оказывается новым — либо отличается от существующего рабочего потока сервиса (сравнение по байтам) либо это первый рабочий поток сервиса для этой страницы/сайта.
Если это первый раз, когда рабочий поток сервиса доступен, попытка установки выполняется, а затем после успешной установки он активируется.
Если доступен существующий рабочий поток сервиса, новая версия устанавливается в фоновом режиме, но пока не активирована — в этот момент он называется ожидающим рабочим потоком. Он активируется только тогда, когда больше нет страниц, которые все еще используют старый рабочий поток сервиса. Как только больше нет страниц для загрузки, новый рабочий поток сервиса активируется (становится активным рабочим потоком). Активация может произойти раньше с помощью ServiceWorkerGlobalScope.skipWaiting(), а существующие страницы могут быть присвоены активному рабочему потоку с помощью Clients.claim().
Вы можете прослушивать событие install; стандартное действие — подготовить ваш рабочий поток сервиса к использованию, когда оно срабатывает, например, создав кеш с помощью встроенного API хранилища и поместив в него активы, которые вам понадобятся для автономной работы приложения.
Также есть событие activate. Момент, когда срабатывает это событие, обычно является хорошим временем для очистки старых кешей и других элементов, связанных с предыдущей версией вашего рабочего потока сервиса.
Ваш рабочий поток сервиса может реагировать на запросы с помощью события FetchEvent. Вы можете изменять ответы на эти запросы любым желаемым образом, используя метод FetchEvent.respondWith().
Примечание: Поскольку события install/activate могут занимать некоторое время, спецификация рабочего потока сервиса предоставляет метод waitUntil(). После его вызова на событиях install или activate с обещанием функциональные события, такие как fetch и push, будут ждать успешного разрешения обещания.
Для получения полного руководства по созданию вашего первого базового примера прочитайте Использование рабочих потоков сервиса.
Использование статической маршрутизации для управления загрузкой ресурсов
Рабочие потоки сервиса могут приводить к необоснованным затратам производительности — когда страница загружается впервые после некоторого времени, браузеру приходится ждать, пока рабочий поток сервиса запустится и выполнится, чтобы узнать, какой контент загрузить и должен ли он поступать из кеша или сети.
Если вы уже знаете заранее, откуда должен загружаться определенный контент, вы можете полностью обойти рабочий поток сервиса и загрузить ресурсы немедленно. Метод InstallEvent.addRoutes() можно использовать для реализации этого и других вариантов использования.
Другие идеи использования
Рабочие потоки сервиса также предназначены для использования в таких задачах, как:
- Синхронизация фоновых данных.
- Обработка запросов на ресурсы из других источников.
- Получение централизованных обновлений дорогостоящих для вычислений данных, таких как геолокация или гироскоп, чтобы несколько страниц могли использовать один набор данных.
- Клиентская компиляция и управление зависимостями CoffeeScript, less, CJS/AMD-модулей и т. д. в целях разработки.
- Обработка фоновых служб.
- Пользовательская шаблонизация на основе определенных шаблонов URL.
- Повышение производительности, например, предварительная загрузка ресурсов, которые пользователь, вероятно, скоро использует, таких как следующие несколько фотографий в фотоальбоме.
- Моделирование API.
В будущем рабочие потоки сервиса смогут выполнять ряд других полезных задач для веб-платформы, приближающих ее к уровню приложений, разработанных на основе нативных технологий. Интересно, что другие спецификации могут и будут использовать контекст рабочего потока сервиса, например:
- Фоновая синхронизация: Запустить рабочий поток сервиса даже при отсутствии пользователей на сайте, чтобы обновления кеша и т. д. могли быть произведены.
- Реакция на push-сообщения: Запустить рабочий поток сервиса для отправки пользователям сообщений о доступности нового контента.
- Реакция на конкретное время и дату.
- Вход в геозону.
Интерфейсы
Cache-
Представляет хранилище для пар объектов
Request/Response, кэшируемых в рамках жизненного циклаServiceWorker. CacheStorage-
Представляет хранилище для объектов
Cache. Предоставляет главный каталог всех кэшей с именами, к которым может получить доступServiceWorker, и поддерживает отображение строковых имён на соответствующие объектыCache. Client-
Представляет область действия клиента службы рабочего процесса. Клиент службы рабочего процесса — это либо документ в контексте браузера, либо
SharedWorker, управляемый активным рабочим процессом. Clients-
Представляет контейнер для списка объектов
Client; основной способ доступа к активным клиентам службы рабочего процесса в текущем источнике. ExtendableEvent-
Расширяет срок действия событий
installиactivate, отправленных вServiceWorkerGlobalScopeв рамках жизненного цикла службы рабочего процесса. Это гарантирует, что любые функциональные события (например,FetchEvent) не будут отправлены вServiceWorker, пока он не обновит схемы базы данных и не удалит устаревшие записи кеша и т.д. ExtendableMessageEvent-
Объект события
message, отправляемого в службу рабочего процесса (при получении сообщения канала вServiceWorkerGlobalScopeиз другого контекста) — расширяет срок действия таких событий. FetchEvent-
Параметр, передаваемый в обработчик
onfetch,FetchEventпредставляет собой действие извлечения, которое отправляется вServiceWorkerGlobalScopeServiceWorker. Он содержит информацию о запросе и результирующем ответе и предоставляет методFetchEvent.respondWith(), который позволяет предоставить произвольный ответ обратно контролируемой странице. InstallEvent-
Параметр, передаваемый в функцию-обработчик события
install, интерфейсInstallEventпредставляет собой действие установки, которое отправляется вServiceWorkerGlobalScopeServiceWorker. Как подклассExtendableEvent, он гарантирует, что функциональные события, такие какFetchEvent, не отправляются во время установки. -
Предоставляет методы для управления предварительной загрузкой ресурсов с помощью службы рабочего процесса.
ServiceWorker-
Представляет службу рабочего процесса. Несколько контекстов просмотра (например, страницы, рабочие процессы и т. д.) могут быть связаны с одним и тем же объектом
ServiceWorker. ServiceWorkerContainer-
Предоставляет объект, представляющий службу рабочего процесса как единицу в экосистеме сети, включая возможности регистрации, отмены регистрации и обновления служб рабочего процесса, а также доступ к состоянию служб рабочего процесса и их регистраций.
ServiceWorkerGlobalScope-
Представляет глобальный контекст выполнения службы рабочего процесса.
ServiceWorkerRegistration-
Представляет регистрацию службы рабочего процесса.
WindowClient-
Представляет область действия клиента службы рабочего процесса, являющегося документом в контексте браузера, управляемого активным рабочим процессом. Это особый тип объекта
Clientс некоторыми дополнительными методами и свойствами.
Расширения других интерфейсов
-
Window.cachesиWorkerGlobalScope.caches -
Возвращает объект
CacheStorage, связанный с текущим контекстом. -
Возвращает объект
ServiceWorkerContainer, который предоставляет доступ к регистрации, удалению, обновлению и взаимодействию с объектамиServiceWorkerдля соответствующего документа.
Спецификации
| Спецификация |
|---|
| Службы рабочего процесса |
См. также
- Использование служб рабочего процесса
- Жизненный цикл службы рабочего процесса
- Пример кода службы рабочего процесса
- Веб-API, связанные с API службы рабочего процесса:
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API