Background Service Worker
Background Service Worker 是擴充功能裡沒有畫面、常駐在背景監聽事件的程式碼,負責協調其他元件、回應瀏覽器事件(例如安裝、點擊圖示、收到訊息)。Manifest V3 把舊版(Manifest V2)持續執行的 Background Page,改成事件驅動、會自動休眠的 Service Worker,這是這次規格改版最大的變化之一。
事件驅動與生命週期
Service Worker 不會一直執行:Chrome 在沒有事件發生時,會在幾十秒內把它關閉以節省資源,等下次有事件(例如使用者點擊圖示、瀏覽器收到訊息)才重新啟動並執行對應的監聽器。這代表:
- 不能依賴 Service Worker 裡的一般變數長期保存狀態(重啟後會歸零),需要保存的資料要寫進
chrome.storage(見 chrome.storage)。 - 所有事件監聽器(
chrome.runtime.onInstalled、chrome.action.onClicked等)必須寫在最上層(top-level),Chrome 才能在重啟時正確重新註冊,不能包在非同步流程或條件式裡才註冊。
宣告與基本寫法
background.js
// 擴充功能第一次安裝,或更新版本時觸發,適合做初始化
chrome.runtime.onInstalled.addListener((details) => {
if (details.reason === "install") {
chrome.storage.local.set({ notes: [] });
}
});
// 監聽工具列圖示點擊(未設定 default_popup 時才會觸發)
chrome.action.onClicked.addListener((tab) => {
console.log("使用者點擊了圖示,目前分頁:", tab.url);
});
// 監聽其他元件送來的訊息
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === "GET_NOTES") {
chrome.storage.local.get("notes", (result) => {
sendResponse(result.notes ?? []);
});
return true; // 告訴 Chrome 會非同步呼叫 sendResponse
}
});
常見用途
- 監聽
chrome.runtime.onInstalled,做安裝或更新時的初始化。 - 監聽
chrome.contextMenus、chrome.alarms、chrome.notifications等不屬於任何特定網頁的瀏覽器層級事件。 - 作為 Content Script 與 Popup/Options 頁面之間傳遞訊息、存取共用資料的中介。
除錯要點
Service Worker 沒有一般網頁的 Console,要在 chrome://extensions 找到該擴充功能卡片,點擊「服務工作者(Service worker)」連結才能開啟對應的 DevTools。詳見 除錯與測試。
下一步
了解 Background 之後,接著看 Content Scripts,認識如何把程式碼注入到實際的網頁裡。