HTML Web Workers

Web workerはバックグラウンドで実行されるJavaScriptであり、ページのパフォーマンスに影響を与えません。

Web Workerとは何ですか?

HTMLページでスクリプトを実行中は、ページは応答しないままで、スクリプトが完了するまで待ちます。

Web workerはバックグラウンドで実行されるJavaScriptであり、他のスクリプトとは独立しており、ページのパフォーマンスに影響を与えません。あなたは好きなことを続けることができます:クリック、選択など、その時点でweb workerはバックグラウンドで動作しています。

ブラウザのサポート

テーブルの数字は、Web Workerを完全にサポートする最初のブラウザのバージョンを示しています。

API
Web Worker 4.0 10.0 3.5 4.0 11.5

HTML Web Workers インスタンス

以下の例では、バックグラウンドでカウントするシンプルな web worker を作成します:

カウント:

自分で試してみる

Web Worker のサポートを確認する

Web Worker を作成する前に、ユーザーのブラウザがそれをサポートしているかを確認してください:

if (typeof(Worker) !== "undefined") {
    // はい!Web worker はサポートされています!
    // 一部のコード.....
}
    // ごめんなさい!Web Worker はサポートされていません!
}

Web Worker ファイルの作成

それでは、外部JavaScriptファイルでweb workerを作成してみましょう。

ここで、カウントスクリプトを作成しました。このスクリプトは"demo_workers.js"ファイルに保存されます:

var i = 0;
function timedCount() {
    i = i + 1;
    postMessage(i);
    setTimeout("timedCount()",500);
}
timedCount();

このコードの中で重要なのはpostMessage()メソッドであり、それがHTMLページにメッセージを返すために使用されます。

コメント: web workerは通常このような単純なスクリプトではなく、CPUリソースを消費するタスクに使用されます。

Web Workerオブジェクトの作成

今やweb workerファイルがありますが、HTMLページからそれを呼び出す必要があります。

以下のコード行はworkerが存在するかどうかをチェックします。存在しない場合、新しいweb workerオブジェクトを作成し、"demo_workers.js"内のコードを実行します:

if (typeof(w) == "undefined") {
    w = new Worker("demo_workers.js");
}

その後、web workerから発生したメッセージを受け取ることができます。

web workerに"onmessage"イベントリスナーを追加します:

w.onmessage = function(event){
    document.getElementById("result").innerHTML = event.data;
}

web workerがメッセージを送信するとき、イベントリスナー内のコードを実行します。web workerからのデータはevent.dataに格納されます。

Web Workerを終了する

web workerが作成された後は、メッセージを監視し続けます(外部スクリプトが終了した後でも)。終了されるまで続きます。

web workerを終了し、ブラウザ/コンピュータのリソースを解放するには、terminate()メソッドを使用してください:

w.terminate();

Web Workerの再利用

worker変数をundefinedに設定した場合、終了後にはそのコードを再利用できます:

w = undefined;

完全なWeb Workerインスタンスコード

すでに.jsファイル内のWorkerコードが見られました。以下はHTMLページのコードです:

<!DOCTYPE html>
<html>
<body>
<p>数を数える: <output id="result"></output></p>
<button onclick="startWorker()">Workerを開始</button> 
<button onclick="stopWorker()">Workerを停止</button>
<br><br>
<script>
var w;
function startWorker() {
    if(typeof(Worker) !== "undefined") {
        if(typeof(w) == "undefined") {
            w = new Worker("demo_workers.js");
        }
        w.onmessage = function(event) {
            document.getElementById("result").innerHTML = event.data;
        }
    }
        document.getElementById("result").innerHTML = "Sorry! No Web Worker support.";
    }
}
function stopWorker() { 
    w.terminate();
    w = undefined;
}
</script>
</body>
</html>

自分で試してみる

Web Worker と DOM

Web Worker は外部ファイルに位置しているため、以下の JavaScript オブジェクトにアクセスできません:

  • window オブジェクト
  • document オブジェクト
  • parent オブジェクト