【作者主頁】:小魚神1024
【擅長領域】:JS逆向、小程序逆向、AST還原、驗證碼突防、Python開發、瀏覽器插件開發、React前端開發、NestJS后端開發等等
chrome.runtime API 提供了一系列的方法和事件,可以通過它來管理和維護 Chrome 擴展的生命周期、消息傳遞、獲取清單(manifest)等
掌握它,是瀏覽器擴展開發必不可少的。我們一起看看它有那些用法吧。
先新建一個 popup.html,因為本節主要學習 chrome.runtime 相關知識,popup.html 內容隨便編寫就行,如下即可:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>chrome.runtime</title></head><body><p>chrome.runtime</p></body></html>
然后,新建 manifest.json 配置文件
{"manifest_version": 3,"name": "chrome.runtime","description": "chrome.runtime API 基礎用法","version": "1.0","action": {"default_popup": "popup.html","default_icon": "icons/icon128.png"},"background": {"service_worker": "background.js"}
}
其他配置項應該都好理解,service_worker 是服務工作線程,可以在擴展后臺運行,可以理解為“后端”服務。
既然配置了 service_worker,我們在根目錄還缺一個 background.js 文件。
新建 background.js 如下:
chrome.runtime.onInstalled.addListener(function () {console.log("插件已安裝");
});
ok,我們基礎擴展開發完成了。在瀏覽安裝成功后,如下:
chrome.runtime.onInstalled.addListener(listener)
點擊 Service Worker 后,彈出的 DelTools 就能看到打印出: 插件已安裝
說明 chrome.runtime.onInstalled 監聽的事件,在擴展安裝時會執行一次。
當刷新或者更新擴展時, chrome.runtime.onInstalled 監聽的事件依然會執行。
這里點擊刷新按鈕后,其實相當于是:先卸載擴展,再重新安裝擴展,后續就有體現。
當我們需要擴展安裝成功后,立即做一些任務(邏輯),chrome.runtime.onInstalled 就是很好的選擇了。
注意:它只有在初次安裝擴展、或者更新擴展時才執行一次,后續將不在執行!
2、chrome.runtime.onStartup.addListener(listener)
chrome.runtime.onStartup 從名稱上大概就能猜出來,其實瀏覽器啟動時,執行其監聽的事件。
我們在 background.js 中添加如下代碼:
chrome.runtime.onInstalled.addListener(function () {console.log("插件已安裝");
});chrome.runtime.onStartup.addListener(function () {console.log("瀏覽器重新啟動");
});
當我們重新啟動瀏覽器,打開擴展程序的 DevTools 調試面板可以看到,已經打印出: 瀏覽器重新啟動
當我們需要擴展每次打開瀏覽器時執行一些任務(邏輯),chrome.runtime.onStartup 是不錯的選擇。
注意:它只有在瀏覽器重新啟動時才執行一次。
3、chrome.runtime.setUninstallURL(url, callback?)
它的作用是:卸載擴展時打開指定URL,通常用于展示問卷調查。
那我們也嘗試驗證下吧。
我們想在卸載時,跳轉到一個問卷調查頁面(我們也沒有啊)。那就先跳轉到百度界面,驗證其功能即可
// 安裝、更新時執行
chrome.runtime.onInstalled.addListener(function () {console.log("插件已安裝");
});// 瀏覽器重新啟動時執行
chrome.runtime.onStartup.addListener(function () {console.log("瀏覽器重新啟動");
});// 卸載時執行
chrome.runtime.setUninstallURL("https://www.baidu.com/",function () {console.log("插件已卸載");}
);
我先驗證下刷新按鈕的功能:
能清楚的看到,點擊刷新按鈕后,先執行了卸載,然后再執行了安裝操作。
當卸載擴展后,立刻就跳轉到了百度界面。
4、chrome.runtime.getURL(path)
它的作用:將一個擴展內部的相對路徑轉換為完整的 URL
如果我們想獲取 background.js 的完整路徑時,可以這樣寫:
// 獲取 background.js 的絕對路徑
const url = chrome.runtime.getURL("background.js")
console.log("url", url)
打印的結果:
同樣的,也可以獲取 pupup.html 的擴展內部路徑:
const popup_url = chrome.runtime.getURL("popup.html")console.log("popup_url", popup_url)
Service Worker 打印結果為:
那小伙伴可能問了,拿到資源(js、css、html、jpg等等)的 url 有什么作用呢?
其實,作用很簡單,就使用它們。比如,如果我們想在擴展安裝成功后,立即打開一個popup.html窗口,實現如下:
// 安裝成功,立即打開一個popup窗口
chrome.runtime.onInstalled.addListener(function () {chrome.tabs.create({ url: chrome.runtime.getURL("popup.html") });
});
這里我們使用了 chrome.tabs API,可以用它打開一個新窗口,后續會講到。使用tabs之前要在manifest.json聲明它,如下:
{"manifest_version": 3,"name": "chrome.runtime","description": "chrome.runtime API 基礎用法","version": "1.0","action": {"default_popup": "popup.html","default_icon": "icons/icon128.png"},"background": {"service_worker": "background.js"},"permissions": ["tabs"]
}
效果如下:
當我們需要用到資源路徑時,chrome.runtime.getURL(path) 絕對是一個不錯的選擇。
5、chrome.runtime.getManifest()
它的作用是:返回當前擴展清單文件的詳細信息。
比如我們要獲取擴展的版本信息:
// manifest 配置信息
const manifest_info = chrome.runtime.getManifest();
console.log("manifest_info", manifest_info);const { version } = manifest_info;
console.log("version", version);
打印結果:
6、chrome.runtime.sendMessage
在擴展中,總會用到擴展頁面、內容腳本和工作服務線程之間互相通信,這個時候就會用到了 chrome.runtime.sendMessage(message, callback?) 和 chrome.runtime.onMessage.addListener(listener) 了,前者是發送消息,后者是接收消息。
舉個例子,當擴展頁面加載完成時,發送一個消息,在后臺服務中接收并打印。
首先,在根目錄新建 popup.js ,內容如下:
// 當前頁面加載完成后
document.addEventListener("DOMContentLoaded", function () {// 發送消息chrome.runtime.sendMessage({ message: "hello" }, function (response) {console.log("收到來自接收者的回復:", response);});
});
然后在 popup.html 中引入,如下:
在后臺服務 background.js 中接收:
打印效果如下:
其中形參:
- message:這是發送的消息,可以是任意類型。
- sender:包含關于消息發送者的信息,例如哪個標簽頁發送的,哪個擴展發送的等。
- sendResponse:用于向發送者回復一個消息。如果這個函數在事件監聽器中返回了 true,那么表示異步回復
代碼地址:傳送門
總結
- 首次安裝或者更新時執行,用 chrome.runtime.onInstalled.addListener(listener) 監聽
- 瀏覽器啟動時執行,用 chrome.runtime.onStartup.addListener(listener) 監聽
- 卸載時執行并跳轉,用 chrome.runtime.setUninstallURL(url, callback?)
- 獲取擴展內部絕對路徑時,用 chrome.runtime.getURL(path)
- 獲取擴展清單時,用 chrome.runtime.getManifest()
- 后臺服務監聽消息、腳本或擴展頁面發送消息是,用 chrome.runtime.onMessage.addListener(listener) 和 chrome.runtime.sendMessage(message, callback?)
創作不易,動動您發財的小手,點贊關注一波,支持我創作更多對您有幫助的文章!