Жизненный цикл работника службы расширения,Жизненный цикл работника службы расширения

Работники службы расширения реагируют как на стандартные события работника службы , так и на события в пространствах имен расширений. Они представлены вместе, поскольку часто во время использования расширения один тип следует за другим.

Установка

Установка происходит, когда пользователь устанавливает или обновляет сервис-воркер из Интернет-магазина Chrome или когда он загружает или обновляет распакованное расширение с помощью страницы chrome://extensions . Три события происходят в порядке, указанном ниже.

ServiceWorkerRegistration.install

Первое событие, вызываемое во время установки, — это событие установки работника веб-службы.

chrome.runtime.onInstalled

Далее следует событие onInstalled расширения, которое запускается при первой установке расширения (а не сервисного работника), при обновлении расширения до новой версии и при обновлении Chrome до новой версии. Используйте это событие для установки состояния или для однократной инициализации, например контекстного меню .

chrome.runtime.onInstalled.addListener((details) => {
  if(details.reason !== "install" && details.reason !== "update") return;
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

ServiceWorkerRegistration.active

Наконец, запускается событие активации сервисного работника. Обратите внимание, что в отличие от работников веб-сервисов это событие вызывается сразу после установки расширения, поскольку в расширении нет ничего похожего на перезагрузку страницы.

Запуск расширения

При запуске профиля пользователя запускается событие chrome.runtime.onStartup , но события сервисного работника не вызываются.

Простой и выключение

Обычно Chrome завершает работу сервис-воркера при выполнении одного из следующих условий:

  • После 30 секунд бездействия. Получение события или вызов API расширения сбрасывает этот таймер.
  • Когда обработка одного запроса, например события или вызова API, занимает более 5 минут.
  • Когда получение ответа fetch() занимает более 30 секунд.

События и вызовы API-интерфейсов расширения сбрасывают эти таймеры, и если сервис-воркер перешел в спящий режим, входящее событие оживит их. Тем не менее, вам следует спроектировать своего сервис-воркера таким образом, чтобы он был устойчив к неожиданному завершению работы.

Чтобы оптимизировать потребление ресурсов вашего расширения, по возможности избегайте поддержания работоспособности вашего сервис-воркера на неопределенный срок. Проверьте свои расширения, чтобы убедиться, что вы не делаете это случайно.

Сохранение данных вместо использования глобальных переменных

Любые установленные вами глобальные переменные будут потеряны, если сервисный работник завершит работу. Вместо использования глобальных переменных сохраняйте значения в хранилище. Ваши варианты перечислены ниже. Обратите внимание, что API веб-хранилища недоступен для работников службы расширений.

API chrome.storage
API расширения, предлагающий несколько типов хранилища; локальный, сеансовый, управляемый (домен) и синхронизирующий. Этот API хранит объекты JSON, идентифицированные и полученные с помощью ключей, определенных разработчиком. Этот тип хранилища не будет удален, когда пользователь очистит веб-кеш.
API индексированной базы данных
Низкоуровневый API для хранения структурированных данных на стороне клиента, включая файлы и большие двоичные объекты. Этот API предоставляет примитивы для создания и извлечения транзакционных данных. Хотя этот API зачастую слишком сложен для простых случаев использования, на его основе построен ряд сторонних решений для хранения данных.
API кэш-хранилища
Механизм постоянного хранения пар объектов запроса и ответа. Этот API был разработан специально для работников веб-сервисов и используется для получения данных из конечной точки. Существует множество способов использования этого API в зависимости от того, важно ли и насколько важно, чтобы пользователи видели актуальные данные. Для получения дополнительной информации см. «Офлайн-поваренная книга» . Если вы специально не проксируете сетевые запросы через обработчик выборки, вам следует использовать chrome.storage .

Выберите минимальную версию Chrome

С момента выпуска Manifest V3 мы внесли несколько улучшений в время жизни сервис-воркеров. Это означает, что если ваше расширение Manifest V3 поддерживает более ранние версии Chrome, существуют условия, о которых вам необходимо знать. Если эти условия не влияют на ваше расширение, вы можете перейти из этого раздела. Если да, рассмотрите возможность указания минимальной версии Chrome в вашем манифесте.

Хром 120

Теперь для сигналов тревоги можно установить минимальный период в 30 секунд, чтобы соответствовать жизненному циклу сервисного работника. Дополнительную информацию см. в chrome.alarms .

Хром 118

Активные сеансы отладчика, созданные с использованием API chrome.debugger , теперь поддерживают работу сервис-воркера. Это предотвращает тайм-аут сервисных работников во время вызовов этого API.

Хром 116

В Chrome 116 представлены следующие улучшения срока службы сервис-воркера:

  • Активные соединения WebSocket теперь продлевают срок службы работника службы расширения. Отправка или получение сообщений через WebSocket в работнике службы расширения сбрасывает таймер простоя работника службы.

  • Дополнительным API расширения разрешено превышать пятиминутный период ожидания для работников службы расширения. Эти API отображают приглашение пользователя, и поэтому их решение может занять более пяти минут. К ним относятся desktopCapture.chooseDesktopMedia() , identity.launchWebAuthFlow() , management.uninstall() и permissions.request() .

Хром 114

Отправка сообщения с использованием долговременного обмена сообщениями сохраняет работоспособность сервисного работника. Раньше открытие порта сбрасывало таймеры, но отправка сообщения не происходила. Открытие порта больше не сбрасывает таймеры.

Хром 110

Вызовы API расширения сбрасывают таймеры. До этого только запуск обработчиков событий поддерживал работоспособность сервисного работника. Любые события, поставленные в очередь, но для которых не был вызван обработчик, не будут вызывать сброс.

Хром 109

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

Хром 105

Подключение к собственному хосту обмена сообщениями с помощью chrome.runtime.connectNative() сохранит работоспособность сервисного работника. Если хост-процесс выходит из строя или завершает работу, порт закрывается, и сервис-воркер завершает работу после завершения таймеров. Защититесь от этого, вызвав chrome.runtime.connectNative() в обработчике событий onDisconnect порта.