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

拡張機能サービス ワーカーは、標準サービス ワーカー イベントと拡張機能名前空間のイベントの両方に応答します。拡張機能の使用中に 1 つのタイプが別のタイプに続くことが多いため、これらはまとめて提示されます。

インストール

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

  1. install
  2. onInstall
  3. activate

ServiceWorkerRegistration.install

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

chrome.runtime.onInstalled

次は拡張機能の onInstalled イベントです。これは、拡張機能(サービス ワーカーではない)が初めてインストールされたとき、拡張機能が新しいバージョンに更新されたとき、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

最後に、サービス ワーカーの activate イベントが発火します。ウェブ サービス ワーカーとは異なり、拡張機能にはページの再読み込みに相当するものがないため、このイベントは拡張機能のインストール直後に発生します。

拡張機能の起動

ユーザー プロファイルが開始されると、chrome.runtime.onStartup イベントが発火しますが、サービス ワーカー イベントは呼び出されません。

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

通常、Chrome は次のいずれかの条件が満たされるとサービス ワーカーを終了します。

  • 30 秒間操作がない場合。イベントを受信するか、拡張機能 API を呼び出すと、このタイマーがリセットされます。
  • イベントや API 呼び出しなどの単一のリクエストの処理に 5 分以上かかる場合。
  • fetch() レスポンスの到着に 30 秒以上かかる場合。

拡張機能 API へのイベントと呼び出しによってこれらのタイマーはリセットされます。サービス ワーカーが休止状態になった場合、受信イベントによって復帰します。ただし、予期しない終了に対して復元力のあるサービス ワーカーを設計する必要があります。

拡張機能のリソース消費量を最適化するには、可能な限りサービス ワーカーを無期限に存続させないようにします。拡張機能をテストして、意図せずにこの処理を行っていないことを確認してください。

グローバル変数を使用するのではなく、データを永続化する

サービス ワーカーがシャットダウンすると、設定したグローバル変数はすべて失われます。グローバル変数を使用する代わりに、値をストレージに保存します。オプションが表示されます。

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

必要な Chrome バージョンを選択する

マニフェスト V3 のリリース以降、サービス ワーカーのライフタイムにいくつかの改善が加えられました。つまり、Manifest V3 拡張機能が以前のバージョンの Chrome をサポートしている場合は、注意すべき条件があります。これらの条件が拡張機能に影響しない場合は、このセクションをスキップできます。その場合は、マニフェストで Chrome の最小バージョンを指定することを検討してください。

Chrome 120

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

Chrome 118

chrome.debugger API を使用して作成されたアクティブなデバッガ セッションでは、サービス ワーカーが維持されるようになりました。これにより、この API の呼び出し中にサービス ワーカーがタイムアウトすることを防ぎます。

Chrome 116

Chrome 116 では、Service Worker のライフタイムが次のように改善されました。

  • アクティブな WebSocket 接続により、拡張機能サービス ワーカーのライフタイムが延長されるようになりました。拡張機能のサービス ワーカーで WebSocket を介してメッセージを送受信すると、サービス ワーカーのアイドル タイマーがリセットされます。

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

Chrome 114

長時間存続するメッセージングでメッセージを送信すると、サービス ワーカーが存続します。ポートを開いてもタイマーがリセットされなくなりました。

Chrome 110

拡張機能 API 呼び出しはタイマーをリセットします。これまでは、実行中のイベント ハンドラのみがサービス ワーカーを存続させていました。キューに登録されたイベントのうち、ハンドラが呼び出されていないイベントがあっても、リセットは発生しません。

Chrome 109

オフスクリーン ドキュメントから送信されたメッセージは、タイマーをリセットします。

Chrome 105

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