Web Workers позволяет запускать операцию сценария в фоновом потоке отдельно от основного потока выполнения веб-приложения. Преимущество этого заключается в том, что трудоемкая обработка может выполняться в отдельном потоке, что позволяет главному (обычно UI) потоку работать без блокировки / замедления.

Концепции и использование веб-воркеров

Рабочий - это объект, созданный с помощью конструктора (например, Worker()), который запускает именованный файл JavaScript - этот файл содержит код, который будет выполняться в рабочем потоке; рабочие работают в другом глобальном контексте, отличном от текущего window. Этот контекст представлен либо объектом DedicatedWorkerGlobalScope (в случае выделенных воркеров - воркеры, которые используются одним скриптом), либо SharedWorkerGlobalScope (в случае общих воркеров - воркеры, которые совместно используются несколькими скриптами).

Вы можете запускать любой код внутри рабочего потока, за некоторыми исключениями. Например, вы не можете напрямую управлять DOM изнутри воркера или использовать некоторые методы и свойства по умолчанию для объекта window. Но вы можете использовать большое количество элементов, доступных в window, включая WebSockets и механизмы хранения данных, такие как IndexedDB. См. Функции и классы, доступные исполнителям для более подробной информации.

Данные передаются между рабочими и основным потоком через систему сообщений - обе стороны отправляют свои сообщения с помощью метода postMessage() и отвечают на сообщения с помощью обработчика событий onmessage (сообщение содержится в свойстве data события Message). Данные скорее копируются, чем передаются.

В свою очередь, воркеры могут порождать новых воркеров, если они размещены в том же источнике, что и родительская страница. Кроме того, рабочие могут использовать XMLHttpRequest для сетевого ввода-вывода, за исключением того, что атрибуты responseXML и channel на XMLHttpRequest всегда возвращают null.

Помимо преданных своему делу работников, есть и другие типы работников:

  • Общие воркеры - это воркеры, которые могут использоваться несколькими скриптами, запущенными в разных окнах, IFrames и т. Д., Если они находятся в том же домене, что и воркер. Они немного сложнее, чем выделенные рабочие - скрипты должны обмениваться данными через активный порт. См. SharedWorker для получения более подробной информации.
  • ServiceWorkers, по сути, действуют как прокси-серверы, которые находятся между веб-приложениями, браузером и сетью (если они доступны). Они предназначены, среди прочего, для обеспечения эффективного взаимодействия в автономном режиме, перехвата сетевых запросов и принятия соответствующих мер в зависимости от доступности сети, а также для обновления активов, находящихся на сервере. Они также позволят получить доступ к push-уведомлениям и API фоновой синхронизации.
  • Chrome Workers - это тип воркера, предназначенный только для Firefox, который вы можете использовать, если разрабатываете надстройки и хотите использовать воркеры в расширениях и иметь доступ к js-ctypes в вашем воркере. См. ChromeWorker для получения более подробной информации.
  • Audio Workers предоставляют возможность прямой обработки звука по сценарию, которая выполняется в контексте веб-воркера.

Примечание. Согласно Спецификации веб-воркеров, события ошибок воркера не должны всплывать (см. ошибка 1188141. Это было реализовано в Firefox 42.

Интерфейсы Web Worker

AbstractWorker Абстрагирует свойства и методы, общие для всех типов рабочих процессов (например, Worker или _20 _). _ 21_ Представляет запущенный рабочий поток, позволяя вам передавать сообщения выполняющемуся рабочему коду. _ 22_ Определяет абсолютное расположение сценария, выполняемого _23 _. _ 24_ Представляет определенный вид воркера, к которому можно получить доступ из нескольких контекстов просмотра, например из нескольких окон, окон iframe или даже рабочих процессов. _ 25_ Представляет общую область действия любого рабочего (выполняющего ту же работу, что и Window для обычного веб-контента). У разных типов рабочих есть объекты области, которые наследуются от этого интерфейса и добавляют более специфические функции. _ 27_ Представляет область действия выделенного рабочего, наследуя от WorkerGlobalScope и добавляя некоторые выделенные функции. WorkerGlobalScope и добавление некоторых специальных функций. _ 31_ Представляет идентификатор и состояние пользовательского агента (клиента):

Примеры

Мы создали несколько простых демонстраций, чтобы продемонстрировать базовое использование:

Подробнее об Web Workers API