Сотрудники служб расширений реагируют как на стандартные события сотрудников служб , так и на события в пространствах имен расширений. Они представлены вместе, поскольку часто один тип событий сменяет другой во время использования расширения.
Установка
Установка происходит, когда пользователь устанавливает или обновляет сервис-воркер из Chrome Web Store, или когда он загружает или обновляет распакованное расширение, используя страницу chrome://extensions . Происходят три события в указанном порядке:
-
install(событие сервисного работника) -
chrome.runtime.onInstalled(событие расширения) -
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 порта.