Web Worker
ブラウザのメインスレッドとは別のスレッドで JavaScript を実行し、UI のブロッキングを防ぐ仕組み
APIパフォーマンス
Web Worker とは
Web Worker は、ブラウザのメインスレッドとは別のバックグラウンドスレッドで JavaScript を実行する仕組みである。CPU 負荷の高い処理 (画像処理、暗号化、大量データのソート) をメインスレッドから分離し、UI のフリーズを防ぐ。
メインスレッドの問題
メインスレッド: [UI 描画] [イベント処理] [重い計算...........] [UI 描画]
↑ この間 UI がフリーズ
Web Worker: [UI 描画] [イベント処理] [UI 描画] [UI 描画]
Worker スレッド: [重い計算...........]
↑ メインスレッドは自由
基本的な使い方
// main.ts
const worker = new Worker(new URL('./worker.ts', import.meta.url));
worker.postMessage({ data: largeArray });
worker.onmessage = (event) => {
console.log('Result:', event.data);
};
// worker.ts
self.onmessage = (event) => {
const result = heavyComputation(event.data);
self.postMessage(result);
};
Worker の種類
| 種類 | スコープ | 用途 |
|---|---|---|
| Dedicated Worker | 1 つのページ | CPU 負荷の高い処理 |
| Shared Worker | 複数のページ間で共有 | タブ間のデータ共有 |
| Service Worker | オフライン対応 | キャッシュ、プッシュ通知 |
Worker の制限
| できること | できないこと |
|---|---|
fetch |
DOM 操作 (document, window) |
setTimeout / setInterval |
alert, confirm |
IndexedDB |
localStorage |
WebSocket |
UI の直接更新 |
crypto |
Transferable Objects
大きなデータを Worker に渡す場合、コピーではなく所有権を移転 (transfer) して高速化する。
const buffer = new ArrayBuffer(1024 * 1024); // 1MB
worker.postMessage(buffer, [buffer]); // transfer (コピーなし)
// buffer は使えなくなる (所有権が Worker に移転)
使うべきケース
画像処理 (リサイズ、フィルター、WebP 変換)、データ処理 (CSV パース、大量データのソート)、暗号化 (ハッシュ計算、暗号化/復号)、構文解析 (Markdown → HTML、コードハイライト) が適している。
Node.js の Worker Threads との違い
Web Worker はブラウザ環境で Transferable のみのメモリ共有、Worker Threads は Node.js 環境で SharedArrayBuffer によるメモリ共有が可能。モジュールは Web Worker が ESM、Worker Threads が CommonJS / ESM に対応する。
理論と実装の両面から学ぶなら関連書籍が参考になる。