Chrome扩展Manifest V3消息传递无法将响应回传background问题
Chrome Manifest V3 消息无法回传问题解决方案
问题原因
chrome.tabs.sendMessage参数使用错误:Manifest V3 中该方法的第三个参数为可选配置项,传入null会导致部分Chrome版本参数解析异常,回调函数无法正常触发接收返回值。- 消息监听端口提前关闭:Chrome默认会在
chrome.runtime.onMessage监听器执行结束后关闭消息端口,Manifest V3的service worker环境下即使同步调用sendResponse,也可能出现端口提前关闭导致响应无法回传的问题。
修正方案
1. 修改background.js代码
删除chrome.tabs.sendMessage的第三个null参数,修正后代码如下:
const actions = { GET_BUTTON_FROM_DOM: { REQUEST: 'getButtonFromDOMRequest', RESPONSE: 'getButtonFromDOMResponse', } } const sendMessage = (type, payload) => { chrome.tabs.query({ active: true, currentWindow: true }, tabs => { chrome.tabs.sendMessage( tabs[0].id, { type, payload }, (e) => { alert(); console.log(e) } ); }); }; chrome.action.onClicked.addListener(tab => sendMessage(actions.GET_BUTTON_FROM_DOM.REQUEST, null));
2. 修改content.js代码
在消息监听器对应分支新增return true,告知Chrome保持消息端口开放等待响应发送完成,修正后代码如下:
const actions = { GET_BUTTON_FROM_DOM: { REQUEST: 'getButtonFromDOMRequest', RESPONSE: 'getButtonFromDOMResponse', } } chrome.runtime.onMessage.addListener((rq, sender, sendResponse) => { console.log(rq, sender); console.log(sendResponse); switch (rq.type) { case actions.GET_BUTTON_FROM_DOM.REQUEST: console.log('correct case'); sendResponse({ x: 'ahoj' }) return true; default: console.log('Invalid event type!'); } });
补充检查项
如果修正后仍存在问题,可以检查manifest.json配置:
- 确认
content_scripts配置的匹配规则覆盖当前测试的页面地址 - 确认已声明所需的host权限,例如
"host_permissions": ["<all_urls>"]
内容的提问来源于stack exchange,提问作者Branislav Blazek
相关产品推荐
相关产品推荐

