【Web標準/FrontEnd】Web Worker/Service Workerを使ったバックグラウンド処理ついて📝

Web Worker/Service Workerを使ったバックグラウンド処理ついて📝
Web Worker
Service Worker

サービスワーカーってなに?
サービスワーカー(Service Worker)は ブラウザの裏側で動く JavaScript ファイル です。
ページとは別スレッドで動き、ネットワーク通信を横取り(プロキシ)したり、キャッシュを管理したり、オフライン時でも動ける仕組みを提供してくれます。スマホアプリの「バックグラウンド処理」を Web に持ち込む技術、とイメージするとわかりやすいでしょう。 (MDN Web Docs)
できること
機能 | ざっくり説明 | 代表 API |
---|---|---|
オフライン対応 | HTML/CSS/画像/JSON などをキャッシュし、ネットが無くても表示できる | Cache Storage |
高速化 | キャッシュから即返す「先に表示、あとで更新」で 体感を高速化 | fetch イベント |
プッシュ通知 | サーバからの通知を アプリのように受信 | Push API / Notification API |
バックグラウンド同期 | ユーザが再オンラインになった時に まとめて送信 | Background Sync |
ネットワークリクエストの細かな制御 | 画像だけ CDN へリダイレクト …など 柔軟なルーティング | respondWith(), navigation preload |
これらを組み合わせた Web アプリは PWA(Progressive Web App) と呼ばれ、インストールアイコンやホーム画面起動などネイティブアプリに近い体験まで提供できます。 (atakinteractive.com)
どうやって動くの? ― ライフサイクル
-
登録 (register)
if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js'); }
ページが最初に呼び出すだけ。HTTPS 上(ローカルは
localhost
も可)でしか動きません。 (zeepalm.com) -
インストール (install)
sw.js
が初回読み込まれる。ここでキャッシュへファイルを保存(プリキャッシュ)するのが定番です。 -
アクティベート (activate)
旧バージョンのクリーンアップや、新しいキャッシュへの切り替えを行います。 -
イベント待ち受け
-
fetch
: リクエストを横取りしてキャッシュ or ネットへ -
push
: プッシュ通知受信 -
sync
: オフライン中に失敗した送信を再試行
-
-
アップデート
ブラウザが自動チェック。sw.js
が変わると新しいワーカーが「待機 → アクティブ」へ交代します。手動でskipWaiting()
を呼ぶと即時更新も可能です。 (MDN Web Docs)
sw.js
)
最小サンプル (// install: 基本ファイルをキャッシュ
self.addEventListener('install', event => {
event.waitUntil(
caches.open('v1').then(cache =>
cache.addAll(['/', '/index.html', '/style.css'])
)
);
});
// fetch: キャッシュ優先で応答
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request) // ①キャッシュにあれば返す
.then(resp => resp ?? fetch(event.request)) // ②なければネット
);
});
ほんの数行で 「オフラインでも即表示」 が実現できます。
よくある質問
質問 | 回答 |
---|---|
どのブラウザが対応してる? | 主要ブラウザ(Chrome, Edge, Safari, Firefox)はすべて対応。IE は非対応。 |
セキュリティ面は? | ドメイン外のリクエストを勝手に改ざんできるほど強力なので、必ず HTTPS 配信が必須。短いキャッシュ TTL を設定したり、Scope を絞るなどのベストプラクティスが推奨されます。 (zeepalm.com) |
更新が反映されない! | キャッシュ戦略を見直す/clients.claim() と skipWaiting() を使う/Workbox(後述)で簡易管理する、などが定番対策。 |
コード書くのが大変… | Google 製ライブラリ Workbox を使うと「キャッシュファースト」「Stale-While-Revalidate」などを宣言的に設定できます。 |
便利ツール
- Workbox: 高品質なキャッシュ戦略を数行で作成。
- Chrome DevTools ▶ Application パネル: Service Worker の登録状況やキャッシュ内容を GUI で確認。
- Lighthouse: PWA 診断で Service Worker、マニフェスト、オフライン対応をチェック。
まとめ
サービスワーカーは “Web アプリにネイティブ並みの裏方” を授けてくれる存在です。
- まず
navigator.serviceWorker.register()
。 -
install
でキャッシュ、fetch
で取り出す。 - オフライン対応・高速化・プッシュ通知などが一気に手に入る。
「Web サイト → PWA」への第一歩として、ぜひ触ってみてください!

Web Worker と Service Workerって何が違うの? by o3
要点まとめ:
Web Workerは「ページが開いている間だけ動く計算用のバックグラウンドスレッド」、Service Workerは「ブラウザとネットワークの間に常駐し、オフライン対応やプッシュ通知を司るプロキシ」。どちらもDOMに直接触れられず postMessage
で通信しますが、ライフサイクル・利用API・ユースケースが大きく異なります。以下では両者の特徴、違い、選択指針を詳しく解説します。
Web Worker とは
目的とモデル
- JavaScript の重い計算や JSON 解析、メディアエンコードなどをメインスレッドから切り離し、UI のフリーズを防ぐための 並列実行スレッド です。([MDN Web Docs][1])
- ページ側で
new Worker()
(またはnew SharedWorker()
)して生成し、データはpostMessage
/onmessage
でやり取りします。([MDN Web Docs][2])
種類
- Dedicated Worker(標準)
- Shared Worker(タブ間共有)([Stack Overflow][3])
- ES Module を直接読める Module Worker などの派生形があります。([DEV Community][4])
ライフサイクル
- ページが閉じるか
worker.terminate()
を呼ぶと終了し、ブラウザが保持し続けることはありません。([MDN Web Docs][2])
主なユースケース
- 画像処理・暗号化・機械学習推論など CPU 負荷が高い処理をオフロードして FPS を確保する。([DEV Community][5], [Medium][6])
簡易コード例
// main.ts
const worker = new Worker(new URL('./calc.worker.ts', import.meta.url), { type: 'module' });
worker.postMessage({ n: 40 });
worker.onmessage = (e) => console.log('結果', e.data);
Service Worker とは
目的とモデル
- ブラウザ-ネットワーク間の プログラマブルプロキシ。
fetch
イベントを横取りしてキャッシュから応答したり、ネットワークへフォールバックしたりできます。([MDN Web Docs][7], [MDN Web Docs][8])
ライフサイクル
- install — 初回登録でキャッシュを作成
- activate — 旧バージョンと交代
-
fetch / push / sync — イベント駆動で起動
ブラウザはイベント時にだけワーカーを起こし、処理後にスリープさせるため長期常駐が可能です。([web.dev][9], [MDN Web Docs][8])
セキュリティとスコープ
- HTTPS(または
localhost
)必須で、登録 URL 以下のパス全体を制御します。([MDN Web Docs][7])
拡張 API
- Cache Storage によるオフラインキャッシュ([MDN Web Docs][10])
- Background Sync や Push API でバックグラウンド更新・通知([pwa-workshop.js.org][11], [frontend.turing.edu][12])
主なユースケース
- PWA のオフライン対応・高速再訪問ロード・プッシュ通知など。([MDN Web Docs][13])
簡易コード例
// sw.js
self.addEventListener('install', event => {
event.waitUntil(caches.open('v1').then(c => c.addAll(['/offline.html'])));
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(res => res || fetch(event.request))
);
});
// main.js
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js');
}
共通点と違い(早見表)
Web Worker | Service Worker | |
---|---|---|
主目的 | 計算を並列化 | ネットワーク/キャッシュ制御 |
生成方法 | new Worker() |
navigator.serviceWorker.register() |
ライフサイクル | ページと同存 | ブラウザ管理・永続 |
イベント駆動 | いいえ | はい (install 等) |
ネットワーク横取り | 不可 | 可能 (fetch ) |
専用API | なし | Cache, Push, Sync 等 |
HTTPS 必須 | いいえ | はい |
代表ユースケース | 重い計算 | オフライン PWA、通知 |
選択ガイドと併用パターン
- UI がカクつく計算を並列化したい → Web Worker を使う。([DEV Community][5])
- オフラインでも動く PWA を作りたい、更新をバックグラウンドで処理したい → Service Worker を使う。([MDN Web Docs][13], [pwa-workshop.js.org][11])
- 両方必要 な場合は、ネットワーク層を Service Worker に任せ、取得した大きなデータを Web Worker に渡して計算する設計が定番です。([DEV Community][4])
ブラウザ対応と注意点
- Web Worker はすべてのモダンブラウザで長らくサポート済み。([MDN Web Docs][1])
- Service Worker も主要ブラウザで標準実装済みですが、一部の高度な API(Periodic Sync など)は実装状況に差があります。ターゲットブラウザを確認しつつ
if ('serviceWorker' in navigator)
でフォールバックを組むのが安全です。([MDN Web Docs][7], [web.dev][9])
まとめ
- 同じ「Worker」でも用途が全く異なるため置き換えはできません。
- Web Worker = 計算, Service Worker = オフライン&バックグラウンド と覚えると区別しやすいでしょう。

Web Worker と Service Workerって何が違うの? by Groq3
Web WorkerとService Workerは、どちらもJavaScriptをバックグラウンドで実行するための技術ですが、同じものではありません。それぞれの目的や機能が違います。
Web Worker
- 目的: CPU負荷の高い処理をメインスレッドから分離して、UIの応答性を保つ。
-
特徴:
- メインスレッドとは別のスレッドでJavaScriptを実行。
- DOMや
window
オブジェクトに直接アクセスできない。 - 主に計算処理(例: 画像処理、データ解析)などに向いている。
- ページのライフサイクルに依存し、ページが閉じると終了する。
- 例: 大量のデータを処理する計算をバックグラウンドで行う。
Service Worker
- 目的: ウェブアプリのオフライン機能やプッシュ通知、キャッシュ管理を実現する。
-
特徴:
- ブラウザとネットワークの間にプロキシとして動作。
- ネットワークリクエストのキャッシュやインターセプトが可能。
- DOMにアクセスできないが、ネットワーク制御やバックグラウンド同期が可能。
- ページのライフサイクルに依存せず、ブラウザが閉じていても動作可能。
- 例: オフラインでウェブページを表示したり、プッシュ通知を送信したりする。
主な違い
項目 | Web Worker | Service Worker |
---|---|---|
目的 | 計算処理の並列化 | ネットワーク制御、オフライン対応 |
スコープ | ページ内 | サイト全体(指定されたスコープ) |
ライフサイクル | ページ依存 | ページ非依存 |
主な用途 | 重い計算処理 | キャッシュ、プッシュ通知 |
まとめ
- Web Workerは計算タスクの並列処理に特化。
- Service Workerはネットワーク制御やオフライン機能に特化。
用途に応じて使い分ける必要があります。たとえば、PWA(プログレッシブウェブアプリ)ではService Workerを、オフラインで複雑な計算が必要な場合はWeb Workerを使うことが一般的です。
もし具体的なユースケースやコード例が必要なら、教えてください!

Web WorkerとService Workerの具体的なユースケースについて📝
Web WorkerとService Workerの具体的なユースケースと簡単なコード例を以下に示します。
両者の役割をより明確に理解できるように、実際の使用シナリオとコードを簡潔にまとめます。
Web Worker
ユースケース
- 画像処理: クライアント側で大きな画像データを処理(例: フィルタ適用、サイズ変更)。
- データ解析: 大量のJSONデータを処理して集計やフィルタリングを行う。
- リアルタイム計算: ゲームやシミュレーションで複雑な計算をバックグラウンドで実行。
コード例: フィボナッチ数列の計算
Web Workerを使って、CPU負荷の高いフィボナッチ数列の計算をバックグラウンドで実行し、UIをブロックしない例。
1. メインスクリプト (main.js)
// Web Workerのインスタンスを作成
const worker = new Worker('worker.js');
// ワーカーからのメッセージを受け取る
worker.onmessage = function (e) {
console.log('結果:', e.data);
};
// ワーカーに計算を依頼
worker.postMessage(40); // 40番目のフィボナッチ数を計算
2. ワーカースクリプト (worker.js)
// フィボナッチ数列を計算する関数
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// メインスレッドからのメッセージを受け取る
self.onmessage = function (e) {
const result = fibonacci(e.data);
self.postMessage(result); // 結果をメインスレッドに送信
};
説明:
-
main.js
でWeb Workerを起動し、worker.js
に計算を依頼。 -
worker.js
でフィボナッチ数を計算し、結果をメインスレッドに送信。 - この処理はメインスレッドをブロックしないため、UIがフリーズしない。
Service Worker
ユースケース
- オフライン対応: ウェブページのキャッシュを管理し、オフラインでも閲覧可能にする(PWA)。
- プッシュ通知: サーバーからの通知をユーザーに送信。
- ネットワーク最適化: リクエストをキャッシュして高速化したり、特定のリソースを遅延読み込み。
コード例: シンプルなキャッシュ管理
Service Workerを使って、ページのHTMLやCSSをキャッシュし、オフラインでも表示可能にする例。
1. メインスクリプト (index.js)
// Service Workerの登録
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/service-worker.js')
.then(registration => {
console.log('Service Worker 登録成功:', registration);
})
.catch(error => {
console.log('Service Worker 登録失敗:', error);
});
});
}
2. Service Workerスクリプト (service-worker.js)
const CACHE_NAME = 'my-site-cache-v1';
const urlsToCache = [
'/',
'/index.html',
'/styles.css',
];
// Service Workerのインストール時にキャッシュを保存
self.addEventListener('install', event => {
event.waitUntil(
caches.open(CACHE_NAME)
.then(cache => {
console.log('キャッシュを開きました');
return cache.addAll(urlsToCache);
})
);
});
// ネットワークリクエストをインターセプト
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request)
.then(response => {
// キャッシュがあれば返す、なければネットワークから取得
return response || fetch(event.request);
})
);
});
説明:
-
index.js
でService Workerを登録。 -
service-worker.js
で、指定したリソース(index.html
,styles.css
など)をキャッシュ。 -
fetch
イベントで、ネットワークリクエストをインターセプトし、キャッシュがあればそれを返し、なければネットワークから取得。 - これにより、オフラインでもキャッシュされたページが表示可能。
ユースケースの比較
シナリオ | 使用する技術 | 理由 |
---|---|---|
大量のデータをソート | Web Worker | 計算負荷が高く、UIをブロックせずに処理する必要がある。 |
オフラインでページを表示 | Service Worker | キャッシュ管理が必要で、ネットワークリクエストを制御する。 |
リアルタイムゲームの計算 | Web Worker | ゲームロジックの計算をバックグラウンドで高速に処理。 |
プッシュ通知の実装 | Service Worker | ブラウザが閉じていても通知を受け取るため、Service Workerが必要。 |
補足
- Web Workerは計算処理に特化し、DOMやネットワークには関与しない。例として、リアルタイムのデータ可視化や機械学習モデルの推論(軽量なもの)に使える。
- Service Workerはネットワーク制御やオフライン対応に特化。PWA開発では必須で、キャッシュ戦略(例: Cache First, Network First)を柔軟に設定可能。