用語辞典・OS・ブラウザ

Service Worker

Service Workerとは

Service Worker(サービス・ワーカー)は、Webページとは別にバックグラウンドで動き、キャッシュや通知、通信制御を行えるブラウザ機能です。オリジンと適用範囲へ登録され、ページが開いていない時にも対応イベントの届け先になれます。

ワーカーはイベントを処理するときに起動され、仕事が終わればブラウザーが停止できます。長時間常駐するデーモンではなく、必要な状態はCache StorageやIndexedDB等へ保存します。

Service Workerを登録しただけでオフライン対応にはなりません。どの要求をネットワークへ送り、何をキャッシュし、失敗時に何を返すかをアプリケーションが実装します。

安全ページが適用範囲へワーカーを登録し、インストール・待機・activateを経て取得イベントと背景イベントを処理するライフサイクル、イベント駆動有効期間、HTTPキャッシュと別のCache Storage、DOM境界を分ける
安全ページからワーカーパッケージを登録し、インストール、待機、旧アクティブワーカー、activateへ進み、複数ページの取得をネットワーク、Cache Storage、オフライン代替処理へ分岐し、プッシュ・同期・通知・メッセージで起動後にsleepするピクトグラム図解
図1新ワーカーは通常、旧ワーカーが制御中のページを閉じるまで待機します。更新ファイルがダウンロード済みでも、すぐ全ページへ切り替わるとは限りません。

登録から制御まで六段階

Registerスクリプトと適用範囲を登録

ページがサービスワーカースクリプトURLを指定し、登録を作成します。

Install初期リソースを準備

インストールイベントで必要なキャッシュ作成等を行い、失敗すれば導入を中止します。

Waiting旧バージョンとの衝突を避ける

既存アクティブワーカーがクライアントを制御中なら、新バージョンは待機します。

Activate新バージョンを有効化

不要キャッシュ未完了データ削除や移行を行い、新しいイベント処理へ移ります。

Fetchイベント要求の応答を選ぶ

ネットワーク、Cache Storage、生成応答、代替処理をプログラムで決めます。

Terminateイベント後は停止できる

ブラウザーはアイドルワーカーを終了し、次のイベントで新しいグローバルを起動できます。

適用範囲はURL範囲、オリジンはセキュリティ境界

登録は適用範囲URL以下の文書を制御対象にします。スクリプトの場所より広い適用範囲にはサーバーからの許可ヘッダーが必要です。別オリジンのページを直接制御できません。

サービスワーカーはpowerful機能であり、原則としてHTTPS等の安全文脈で利用します。ネットワーク応答を書き換えられるため、スクリプト改ざんを防ぐTLSと更新が重要です。

取得イベントはローカルプロキシに似るが同一ではない

controlledクライアントの要求が取得イベントへ届くと、ワーカーはrespondWithで応答ソースを選べます。キャッシュ優先、ネットワーク優先、古い応答を返しつつ再検証等の戦略は用途に応じて実装します。

HTMLナビゲーションを古いキャッシュへ固定すると更新不能になり、API 変更をキャッシュするとデータ不整合が起きます。リソース種別、バージョン、オフライン時の意味、エラー応答を個別に設計します。

Cache StorageはブラウザーHTTPキャッシュと別

Cache APIは要求・応答組をアプリケーションが名前付きキャッシュへ保存・検索する保存です。HTTP鮮度による自動選択とは異なり、サービスワーカーコードが何を入れ、いつ消すかを決めます。

保存容量は無制限でなく、ブラウザーの割り当て量と削除対象です。重要データの唯一複製にせず、バージョン更新時に旧キャッシュを安全に削除します。

DOMへ直接触らずメッセージでページへ渡す

ServiceWorkerGlobalScopeにはページのdocumentがありません。ワーカーはクライアントへメッセージを送り、受け取ったページ側スクリプトがDOMを更新します。

同じオリジンに複数タブがあると、どのクライアントへ通知するかを選びます。メッセージ送信者とペイロードを検証し、古いページ・新ワーカーのプロトコルバージョン差を処理します。

プッシュや背景同期も永続実行ではない

プッシュサービスからのイベント、通知クリック、背景同期実行機会等がワーカーを起動できます。利用可否、頻度、バッテリー、ネットワーク、権限はブラウザー・OS方針に従います。

正確な時刻のジョブスケジューラーや無期限ソケットとして扱いません。イベント処理はwaitUntilへ必要なPromiseを渡し、タイムアウト・再試行・冪等性を設計します。

更新は並行する二バージョンを考える

ブラウザーはサービスワーカースクリプトの更新を確認し、バイト差があればインストールへ進めます。旧アクティブワーカーと新待機ワーカーが並ぶ期間があるため、キャッシュスキーマやメッセージ形式に互換性を持たせます。

Service Workerはオリジン・適用範囲に登録され、イベントの時だけ起動するネットワーク制御点です。ライフサイクル、キャッシュ戦略、更新、権限、失敗時代替処理をアプリケーションとして設計します。

event-driven lifetime、registration・install・activate、fetch event、Cache API、secure contextを定める現行draft:W3C「Service Workers」

関連用語