イベント駆動型拡張機能の実装

Chrome拡張機能におけるイベント駆動型拡張機能の実装とは、必要なタイミングでのみバックグラウンドコードを起動し、不要なときはアンロードすることで、メモリやCPUの使用効率を最適化する方式です。これは**Manifest V3(MV3)以降で導入された設計方針であり、従来の常駐型 background ページ(イベントページ含む)**とは異なります。

以下に、イベント駆動型の仕組みを詳しく解説します。


1. イベント駆動型の背景と目的

Manifest V2 では background.js を使って常に動作する persistent(永続的)なバックグラウンドページが使われていました。これに対し、MV3では service_worker.js による 非永続的なイベント駆動モデルが標準です。

この変更の目的は以下のとおりです:

  • リソース効率の向上:必要なときだけバックグラウンドコードを起動

  • セキュリティの強化:より制限された実行環境(スコープの限定)

  • ユーザー体験の向上:Chrome全体のパフォーマンスを改善


2. サービスワーカー(service_worker.js)の役割

MV3では manifest.jsonbackground.service_worker に指定されたスクリプトがバックグラウンド処理を担います。

json
"background": { "service_worker": "background.js" }

この service_worker は次のようなイベントに応じて一時的に起動され、処理が終わると自動的に破棄されます。

  • アラームイベント(chrome.alarms.onAlarm

  • メッセージ受信イベント(chrome.runtime.onMessage

  • アクションボタンクリック(chrome.action.onClicked

  • 通知イベント(chrome.notifications.onClicked など)


3. 典型的なイベント駆動のコード例

以下は、ユーザーが拡張機能のアイコンをクリックしたときに通知を表示する例です。

javascript
chrome.action.onClicked.addListener(() => { chrome.notifications.create({ type: "basic", iconUrl: "icon.png", title: "通知タイトル", message: "ユーザーがアイコンをクリックしました" }); });

このコードは、アイコンクリック時に一時的に service_worker.js が起動し、通知を表示したあと自動的に終了します。


4. 永続データの扱い

サービスワーカーは状態を保持できません(実行が終了するため)。そのため、必要な状態や設定は chrome.storage に保存しておき、都度取得する必要があります。

例:

javascript
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { chrome.storage.local.get(["key"], (result) => { // ストレージから値を取得し処理 sendResponse({ value: result.key }); }); return true; // 非同期レスポンスのため true を返す });

5. 注意点

  • setTimeoutsetInterval は、サービスワーカーのライフサイクル管理には向きません(処理が途中で止まる可能性があります)。

  • 長時間動作させたい場合は chrome.alarms API を利用します。

  • DOMwindow は使用できません(サービスワーカーは Web Worker ベースのため)。


6. 開発時のポイント

  • chrome://extensions/ で「サービスワーカーの停止」やログ確認が可能

  • console.log() のログは「拡張機能」→「サービスワーカー」→「inspect」から確認可能


まとめ

項目 イベントページ(MV2) サービスワーカー(MV3)
実行状態 非常駐だがメモリ常駐の可能性あり 完全な一時起動型
記述場所 background.js service_worker.js
状態保持 一部可能 不可能(都度読み込み)
推奨API 多くのChrome API 一部制限あり(DOMアクセス不可)
設定例(manifest.json) "background": { "scripts": [...] } "background": { "service_worker": "..." }

Chrome拡張機能でのイベント駆動型の実装は、効率的かつセキュアな拡張機能開発において重要な仕組みです。Manifest V3ではこれが標準であり、サービスワーカーのライフサイクルを意識した設計が求められます。

生成日:2025/05/18