Spec-Zone.ru › Web APIs

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-адресов, к которым пользователь имеет доступ в рамках всего источника или в подмножестве, указанном вами.

Загрузка, установка и активация

В этот момент ваш рабочий поток сервиса будет наблюдать за следующим жизненным циклом:

  1. Загрузка
  2. Установка
  3. Активация

Рабочий поток сервиса сразу загружается, когда пользователь впервые обращается к сайту/странице, управляемой рабочим потоком сервиса.

После этого он обновляется, когда:

  • Происходит навигация на страницу в области действия.
  • В рабочем потоке сервиса срабатывает событие, и он не загружался в течение последних 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 представляет собой действие извлечения, которое отправляется в ServiceWorkerGlobalScope ServiceWorker. Он содержит информацию о запросе и результирующем ответе и предоставляет метод FetchEvent.respondWith(), который позволяет предоставить произвольный ответ обратно контролируемой странице.

InstallEvent

Параметр, передаваемый в функцию-обработчик события install, интерфейс InstallEvent представляет собой действие установки, которое отправляется в ServiceWorkerGlobalScope ServiceWorker. Как подкласс ExtendableEvent, он гарантирует, что функциональные события, такие как FetchEvent, не отправляются во время установки.

NavigationPreloadManager

Предоставляет методы для управления предварительной загрузкой ресурсов с помощью службы рабочего процесса.

ServiceWorker

Представляет службу рабочего процесса. Несколько контекстов просмотра (например, страницы, рабочие процессы и т. д.) могут быть связаны с одним и тем же объектом ServiceWorker.

ServiceWorkerContainer

Предоставляет объект, представляющий службу рабочего процесса как единицу в экосистеме сети, включая возможности регистрации, отмены регистрации и обновления служб рабочего процесса, а также доступ к состоянию служб рабочего процесса и их регистраций.

ServiceWorkerGlobalScope

Представляет глобальный контекст выполнения службы рабочего процесса.

ServiceWorkerRegistration

Представляет регистрацию службы рабочего процесса.

WindowClient

Представляет область действия клиента службы рабочего процесса, являющегося документом в контексте браузера, управляемого активным рабочим процессом. Это особый тип объекта Client с некоторыми дополнительными методами и свойствами.

Расширения других интерфейсов

Window.caches и WorkerGlobalScope.caches

Возвращает объект CacheStorage, связанный с текущим контекстом.

Navigator.serviceWorker и WorkerNavigator.serviceWorker

Возвращает объект ServiceWorkerContainer, который предоставляет доступ к регистрации, удалению, обновлению и взаимодействию с объектами ServiceWorker для соответствующего документа.

Спецификации

Спецификация
Службы рабочего процесса

См. также

  • Использование служб рабочего процесса
  • Жизненный цикл службы рабочего процесса
  • Пример кода службы рабочего процесса
  • Веб-API, связанные с API службы рабочего процесса:
    • API фонового извлечения
    • API фоновой синхронизации
    • API индекса контента
    • API хранилища cookie
    • API уведомлений
    • API обработчика платежей
    • API push-уведомлений
    • 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API