Web WorkerとSharedWorkerの検出

バックグラウンドスレッドでJavaScriptを実行するためのWeb WorkerとSharedWorkerサポートを検出。ワーカータイプ、コミュニケーションパターン、パフォーマンスの利点を解説。

Workers

詳細な説明

Web Worker検出

Web WorkerはバックグラウンドスレッドでJavaScriptを実行することを可能にし、重い計算がUIスレッドをブロックするのを防ぎます。レスポンシブなWebアプリケーションの基本です。

検出

const hasWebWorker = typeof Worker !== 'undefined';
const hasSharedWorker = typeof SharedWorker !== 'undefined';

ワーカータイプ

タイプ スコープ 共有 ユースケース
Dedicated Worker 単一ページ なし 重い計算
Shared Worker 複数タブ あり タブ間の共有状態
Service Worker スコープ内の全ページ あり オフライン、プッシュ、キャッシング

Dedicated Workerの作成

// main.js
const worker = new Worker('worker.js');
worker.postMessage({ data: largeArray });
worker.onmessage = (e) => {
  console.log('Result:', e.data);
};

// worker.js
onmessage = (e) => {
  const result = heavyComputation(e.data);
  postMessage(result);
};

Blob URLを使用したインラインワーカー

const code = \`
  onmessage = (e) => {
    const result = e.data.map(x => x * 2);
    postMessage(result);
  };
\`;
const blob = new Blob([code], { type: 'text/javascript' });
const worker = new Worker(URL.createObjectURL(blob));

Transferableオブジェクト

大きなデータにはTransferableオブジェクトを使用してコピーを回避:

const buffer = new ArrayBuffer(1024 * 1024);
worker.postMessage({ buffer }, [buffer]);
// メインスレッドでbufferは空になる

制限事項

  • DOMアクセスなし(documentwindowなどなし)
  • 限定的なAPI利用可能性(localStoragealertなどなし)
  • 小さなメッセージの通信オーバーヘッド
  • モジュールワーカー(type: 'module')のサポートは異なる

ユースケース

画像処理、データパース、暗号化、大規模データセットのソート、WebAssemblyモジュールのメインスレッド外での実行などのCPU集約型操作に使用されます。バックグラウンドデータフェッチとキャッシング戦略にも便利です。

試してみる — Browser Feature Detector

フルツールを開く