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

Оказывается, они определенно очень полезны и могут использоваться практически на каждом сайте!

Что такое сервисный работник?

Это файл Javascript, который работает в фоновом режиме веб-страницы, полностью отдельно от любого другого javascript, работающего на странице. Сервис-воркер и главная страница могут взаимодействовать друг с другом, но между ними нужно явно отправлять сообщения.

Процесс Service Worker может взаимодействовать с вашим сервером, выполнять некоторые интенсивные вычисления вне основного потока javascript пользовательского интерфейса, кэшировать файлы и информацию и перехватывать все сетевые запросы с главной страницы.

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

Пример базового сервисного работника

Файлы

Вот файл, который я использую, чтобы все работало в автономном режиме на моем сайте-портфолио:

Это должно быть инициализировано в HTML-коде веб-страницы следующим образом:

Сервисный работник (первый файл выше, sw.js) может получить доступ только к чему-либо в папке, в которой он находится, или под ней, поэтому он не может получить доступ к чему-либо в родительской папке. По этой причине он находится в корне веб-папки, а не в папке js/. Если бы это было так, он мог бы получить доступ только к чему-либо в папке js/ и ни к чему в папке images/ или css/ и т. д.

cache-polyfill.js, упомянутый в строке 1 sw.js, представляет собой полифилл кеша, который дает функциональность браузерам, которые еще не поддерживают кеш.

Инструменты разработки

Вы можете использовать инструменты разработчика Chrome, чтобы проверить, правильно ли установлен сервис-воркер, а также жестко обновить сервис-воркер, когда вы вносите изменения и хотите увидеть результаты.

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

Работа в автономном режиме

Чтобы поручить сервис-воркеру сохранять файлы для последующего использования, вы добавляете их в cache.addAll() в sw.js. Это начинается в строке 7 вышеуказанного файла.

Вам нужно явно указать каждый файл, который вы хотите сохранить, что может оказаться больше, чем вы думаете. Я использую Google Fonts на своем сайте, который, в свою очередь, загружает файлы шрифтов, которые должны быть явно установлены в сервис-воркере.

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

Это перехватывает все запросы трафика, поступающие с вашей страницы на сервер. Кэш проверяется на совпадение с event.request в строке 26, затем, если есть ответ, он возвращается, а если нет, то на ваш сервер выполняется вызов fetch() для ресурса.

Возможные проблемы

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

Еще одна проблема, с которой я столкнулся, заключалась в том, что встроенный скрипт нарушал Политику безопасности контента (CSP) моих серверов. Он запрещал любые теги сценариев на странице, что мешало установке работника службы. Я хотел сохранить эту часть CSP, поэтому мне пришлось создать хэш SHA-256 кода в теге сценария и явно добавить его в мой CSP.

Заворачивать

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

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