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

拡張機能サービス ワーカーは、標準のサービス ワーカー イベントと拡張機能 Namespace のイベントの両方に応答します。拡張機能の使用中に、あるタイプが別のタイプに続くことが多いため、これらは一緒に表示されます。

インストール

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

ServiceWorkerRegistration.install

インストール中に最初に発行されるイベントは、ウェブ Service 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 イベントが発行されます。拡張機能にはページの再読み込みに相当するものがないため、このイベントはウェブサービス ワーカーとは異なり、拡張機能のインストール直後に発生します。

拡張機能の起動

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

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

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

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

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

拡張機能のリソース消費を最適化するには、可能であれば、サービス ワーカーを無期限に維持しないようにします。拡張機能をテストして、誤ってクリックしていないことを確認してください。

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

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

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

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

Chrome 114

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

Chrome 110

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

Chrome 109

画面外のドキュメントから送信されたメッセージはタイマーをリセットします。

Chrome 105

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