如何将Manifest V2背景脚本适配为Manifest V3单Service Worker?
Manifest V2 背景脚本迁移到 Manifest V3 单 Service Worker 适配方案
核心修改要点
Manifest V3 不再支持多背景脚本,仅允许单个 Service Worker,同时原 chrome.tabs.executeScript API 已被废弃,需替换为 chrome.scripting.executeScript,还要补充必要的权限配置。
1. 修正 Manifest V3 配置
将原多脚本的背景配置改为单 Service Worker,并添加所需权限:
{ "manifest_version": 3, "name": "你的扩展名称", "version": "1.0", // 必须声明的权限 "permissions": ["webRequest", "scripting", "tabs"], // 替换为你实际需要监听的URL规则,对应原代码中的"ETC..." "host_permissions": ["https://example.com/*", "https://another-domain.com/*"], "background": { "service_worker": "sw.js" } }
2. 重构 Service Worker 监听代码
将原两个背景脚本的监听逻辑合并到 sw.js 中,替换废弃的 API:
方案一:合并为单个监听(更简洁)
chrome.webRequest.onCompleted.addListener(details => { // 仅处理POST请求 if (details.method !== "POST") return; // 根据URL规则匹配对应的注入脚本 if (details.url.includes("匹配第一个脚本的URL特征")) { chrome.scripting.executeScript({ target: { tabId: details.tabId }, files: ["script.js"] }).catch(err => console.error("注入script.js失败:", err)); } else if (details.url.includes("匹配第二个脚本的URL特征")) { chrome.scripting.executeScript({ target: { tabId: details.tabId }, files: ["scriptTwo.js"] }).catch(err => console.error("注入scriptTwo.js失败:", err)); } }, { urls: ["*://*/*"] }); // 替换为你实际需要的URL范围
方案二:保留独立监听(逻辑更清晰)
// 对应原第一个监听逻辑 chrome.webRequest.onCompleted.addListener(details => { if (details.method !== "POST") return; chrome.scripting.executeScript({ target: { tabId: details.tabId }, files: ["script.js"] }).catch(err => console.error(err)); }, { urls: ["第一个URL规则"] }); // 对应原第二个监听逻辑 chrome.webRequest.onCompleted.addListener(details => { if (details.method !== "POST") return; chrome.scripting.executeScript({ target: { tabId: details.tabId }, files: ["scriptTwo.js"] }).catch(err => console.error(err)); }, { urls: ["第二个URL规则"] });
关键注意事项
- 原
swTwo.js中的逻辑需要全部合并到sw.js中,Manifest V3 不支持加载多个 Service Worker chrome.scripting.executeScript必须指定target.tabId,且需要在 manifest 中声明scripting权限host_permissions必须覆盖你要监听的所有 URL,否则webRequest监听会无权限触发
内容的提问来源于stack exchange,提问作者SoMore
相关产品推荐
相关产品推荐

