Service Workerとは
Service Worker(サービス・ワーカー)は、Webページとは別にバックグラウンドで動き、キャッシュや通知、通信制御を行えるブラウザ機能です。オリジンと適用範囲へ登録され、ページが開いていない時にも対応イベントの届け先になれます。
ワーカーはイベントを処理するときに起動され、仕事が終わればブラウザーが停止できます。長時間常駐するデーモンではなく、必要な状態はCache StorageやIndexedDB等へ保存します。
Service Workerを登録しただけでオフライン対応にはなりません。どの要求をネットワークへ送り、何をキャッシュし、失敗時に何を返すかをアプリケーションが実装します。

登録から制御まで六段階
ページがサービスワーカースクリプトURLを指定し、登録を作成します。
インストールイベントで必要なキャッシュ作成等を行い、失敗すれば導入を中止します。
既存アクティブワーカーがクライアントを制御中なら、新バージョンは待機します。
不要キャッシュ未完了データ削除や移行を行い、新しいイベント処理へ移ります。
ネットワーク、Cache Storage、生成応答、代替処理をプログラムで決めます。
ブラウザーはアイドルワーカーを終了し、次のイベントで新しいグローバルを起動できます。
適用範囲は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」