Web Worker
ブラウザのメインスレッドとは別のスレッドで JavaScript を実行し、UI のブロッキングを防ぐ仕組み
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 の種類
Worker の種類を以下にまとめる。
| 種類 | スコープ | 用途 |
|---|---|---|
| Dedicated Worker | 1 つのページ | CPU 負荷の高い処理 |
| Shared Worker | 複数のページ間で共有 | タブ間のデータ共有 |
| Service Worker | オフライン対応 | キャッシュ、プッシュ通知 |
Worker の制限
Worker の制限を以下にまとめる。
| できること | できないこと |
|---|---|
fetch | DOM 操作 (document, window) |
setTimeout / setInterval | alert, confirm |
IndexedDB | localStorage |
WebSocket | UI の直接更新 |
crypto | Cookie の読み書き (document.cookie) |
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 に対応する。
理論と実装の両面から学ぶなら関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
Worker Threads
Node.js で CPU 集約的な処理をメインスレッドをブロックせずに別スレッドで実行する仕組み
並行処理 (Concurrency) とは - 並列処理 (Parallelism) との違い
Concurrency (並行処理) の意味を解説。複数のタスクを論理的に同時進行させる手法で、物理的に同時実行する並列処理 (Parallelism) とは区別される。Node.js / Go / Rust の並行処理モデルの違いも紹介。
スレッドプール
事前に生成したスレッドを再利用し、スレッド生成のオーバーヘッドを削減する並行処理パターン
goroutine
Go の軽量スレッドで、数十万規模の並行処理を低コストで実現する
プロセスとスレッドの違いとは - メモリ空間 / 生成コスト / 通信方法を比較
プロセスとスレッドの違いをメモリ空間 / 生成コスト / 通信方法の 3 軸で比較。Node.js での使い分け、Lambda の実行環境、データ競合とコンテナの PID 1 の落とし穴まで解説
Go
Google が開発したシンプルで高速なコンパイル言語で、goroutine による軽量な並行処理が特徴
関連する記事
データベース本ガイド - SQL から設計まで学べる技術書の選び方
データベースの基礎から設計、パフォーマンスチューニングまで学べる技術書の選び方と学習順序を紹介します。
体系的に学ぶ 安全な Web アプリケーションの作り方 第 2 版は初版と何が違うか - 買い直し判断ガイド
通称「徳丸本」こと体系的に学ぶ 安全な Web アプリケーションの作り方 第 2 版 (2018 年) と初版 (2011 年) の違いを出版社公表の改訂内容から整理。章の削除 / 新設 / 追加点の一覧と、初版所有者が買い直すべきかの判断基準を解説します。
Web 開発本ガイド - フロントエンドからバックエンドまで
Web 開発の全体像を学べる技術書の選び方と学習マップを紹介。フレームワーク本の賞味期限問題と公式ドキュメントとの使い分けも解説します。