Работники службы расширения реагируют как на стандартные события работника службы , так и на события в пространствах имен расширений. Они представлены вместе, поскольку часто во время использования расширения один тип следует за другим.
Установка
Установка происходит, когда пользователь устанавливает или обновляет Service Worker из Интернет-магазина 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 порта.