--- title: Web Workers API slug: Web/API/Web_Workers_API tags: - API - DOM - Web Workers - Workers translation_of: Web/API/Web_Workers_API ---
Web Worker とは、ウェブアプリケーションにおけるスクリプトの処理をメインとは別のスレッドに移し、バックグラウンドでの実行を可能にする仕組みのことです。時間のかかる処理を別のスレッドに移すことが出来るため、 UI を担当するメインスレッドの処理を中断・遅延させずに実行できるという利点があります。
{{DOMxRef("Worker")}} オブジェクトは {{DOMxRef("Worker.Worker", "Worker()")}} などのコンストラクターで生成されるオブジェクトで、名前を持つ JavaScript ファイルを実行します。 Worker のスレッドで実行されるコードはこのファイルに書かれており、今いる {{DOMxRef("window")}} とは別のグローバルなコンテキストの中で Worker がコードを実行します。Dedicated Worker (専用ワーカー) の場合、そのコンテキストは {{DOMxRef("DedicatedWorkerGlobalScope")}} オブジェクトで表現されます (通常の Worker は単一のスクリプトで使用されますが、 Worker を共有する際は {{DOMxRef("SharedWorkerGlobalScope")}} を使用します)。
Worker のスレッドではあらゆるコードを実行できますが、いくつか例外があります。例えば、 Worker から DOM を直接操作することは出来ません。また、 {{DOMxRef("window")}} にデフォルトで用意されているメソッドやプロパティには Worker から使用できないものもあります。しかし、 WebSockets や IndexedDB のようなデータストレージに加え、 Firefox OS における Data Store API など、 window
に含まれていても使用できるものは数多くあります。詳しくは Worker から使用できる関数とクラス を参照してください。
Worker とメインスレッドとの間では、メッセージのシステムを通してデータがやり取りされます。両者は postMessage()
メソッドを使ってメッセージを送信し、受け取ったメッセージには onmessage
イベントハンドラーで返信します (メッセージは {{Event("Message")}} イベントの data
属性に格納されます)。なお、送信したデータは受取先でコピーされます (共有ではありません)。
メインスレッドのページと同じオリジンであれば、 Web Workers は新しい Worker をいくつでも生成できます。また、 Worker はネットワーク I/O において XMLHttpRequest
を使用しますが、 XMLHttpRequest
における responseXML
と channel
属性は必ず null
を返す点で通常と異なります。
Dedicated Worker の他にも、 Worker の種類には以下のようなものがあります。
メモ: Web Worker の仕様にあるように、Worker のエラーイベントはバブルするべきではありません (see {{bug(1188141)}}。これは Firefox 42 で実装されました。
簡単なデモと基本的な使い方は以下を参照してください。
このデモの動く仕組みを詳しく知りたい場合は Web Worker を使用するを参照してください。
仕様書 | 状態 | 備考 |
---|---|---|
{{SpecName("HTML WHATWG", "workers.html#workers", "Web Workers")}} | {{Spec2("HTML WHATWG")}} | 初回定義 |