Предотвратить автоматическую остановку сервисного работника

Служебный работник, кажется, автоматически останавливается в какой-то момент. Такое поведение непреднамеренно закрывает соединение WebSocket, установленное при активации.

Когда и почему это останавливается? Как я могу программно отключить это неожиданное действие, чтобы сохранить работоспособность Service Worker?

Ответ 1

То, что вы видите, - это ожидаемое поведение, и оно вряд ли изменится.

Работники службы намеренно имеют очень короткие сроки жизни. Они "рождаются" в ответ на конкретное событие (install, activate, message, fetch, push и т.д.), Выполняют свою задачу, а затем "умирают" вскоре после этого. Продолжительность жизни обычно достаточно длинная, чтобы можно было обрабатывать несколько событий (например, после install может последовать activate за которой следует fetch), прежде чем рабочий умрет, но в конце концов умрет. Вот почему очень важно не полагаться на какое-либо глобальное состояние в ваших сценариях и загружать любую информацию о состоянии, которая вам нужна, с помощью IndexedDB или API кэша хранения, когда ваш рабочий рабочий запускается.

Работники службы - это эффективные фоновые процессы, которые устанавливаются при каждом посещении определенных веб-страниц. Если этим фоновым процессам разрешено работать неограниченно, существует повышенный риск негативного воздействия на аккумулятор и производительность вашего устройства/компьютера. Чтобы уменьшить этот риск, ваш браузер будет запускать эти процессы только тогда, когда он это знает, т.е. В ответ на событие.

В случае использования WebSockets используется ваш клиент для прослушивания некоторых данных с сервера. Для этого варианта использования альтернатива использованию WebSockets для сервис-работника заключается в использовании API Push Messaging и ответа вашего рабочего на push события. Обратите внимание, что в текущей реализации Chrome вы должны показывать уведомление, видимое пользователем, при обработке события push. В настоящее время "молчащий" вариант использования push не поддерживается.

Если вместо прослушивания данных с сервера вы использовали WebSockets в качестве способа отправки данных от вашего клиента на ваш сервер, к сожалению, нет такого удобного для этого способа обслуживания. В какой-то момент в будущем может быть способ регистрации вашего рабочего-работника, который будет разбужен через периодическое/временное событие, в этот момент вы можете использовать fetch() для отправки данных на сервер, но в настоящее время не поддерживается в любых браузерах.

PS: Chrome (обычно) не будет убивать сотрудника службы, пока у вас открыт интерфейс DevTools, но это только для облегчения отладки и не поведения, на которое вы должны полагаться для реального приложения.