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

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

インストール

インストールは、ユーザーが 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 は次のいずれかの条件が満たされると、Service Worker を終了します。

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

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

拡張機能のリソース消費を最適化するには、可能な限り Service Worker を無期限に存続させないようにします。拡張機能をテストして、誤ってクリックしていないことを確認してください。

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

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

chrome.storage API
ローカル、セッション、マネージド(ドメイン)、同期の複数のタイプのストレージを提供する拡張機能 API。この API は、デベロッパー定義のキーで識別および取得された JSON オブジェクトを保存します。このタイプのストレージは、ユーザーがウェブキャッシュを消去しても削除されません。
IndexedDB API
ファイルや blob などの構造化データをクライアント側で保存するための低レベル 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 の呼び出し中に Service Worker がタイムアウトすることがなくなります。

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 呼び出しによってタイマーがリセットされます。以前は、実行中のイベント ハンドラのみが Service Worker を存続させていました。キューに登録されたがハンドラが呼び出されていないイベントは、リセットの原因にはなりません。

Chrome 109

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

Chrome 105

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