拡張機能 Service Worker のライフサイクル

拡張機能 Service Worker は、標準の Service Worker イベントと拡張機能の Namespace 内のイベントの両方に応答します。拡張機能の使用中に 1 つのタイプが別のタイプに続くことが多いため、この 2 つが一緒に表されます。

インストール

インストールは、ユーザーが Chrome ウェブストアから Service Worker をインストールまたは更新したとき、または chrome://extensions ページを使用してパッケージ化されていない拡張機能を読み込んだり更新したときに行われます。以下の順序で 3 つのイベントが発生します。

ServiceWorkerRegistration.install

インストール中に発生する最初のイベントは、ウェブサービス Worker の install イベントです。

chrome.runtime.onInstalled

次は拡張機能の onInstalled イベントです。これは、拡張機能(Service Worker ではない)が初めてインストールされたとき、拡張機能が新しいバージョンに更新されたとき、および Chrome が新しいバージョンに更新されたときに発生します。このイベントは、状態の設定や 1 回限りの初期化(コンテキスト メニューなど)に使用します。

chrome.runtime.onInstalled.addListener((details) => {
  if(details.reason !== "install" && details.reason !== "update") return;
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

ServiceWorkerRegistration.active

最後に、Service Worker の activate イベントが発生します。Web Service Worker とは異なり、このイベントは拡張機能のインストール直後に発生します。これは、拡張機能にはページの再読み込みに匹敵するものがないためです。

拡張機能の起動

ユーザー プロフィールが開始すると、chrome.runtime.onStartup イベントは呼び出されますが、Service Worker イベントは呼び出されません。

アイドル状態とシャットダウン

通常、Chrome は次のいずれかの条件が満たされると Service Worker を終了します。

  • 操作が行われない状態で 30 秒経過した後。このタイマーは、イベントを受信するか拡張機能 API を呼び出すとリセットされます。
  • 1 件のリクエスト(イベントや API 呼び出しなど)の処理に 5 分以上かかる場合。
  • fetch() レスポンスが届くまでに 30 秒以上かかる場合。

これらのタイマーは、拡張機能 API へのイベントや呼び出しによってリセットされ、Service Worker が休止状態になると、受信イベントによって復活します。それでも、予期しない終了に対する復元力を備えた Service Worker を設計する必要があります。

拡張機能のリソース消費を最適化するには、可能であれば Service Worker を無期限に存続させるのは避けてください。拡張機能をテストして、意図せず実行していないことを確認します。

グローバル変数を使用せずにデータを保持する

Service Worker がシャットダウンすると、設定したグローバル変数は失われます。グローバル変数を使用する代わりに、値をストレージに保存します。選択できるオプションは以下のとおりです。Web Storage API は拡張機能 Service Worker では使用できません。

chrome.storage API
ローカル、セッション、管理対象(ドメイン)、同期という複数の種類のストレージを提供する拡張 API です。この API は、デベロッパーが定義したキーで識別および取得した JSON オブジェクトを保存します。このタイプのストレージは、ユーザーがウェブ キャッシュを消去しても削除されません。
IndexedDB API
ファイルや blob などの構造化データをクライアントサイドで保存するための低レベル API。この API は、トランザクション データの保存と取得を作成するためのプリミティブを提供します。この API は、単純なユースケースには複雑すぎることが多くありますが、この API の上には、さまざまなサードパーティ ストレージ ソリューションが構築されています。
CacheStorage API
リクエストとレスポンスのオブジェクト ペアの永続ストレージ メカニズム。この API は、ウェブ Service Worker 専用に設計されており、エンドポイントからデータを取得するために使用されます。この API の使用方法は、ユーザーに最新データが表示されることが重要かどうか、またどの程度重要かに応じてさまざまです。詳しくは、オフライン クックブックをご覧ください。取得ハンドラを介してネットワーク リクエストを明確にプロキシしている場合を除き、chrome.storage を使用してください。

Chrome の最小バージョンを選択する

Manifest V3 のリリース以降、Service Worker の存続期間にいくつかの改善が行われています。つまり、Manifest V3 拡張機能が以前のバージョンの Chrome をサポートしている場合は、注意が必要です。上記の条件が拡張機能に影響しない場合は、このセクションから続行できます。その場合は、マニフェストでChrome の最小バージョンを指定することをおすすめします。

Chrome 120

Service Worker のライフサイクルに合わせて、アラームの最小期間を 30 秒に設定できるようになりました。詳しくは、chrome.alarms をご覧ください。

Chrome 118

chrome.debugger API を使用して作成されたアクティブなデバッガ セッションが、Service Worker を常に稼働状態にするようになりました。これにより、この API の呼び出し中に Service Worker がタイムアウトするのを防ぐことができます。

Chrome 116

Chrome 116 では、Service Worker の存続期間が次のように改善されました。

  • アクティブな WebSocket 接続により、拡張機能 Service Worker の存続期間が延長されるようになりました。拡張機能 Service Worker の WebSocket でメッセージを送受信すると、Service Worker のアイドル タイマーがリセットされます。

  • 追加の拡張機能 API は、拡張機能 Service Worker の 5 分間のタイムアウト期間を過ぎても許可されます。これらの API はユーザー プロンプトを表示するため、解決に 5 分以上かかることがあります。これには、desktopCapture.chooseDesktopMedia()identity.launchWebAuthFlow()management.uninstall()permissions.request() が含まれます。

Chrome 114

有効期間の長いメッセージを使用してメッセージを送信すると、Service Worker が動作し続けます。以前は、ポートを開くとタイマーはリセットされますが、メッセージを送信するとタイマーはリセットされませんでした。ポートを開いてもタイマーがリセットされなくなりました。

Chrome 110

拡張機能 API 呼び出しはタイマーをリセットします。これまでは、イベント ハンドラを実行するだけで Service Worker が動作し続けます。イベントがキューに格納されていても、ハンドラが呼び出されていないイベントは、リセットされません。

Chrome 109

画面外のドキュメントから送信されたメールによってタイマーがリセットされます。

Chrome 105

chrome.runtime.connectNative() を使用してネイティブ メッセージング ホストに接続すると、Service Worker が動作し続けます。ホストプロセスがクラッシュまたはシャットダウンすると、ポートは閉じられ、タイマーの完了後に Service Worker が終了します。これを防ぐには、ポートの onDisconnect イベント ハンドラで chrome.runtime.connectNative() を呼び出します。