拡張機能サービス ワーカーは、標準サービス ワーカー イベントと拡張機能名前空間のイベントの両方に応答します。拡張機能の使用中に 1 つのタイプが別のタイプに続くことが多いため、これらはまとめて提示されます。
インストール
インストールは、ユーザーが Chrome ウェブストアからサービス ワーカーをインストールまたは更新したとき、または chrome://extensions
ページを使用してパッケージ化されていない拡張機能を読み込むか更新したときに行われます。次の順序で 3 つのイベントが発生します。
install
onInstall
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()
を呼び出すことで、この状況を防ぐことができます。