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

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

Установка

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

  1. install (событие сервисного работника)
  2. chrome.runtime.onInstalled (событие расширения)
  3. activate (событие сервисного работника)

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 chrome.storage
Расширенный API, предлагающий несколько типов хранилища: локальное, сессионное, управляемое (домен) и синхронное. Этот API хранит JSON-объекты, идентифицированные и полученные с помощью ключей, определенных разработчиком. Этот тип хранилища не удаляется при очистке веб-кэша пользователем.
API IndexedDB
Низкоуровневый API для клиентского хранения структурированных данных, включая файлы и большие двоичные объекты. Этот API предоставляет примитивы для создания транзакционного хранения и извлечения данных. Хотя этот API часто слишком сложен для некоторых вариантов использования, на его основе построен ряд сторонних решений для хранения данных.
API CacheStorage
Механизм постоянного хранения пар «Запрос» и «Ответ». Этот API был разработан специально для веб-сервисов и используется для получения данных из конечной точки. Существует множество способов использования этого API в зависимости от того, насколько важно для пользователей видеть актуальные данные. Для получения дополнительной информации см. «Руководство по работе в автономном режиме» . Если вы специально не используете обработчик запросов fetch для переадресации сетевых запросов, следует использовать 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 порта.