跳轉至

建立 2026-09-17 更新 2026-09-17

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.onInstalledchrome.action.onClicked 等)必須寫在最上層(top-level),Chrome 才能在重啟時正確重新註冊,不能包在非同步流程或條件式裡才註冊。

宣告與基本寫法

manifest.json(片段)
{
  "background": {
    "service_worker": "background.js"
  }
}
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.contextMenuschrome.alarmschrome.notifications 等不屬於任何特定網頁的瀏覽器層級事件。
  • 作為 Content Script 與 Popup/Options 頁面之間傳遞訊息、存取共用資料的中介。

除錯要點

Service Worker 沒有一般網頁的 Console,要在 chrome://extensions 找到該擴充功能卡片,點擊「服務工作者(Service worker)」連結才能開啟對應的 DevTools。詳見 除錯與測試

下一步

了解 Background 之後,接著看 Content Scripts,認識如何把程式碼注入到實際的網頁裡。