ウェブワーカー API

ウェブワーカー (Web Worker) とは、ウェブアプリケーションにおけるスクリプトの処理をメインとは別のスレッドに移し、バックグラウンドでの実行を可能にする仕組みのことです。時間のかかる処理を別のスレッドに移すことが出来るため、 UI を担当するメインスレッドの処理を中断・遅延させずに実行できるという利点があります。

ウェブワーカーの概念と使い方

ワーカーオブジェクトはコンストラクター(Worker() など)を用いて生成され、名前を持つ JavaScript ファイルを実行します。このファイルにはワーカースレッドで実行されるコードが書かれています。

ワーカースレッドの中では、 JavaScript の標準の一連の関数(StringArrayObjectJSON、など)に加え、任意のコードのほとんどを実行することができます。いくつかの例外があります。例えば、ワーカー内から直接 DOM を操作することはできません。また、 window オブジェクトの既定のメソッドやプロパティには使用できないものがあります。実行できるコードについては、以下のワーカーグローバルコンテキストと関数利用可能な Web API を参照してください。

ワーカーとメインスレッドとの間では、メッセージのシステムを通してデータがやり取りされます。両者は postMessage() メソッドを使ってメッセージを送信したり、受け取ったメッセージには onmessage イベントハンドラーで返信したりします(メッセージはメッセージイベントの data 属性に格納されます)。なお、データは共有されるのではなく複製されます。

ワーカーが親ページと同じオリジン内でホスティングされるのであれば、新しいワーカーをいくつも起動することができます。また、ワーカーはネットワーク I/O において XMLHttpRequest を使用しますが、 XMLHttpRequest における responseXML および channel 属性は必ず null を返す点が通常と異なります。

ワーカーの種類

ワーカーにはいくつもの種類があります。

  • 専用ワーカー (dedicated worker) は、単一のスクリプトで利用されるワーカーです。このコンテキストは DedicatedWorkerGlobalScope オブジェクトで表現されます。
  • 共有ワーカー (shared worker) は、ワーカーと同じドメイン内にある限り、異なるウィンドウや iframe などで動作する複数のスクリプトで利用できるワーカーです。専用ワーカーよりも少し複雑で、スクリプトはアクティブなポートを介して通信する必要があります。
  • サービスワーカーは、基本的に複数のウェブアプリケーション間やブラウザー、(利用可能なら)ネットワークの間でプロキシーサーバーとして動くものです。他にも、効果的なオフライン操作を実現したり、ネットワークリクエストを遮断してネットワークが利用できるかどうかで適切なアクションを取ったり、サーバーにある資産を更新したりすることなどを目的としています。また、プッシュ通知やバックグラウンド同期APIへのアクセスも可能になる予定です。

メモ: Web workers 仕様書によれば、ワーカーのエラーイベントはバブリングすべきではありません(Firefox バグ 1188141 を参照。これは Firefox 42 で実装されました)。

ワーカーグローバルコンテキストと関数

ワーカーは現在の window とは異なるグローバルなコンテキストで実行されます。 Window はワーカーから直接利用できませんが、同じメソッドの多くは共有されるミックスイン (WindowOrWorkerGlobalScope) で定義され、各自の WorkerGlobalScope から派生したコンテキストを通じてワーカーが利用できるようにします。

すべてのワーカーとメインスレッドで共通の関数(WindowOrWorkerGlobalScope からのもの)には、atob()btoa()clearInterval()clearTimeout()dump() 非標準 setInterval()setTimeout() などがあります。

以下の関数はワーカーでのみ利用することができます。

利用可能な Web API

メモ: 掲載されている API が特定のバージョンのプラットフォームで対応している場合、一般的にウェブワーカーでも利用可能とみなされます。また、 https://worker-playground.glitch.me/ を使用して特定のオブジェクト/関数の 対応をテストすることもできます。

ワーカーで利用可能な Web APIは、バーコード検出 API放送チャンネル APIキャッシュ APIチャンネルメッセージ APIコンソール API, ウェブ暗号化 API (Crypto)、CustomEventエンコーディング API (TextEncoderTextDecoder、など)、フェッチ APIFileReaderFileReaderSync (ワーカーでのみ動作)、FormDataImageDataIndexedDB, ネットワーク情報 API, 通知 APIパフォーマンス APIPerformancePerformanceEntryPerformanceMeasurePerformanceMarkPerformanceObserverPerformanceResourceTiming、など)、Promiseサーバー送信イベントServiceWorkerRegistrationURL APIURL など)、WebGLOffscreenCanvas による)、WebSocketXMLHttpRequest です。

ワーカーは他のワーカーを起動することができ、そのために WorkerWorkerGlobalScopeWorkerLocationWorkerNavigator も利用可能です。

ウェブワーカーのインターフェイス

Worker

実行しているワーカーのスレッドを表します。実行しているワーカーのコードへメッセージを送る際に用います。

WorkerLocation

Worker で実行されるスクリプトの絶対位置を定義します。

SharedWorker

複数の閲覧コンテキスト(すなわちウィンドウ、タブ、iframe)や他のワーカーからアクセス可能な特定の種類のワーカーを表します。

WorkerGlobalScope

あらゆるワーカーの一般的なスコープを表します(通常のウェブコンテンツに対して Window が行うのと同じ役割をします)。それぞれの種類のワーカーには、このインターフェイスを継承し、より具体的な機能を追加したスコープオブジェクトがあります。

DedicatedWorkerGlobalScope

専用ワーカーのスコープを表します。 WorkerGlobalScope を継承しており、独自の機能がいくつか加えられています。

SharedWorkerGlobalScope

共有ワーカーのスコープを表します。 WorkerGlobalScope を継承しており、独自の機能がいくつか加えられています。

WorkerNavigator

ユーザーエージェント(クライアント)に関する識別名と状態を表します。

簡単なデモと基本的な使い方は以下を参照してください。

これらのデモの動く仕組みを詳しく知りたい場合は。ウェブワーカーの使用を参照してください。

仕様書

Specification
HTML Standard
# workers

関連情報