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