Featured image of post Manifest V3対応ブラウザ拡張機能の開発入門 Featured image of post Manifest V3対応ブラウザ拡張機能の開発入門

Manifest V3対応ブラウザ拡張機能の開発入門

Chrome拡張機能などで必須規格となった「Manifest V3」の構成と、基本的な開発手順をチュートリアルで解説。

Google Chromeブラウザの拡張機能規格「Manifest V2」の廃止完了に伴い、「Manifest V3」への対応が必須となりました。バックグラウンド処理用のService Workersの活用や、新しい宣言的ネットリクエストAPIについて基本的な実装コードを示します。

本記事では、Manifest V3の核心となる変更点、基本的なファイル構成、そして簡単な拡張機能の実装チュートリアルを解説します。


1. Manifest V2 から V3 への主要な変更点

Googleが提唱するManifest V3(MV3)は、主に「セキュリティ」「プライバシー」「パフォーマンス」の向上を目的に策定されました。

1) バックグラウンドページの「Service Worker」化

従来の background.html や永続的バックグラウンドスクリプト(background.js)が廃止され、不要なときは自動で終了する非永続的な Service Worker へ変更されました。メモリの節約に貢献しますが、変数のメモリ保持ができなくなったため、データの永続化には chrome.storage APIを使用する必要があります。

2) リクエスト制御の変更(declarativeNetRequest

以前の webRequest APIは、ネットワークトラフィックをJavaScript側で自由にインターセプト・改ざんできたため悪用リスクがありました。MV3では、ブラウザ側にブロックルールを事前に登録する declarativeNetRequest APIへの移行が義務付けられました。

3) 外部スクリプト(リモートコード)の実行禁止

セキュリティ強化のため、拡張機能パッケージ外からJavaScriptスクリプト(例えばCDN経由の外部コード)を動的に読み込んで実行することが禁止されました。すべてのコードは拡張機能パッケージ内に同梱する必要があります。


2. Manifest V3 拡張機能の基本構成

最もシンプルな「ポップアップを表示する」拡張機能の構成ファイルを設計します。

1) 設定ファイル: manifest.json

MV3に対応したマニフェスト設定の基本例です。

{
  "manifest_version": 3,
  "name": "NetGuide MV3 Sample",
  "version": "1.0.0",
  "description": "Manifest V3のサンプル拡張機能です。",
  "permissions": [
    "storage",
    "activeTab"
  ],
  "background": {
    "service_worker": "background.js"
  },
  "action": {
    "default_popup": "popup.html",
    "default_icon": "icon.png"
  }
}

2) サービスワーカー: background.js

イベントベースで動作するバックグラウンドスクリプトの実装です。

// インストール時に初期状態を保存
chrome.runtime.onInstalled.addListener(() => {
  chrome.storage.local.set({ extensionActive: true });
  console.log("Extension installed and initialized.");
});

// タブの更新を検知してメッセージを処理
chrome.tabs.onActivated.addListener((activeInfo) => {
  chrome.storage.local.get(["extensionActive"], (result) => {
    if (result.extensionActive) {
      console.log(`Active tab changed to: ${activeInfo.tabId}`);
    }
  });
});

3) ポップアップ画面: popup.html / popup.js

拡張機能アイコンをクリックした際に表示されるミニUIです。

<!-- popup.html -->
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <style>
    body { width: 180px; font-family: sans-serif; padding: 10px; }
    button { width: 100%; padding: 6px; background: #2563eb; color: white; border: none; border-radius: 4px; }
  </style>
</head>
<body>
  <h4>NetGuide Tool</h4>
  <button id="action-btn">Click Me</button>
  <script src="popup.js"></script>
</body>
</html>
// popup.js
document.getElementById('action-btn').addEventListener('click', async () => {
  // ストレージから状態を読み出す
  chrome.storage.local.get(["extensionActive"], (result) => {
    alert(`Extension active state: ${result.extensionActive}`);
  });
});

3. 開発時の注意点とデバッグ方法

  • Service Workerの休止状態: Service Workerは非アクティブ状態が続くと自動休止します。setInterval は動作しなくなるため、定期処理を行う場合は chrome.alarms APIを使用する必要があります。
  • デバッグ方法: chrome://extensions を開き、「デベロッパーモード」をオンにして、「パッケージ化されていない拡張機能を読み込む」からフォルダを選択してインストールします。バックグラウンドのログは「ビューを検証: サービスワーカー」リンクからコンソールを開いてデバッグします。

4. まとめ:Manifest V3移行期を超えて

当初はAPI制限などにより懸念の多かったManifest V3ですが、現在では仕様改善が進み、安全性とパフォーマンスが担保された新世代のプラットフォームとして安定しています。最新仕様に準拠した拡張機能を開発し、より快適なブラウジング体験を提供しましょう。