Chrome拡張機能の基本構成|manifest.json・popup・content scriptの役割

公開日: 

Chrome拡張機能を作ろうとすると、最初に戸惑いやすいのがファイル構成です。

Webページなら、まず index.html を作って、必要に応じてCSSやJavaScriptを追加するイメージを持ちやすいかもしれません。ところがChrome拡張機能では、manifest.jsonpopup.htmlpopup.jscontent.jsbackground.jsicons/ など、最初から複数のファイル名が出てきます。

名前だけを見ると難しそうですが、それぞれの役割を分けて考えると理解しやすくなります。

Chrome拡張機能は、ひとつの大きなファイルで全部を動かすというより、「設定を書くファイル」「アイコンを押したときの画面」「開いているWebページ上で動く処理」「裏側でイベントを受け取る処理」というように、役割ごとにファイルを分けて作ります。

この記事では、Chrome拡張機能の基本構成を初心者向けに整理します。細かい実装手順やManifest V3の詳しい仕様は後続記事で扱い、今回はまず「どのファイルが何を担当するのか」をつかむことを目的にします。

Chrome拡張機能の基本フォルダ構成図
Chrome拡張機能の基本フォルダ構成図

Chrome拡張機能は複数ファイルで役割分担する

Chrome拡張機能は、ブラウザに追加する小さなアプリのようなものです。

ただし、通常のWebアプリとは違い、拡張機能にはブラウザ側へ「この拡張機能は何をします」「どのファイルを使います」「どの権限が必要です」と伝える必要があります。

その中心になるのが manifest.json です。

さらに、拡張機能アイコンを押したときに出る小さな画面を作るなら popup.htmlpopup.js を使います。開いているWebページの中で動く処理を書くなら content.js を使います。裏側のイベント処理やメッセージの受け渡しには、Manifest V3では service worker として動く background.js を使うことがあります。

最初は、すべてを完璧に覚える必要はありません。

まずは次のように考えると分かりやすいです。

部品ざっくりした役割
manifest.json拡張機能全体の設定を書く
popup.htmlアイコンを押したときに表示する画面を作る
popup.jspopup画面のボタン操作などを処理する
content.js開いているWebページ上で動く
background.js裏側のイベント処理を担当する
icons/ツールバーやストア表示用の画像を置く

この一覧を頭に入れておくだけでも、Chrome拡張機能の構成はかなり見通しやすくなります。

最小構成のフォルダ例

Chrome拡張機能の基本的なフォルダ構成は、たとえば次のようになります。

my-extension/
├─ manifest.json
├─ popup.html
├─ popup.js
├─ content.js
├─ background.js
└─ icons/
   ├─ icon16.png
   ├─ icon48.png
   └─ icon128.png

すべての拡張機能で、これらのファイルを必ず全部使うわけではありません。

たとえば、アイコンを押したときの画面だけを作るなら、最初は manifest.jsonpopup.htmlpopup.js だけでも考えられます。

逆に、開いているWebページにボタンを追加したいなら、content.js が重要になります。

通知、右クリックメニュー、拡張機能内のイベント処理などを扱う場合は、background.js や service worker の出番が出てきます。

つまり、フォルダ構成は作りたい機能によって変わります。ただし、manifest.json が中心になり、そこから必要なファイルを指定していく、という考え方は共通です。

manifest.json の役割

manifest.json は、Chrome拡張機能の設定ファイルです。

拡張機能の名前、説明、バージョン、使うファイル、表示するアイコン、必要な権限などをここに書きます。

Chromeはこのファイルを見て、拡張機能をどう読み込むかを判断します。人間にとっての説明書というより、Chromeに渡す設定書のようなものです。

たとえば、非常に簡略化すると次のような情報を持ちます。

{
  "manifest_version": 3,
  "name": "Sample Extension",
  "version": "1.0.0",
  "action": {
    "default_popup": "popup.html"
  }
}

これはあくまで説明用の短い例です。実際には、作りたい機能に応じて、アイコン、権限、content script、background service worker などの設定を追加します。

初心者がまず理解しておきたいのは、manifest.json が「拡張機能全体の入口」だということです。

どのHTMLをpopupとして使うのか。どのJavaScriptをWebページ上で動かすのか。裏側で動くservice workerは何か。こうした関係を、manifest.json でChromeに伝えます。

Manifest V3の細かい書き方や権限設定は、後続の記事で詳しく扱う予定です。この記事では、まず manifest.json は拡張機能全体の設定ファイルだと押さえておけば十分です。

popup.html と popup.js の役割

popup.html は、拡張機能のアイコンを押したときに表示される小さな画面です。

Chromeの右上にある拡張機能アイコンをクリックすると、小さなパネルが開く拡張機能があります。設定を変更したり、ボタンを押したり、簡単な情報を表示したりする画面です。

その画面を作るのが popup.html です。

そして、popup画面内のボタン操作や入力処理を担当するのが popup.js です。

たとえば、次のような用途があります。

  • 保存ボタンを押したときの処理を書く
  • 入力欄の値を読み取る
  • 設定値を表示する
  • 開いているタブの情報を取得する
  • content script や background service worker にメッセージを送る

popupは、ユーザーが拡張機能を操作するための小さな入口です。

ただし、popupは常に表示され続ける画面ではありません。ユーザーがアイコンを押したときに開き、閉じると画面も閉じます。そのため、長く保持したいデータはpopup内だけに置かず、chrome.storage や IndexedDB などに保存する設計を考えることがあります。

初心者向けに言えば、popup.html は見た目、popup.js はpopup画面の動き、と分けて考えると理解しやすいです。

content.js の役割

content.js は、開いているWebページ上で動く処理を書くファイルです。

Chrome拡張機能らしい機能を作るとき、この content script が重要になることが多いです。

たとえば、以下のような処理に使います。

  • WebページのタイトルやURLを取得する
  • ページ内のテキストを読み取る
  • 特定のボタンや入力欄を探す
  • Webページ上に独自のボタンを追加する
  • 表データを読み取って加工する
  • 特定のページだけで処理を動かす

前の記事で説明したように、Chrome拡張機能は「今開いているWebページに関われる」ことが大きな特徴です。その役割を担当するのが content script です。

たとえば、ECサイトの商品ページ上に「この商品を保存」ボタンを追加する場合、ページ上にボタンを挿入する処理は content.js に書くことが多くなります。

YouTube Liveのページでコメント欄の情報を読み取りたい場合も、ページ内の要素にアクセスする処理は content script の領域になります。

ただし、content script は何でも自由にできる魔法の場所ではありません。対象ページや権限の設定、ページ構造の変化、セキュリティ上の制約を考える必要があります。

この記事では深入りしませんが、まずは content.js は「Webページ側で動く処理」と覚えておくとよいです。

Chrome拡張機能の主要コンポーネント役割図
Chrome拡張機能の主要コンポーネント役割図

background.js と service worker の役割

background.js は、拡張機能の裏側で動く処理を担当するファイルです。

Manifest V3では、従来の常駐型background pageではなく、service worker として扱うのが基本です。

service worker は、必要なイベントが発生したときに動く裏側の処理です。たとえば、拡張機能内のメッセージを受け取ったり、右クリックメニューの操作を処理したり、通知やイベントに反応したりします。

初心者向けには、background.js は「表に出ない裏方の処理」と考えると分かりやすいです。

popupはユーザーが開いたときに表示される画面です。content scriptはWebページ上で動きます。background service workerは、必要なタイミングで裏側のイベントを処理します。

たとえば、popupから「今のページ情報を保存して」と依頼し、background service worker が保存処理や他の処理につなぐ、という構成が考えられます。

ただし、Manifest V3のservice workerにはライフサイクルがあります。常に動き続ける前提で書くと、思った通りに動かないことがあります。

このあたりは少し細かい話になるため、この記事では概要に留めます。詳しくは、Manifest V3やservice workerを扱う記事で整理します。

icons フォルダと画像ファイルの役割

icons/ フォルダには、拡張機能で使うアイコン画像を置きます。

アイコンは、Chromeのツールバー、拡張機能管理画面、Chrome Web Storeの掲載画面などで使われます。

よく使われるサイズとして、16px、48px、128pxなどがあります。実際に必要なサイズや指定方法は、用途や公開時の要件に合わせて確認します。

フォルダ例では次のように置いていました。

icons/
├─ icon16.png
├─ icon48.png
└─ icon128.png

アイコンは小さな画像ですが、公開する拡張機能ではかなり重要です。ユーザーがツールバーやストアで最初に見る要素になるからです。

ただし、開発の最初から完璧なデザインを用意する必要はありません。まずは動作確認用のアイコンを用意し、公開前に見やすく権利的にも問題のない画像へ整える、という進め方でも構いません。

ファイル同士の関係をざっくり見る

Chrome拡張機能では、ファイル同士が役割を分担しながら動きます。

たとえば、ユーザーが拡張機能アイコンを押したとします。

そのとき、manifest.json の設定に従って popup.html が表示されます。popup内のボタンを押すと popup.js が動きます。必要に応じて、popupからcontent scriptへ「ページの情報を取ってきて」と依頼したり、background service workerへ「保存処理をして」と依頼したりします。

一方、content.js はWebページ上で動き、ページタイトルやURL、特定の要素などを扱います。

background.js は裏側でメッセージやイベントを受け取り、拡張機能全体の処理をつなぐ役割を持つことがあります。

この関係を一言でまとめると、次のようになります。

manifest.json
  ├─ popup.html / popup.js
  ├─ content.js
  ├─ background.js
  └─ icons/

manifest.json が全体の設定を持ち、そこから必要な画面や処理が読み込まれる、というイメージです。

popup・content script・service workerの関係図
popup・content script・service workerの関係図

初心者が混乱しやすいポイント

Chrome拡張機能の基本構成で、初心者が混乱しやすいポイントはいくつかあります。

まず、popup.jscontent.js の違いです。

popup.js はpopup画面の中で動きます。ユーザーが拡張機能アイコンを押して開いた小さな画面の処理です。

一方、content.js はWebページの中で動きます。ページ上のボタンやテキスト、入力欄などに関わる処理です。

次に、background.js がどこで動くのかも混乱しやすいです。これは画面として表示されるものではなく、裏側でイベントを処理するためのものです。Manifest V3ではservice workerとして扱うため、「ずっと動き続ける裏画面」と考えると誤解することがあります。

また、manifest.json はJavaScriptではありません。JSON形式の設定ファイルです。コメントを書けない、カンマの位置に注意が必要、といったJSONとしてのルールがあります。

さらに、ファイル名やパスの指定ミスもよくあります。manifest.jsonpopup.html と書いているのに、実際のファイル名が pop.html になっていると読み込めません。content.js のパスを間違えても動きません。

最初は、構成を小さくして確認するのが大切です。いきなり複雑な拡張機能を作るのではなく、popupだけ、content scriptだけ、保存だけ、というように小さく動作確認していくと理解しやすくなります。

まとめ

Chrome拡張機能は、複数のファイルで役割を分担して動きます。

中心になるのは manifest.json です。ここに拡張機能の名前、バージョン、使うファイル、権限などを設定します。

popup.htmlpopup.js は、拡張機能アイコンを押したときに表示される画面と、その画面の処理を担当します。

content.js は、開いているWebページ上で動く処理です。ページの情報を取得したり、ボタンを追加したりする場面で重要になります。

background.js は、Manifest V3ではservice workerとして、裏側のイベント処理を担当します。

icons/ には、ツールバーやストア掲載で使うアイコン画像を置きます。

最初は難しく見えますが、役割ごとに分けて考えれば整理しやすくなります。

次の実装系の記事では、この基本構成をもとに、実際に最小構成のChrome拡張機能を作る流れへ進めます。




Your Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

スポンサードリンク

記事が気に入ったらシェアお願いします

PAGE TOP ↑