🐳
[Chrome拡張機能] background/content script/popupのメッセージやり取りのイメージ
Chrome拡張機能を作っていて、いろいろ混乱したのでまとめておきます。
各スクリプトの主な用途
-
background.js <service worker>
裏で動かしておくもの。APIをフルで使えるので以下2つの橋渡し的役割。 -
content.js <content script>
表示されたページに対して書き換えなど、DOM操作を行う。 -
popup.js <browser action>
アイコンがクリックされたときの動作および表示されたpopup表示内の処理を担う。
互いにAPIによって情報のやり取りする。(メッセージパッシング)
- 大変わかりやすい図が載っている記事がありました。
- tabs・runtimeと書いてあるものは、APIの名前です。
https://qiita.com/sakaimo/items/5e41d6b2ad8d7ee04b12#メッセージパッシングの関係図
メッセージを送るときはsend.Message、受け取るときはonMessage
メッセージを送信
chrome.XX.sendMessage({ message: "送るよ" }, (response) => {
//処理
});
メッセージを受信
chrome.XX.onMessage.addListener((request, sender, sendResponse) =>{
console.log(request.message) //送るよ
});
タブの情報を取得するときは、tabs.query
-
アクティブなタブを取得
background.jschrome.tabs.query({active: true, currentWindow: true}, (tabs) => { console.log({ tabs }) });
-
すべてのタブを取得
background.jschrome.tabs.query({}, (tabs) => { console.log({ tabs }) });
各スクリプト間のメッセージやり取り
background.js → content js
background.js(メッセージを送信)
//この前にtabの情報(tab.id)を取得するコードを書いておく必要がある。
chrome.tabs.sendMessage(tab.id, {message:'to_content_script'}, (response)=>{
//処理
});
content.js(メッセージを受信)
chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>{
//処理
});
- content.jsでページの書き換えなどを行いたいときタブ情報が必要ですが、content.jsではタブ情報を得ることができません(タブIDを取得するtabs APIを使えない)。そのためtabsAPIを使用可能なbackground.jsを介してtab情報をcontentへ渡します。
- メッセージパッシングの図から、background→contentではtabs APIを使用していることがわかります。
popup.js → background.js
popup.js(メッセージを受信)
chrome.runtime.sendMessage({ message: "to_background" }, (response) => {});
//処理
});
background.js(メッセージを送信)
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
//処理
});
popup.js → content.js 他
- メッセージパッシング図と上の2例を参考にしてください。
- そのほかのつなぎも同じくです。
- 反対方向へのメッセージも同様です。
content scriptはどのページに対して処理をする?
渡されたタブID(ページ)に対して処理を行う。
- 以下のイメージです。
- content scriptは指定されたページ(タブID)のみに対して、処理を実行します。
- 複数のタブに処理を行う場合は、それらのタブのIDをすべてcontents scriptに対して渡す必要があります。
- アクティブなタブを指定することもできます。
Discussion