Веб-отзывчивость и производительность становятся все более важными как для пользовательского опыта, так и для SEO. Одна большая вещь, которая всегда мешала нам в этих областях, — это длительное выполнение JavaScript. Вызов скриптов внизу документа и использование асинхронного JavaScript помогают, но, конечно же, не могут решить все ваши проблемы.

Допустим, вам нужно выполнить много обработки изображений и некоторые другие дорогостоящие вычисления при загрузке вашей страницы. Хотя вы можете выполнять часть этой работы асинхронно, в конце концов все все равно должно обрабатываться одним и тем же потоком JavaScript. Что делают рабочие, так это предоставляют другие потоки для запуска вашего кода. По сути, рабочие процессы — это просто файлы JavaScript, которые можно запускать в отдельных потоках одновременно с вашим основным потоком JavaScript.

Типичные типы работников, с которыми вы сталкиваетесь, — это выделенные работники, общие работники и работники службы. Вы можете просто создать новый воркер как переменную в своем коде, а затем использовать соответствующие методы и обработчики событий каждого воркера для связи между этим воркером и основным потоком в вашем проекте. При написании кода в рабочем файле важно помнить, что рабочие процессы не имеют доступа к глобальной области действия вашего окна, а вместо этого имеют свои собственные области, методы и функции, к которым у них есть доступ. Из-за этого есть некоторые вещи, которые вы не можете делать внутри работника. Например, вы не можете манипулировать DOM из воркера или использовать некоторые свойства окна. Для связи между этими работниками и вашим основным потоком вы используете postMessage(“example-data”) для отправки данных. Обработчик событий onMessage используется для обработки этих вызовов postMessage.

Выделенные рабочие процессы, new Worker(“example.js”), представляют собой файлы JavaScript, которые доступны только сценарию, вызвавшему их изначально. Это хороший способ переместить определенную часть автономной логики в отдельный поток, если вам нужен доступ только к этому коду из одного источника.

С другой стороны, к общим рабочим процессам, new SharedWorker('example.js'), можно получить доступ из нескольких различных сценариев или контекстов просмотра. Из-за этого связь между этими работниками и вашими сценариями имеет дополнительный шаг. К вашему воркеру прикреплен объект порта, который необходимо вызвать, чтобы использовать ваши функции postMessage() и onMessage. Хотя это делается неявно для вас в выделенном сервис-воркере, вы должны указать это в общем воркере, так как интерфейс MessageEvent, используемый для связи с воркерами, иногда может возвращать массив портов. Короче говоря, это просто дополнительный шаг при общении с общим воркером, но вы можете получить доступ к этому воркеру из любых скриптов, окон или iFrames, которые вы используете, при условии, что они находятся в одном домене.

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

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

API веб-воркеров — веб-документы MDN

Использование веб-воркеров — веб-документы MDN

API Service Worker — веб-документы MDN

Использование сервис-воркеров — веб-документы MDN

Веб-воркеры против сервис-воркеров против ворклетов — Ире Адеринокун