谷歌瀏覽器擴展程序的簡易結構和通信機制

語言: CN / TW / HK

本文已參與「新人創作禮」活動,一起開啟掘金創作之路。

一、擴展程序的簡易結構

當前版本 "manifest_version": 3,擴展程序的核心文件 manifest.json 中配置可生成以下簡易結構,詳細代碼可參考代碼倉 crxTemplate: 谷歌瀏覽器擴展程序的簡易結構和通信機制 (gitee.com)):

popup

json "action": { "default_popup": "page/popup.html" } 配置 "action" 中的 "default_popup",在擴展程序中添加後點擊會出現 "page/popup.html" 頁面。以下是稀土掘金的瀏覽器插件: image.png

content

json "content_scripts": [ { "js": ["scripts/content.js"], "matches": ["<all_urls>"], "run_at": "document_end" } ] 配置 "content_scripts" 後會在 "matches" 匹配的站點上 "run_at" 時機執行 "js" 腳本。可以獲取當前頁面的一些操作。

image.png

panel

json "devtools_page": "page/devtools-background.html", 配置 "devtools_page" 後會加載插件時執行 "page/devtools-background.html" 頁面,但是它是不可見的,但是在需要新增 "panel" 時,需要在其執行時使用以下腳本進行創建,擴展程序修改重新加載後刷新頁面也不會執行,意味着調試時需要打開新頁面才有效。 javascript chrome.devtools.panels.create( 'ChromeDevToolsTemplate', null, '../page/panel.html' ) 以下是 Vue DevTools 的瀏覽器插件對應的 Vue 的 panel: image.png

二、通信機制

popup.js、content.js 與 panel.js 三者間的通信機制。

popup.js: ```javascript // button 按鈕點擊時發送消息 查看控制枱時需要對 popup 頁面進行檢查,在對應的控制枱輸出 document.querySelector('button').onclick = function () { chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ chrome.tabs.sendMessage(tabs[0].id, {'popup': true}, function(res){ console.log(res); }) }) } // 接收消息 查看控制枱時需要對 popup 頁面進行檢查,在對應的控制枱輸出 chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){ console.log(message, sender); sendResponse('popup') })

```

content.js: javascript // 接收消息 在當前控制枱輸出 chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){ console.log(message, sender); // 發送消息 在當前控制枱輸出 chrome.runtime.sendMessage({greet: 'hello, I am content.'}, function(response){ console.log(response); }) sendResponse('content'); })

panel.js: javascript // 該打印是在檢查 panel 的控制枱中,類似於嵌套的控制枱 document.querySelector('button').onclick = function () { console.log('hello panels!'); chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ chrome.tabs.sendMessage(tabs[0].id, 'panels', function(res){ console.log(res); }) }) } // 接收消息 打印在檢查 panel 的控制枱中,類似於嵌套的控制枱 chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){ console.log(message, sender); sendResponse('panels'); }) 以上,從調試面板上可以看出,這個三塊是屬於不同模塊的東西,content.js 是當前頁面的腳本,popup 是 popup.html 頁面的腳本,panel 是對應 panel.html 的腳本,所處理的頁面不一樣,對應的功能也是不一樣的。