Manifest V2迁移至V3后sendMessage返回结果异常问题排查
Manifest V3扩展迁移后
sendMessage返回undefined问题 我有一个基于Manifest V2的跨浏览器扩展,此前依赖browser-polyfill实现多浏览器兼容。现在迁移至Manifest V3,根据Chrome官方文档,V3中sendMessage原生返回Promise,因此我移除了polyfill,但扩展无法正常工作。
发现sendMessage确实返回了Promise,但控制台打印显示,.then的回调信息出现在service worker(原后台脚本)的消息监听器打印信息之前,导致结果始终为undefined。以下是相关代码及现象:
内容脚本(context.js)
if (typeof globalThis.browser === "undefined") environment = chrome.runtime else environment = browser.runtime onCompletePageLoad() function onCompletePageLoad() { let nmarr = [{request: "AA"}]; let snd = environment.sendMessage(nmarr); console.log("SENDER = ", snd); snd.then( result => {console.log("AFTER MESSAGE RETURN = ", result) }, error => {} ); }
Service Worker脚本(background.js)
let environment if (typeof globalThis.browser === "undefined") environment = chrome.runtime else environment = browser.runtime environment.onMessage.addListener(onContentMessage); function onContentMessage(msg, sender, handleResponse) { console.log("MESSAGE RECEIVED"); return new Promise(resolve => { setTimeout(() => { console.log("TIMES OUT"); resolve("async response from background script"); }, 2000); }); }
控制台输出
SENDER = Promise {
}
AFTER MESSAGE RETURN = undefined
(原扩展中后台脚本日志与内容脚本在同一控制台,但测试扩展中后台日志仅在service-worker控制台显示,无法展示打印顺序)
Manifest配置(manifest.json)
{ "manifest_version": 3, "name": "messagetest manifest 3", "version": "1.0", "description": "Testing content to background message sending", "background": { "service_worker": "background.js" }, "content_scripts": [ { "matches": ["<all_urls>"], "js": ["content.js"] } ] }
请问我哪里操作出错了?
内容的提问来源于stack exchange,提问作者Dmitry Kurgansky
相关产品推荐
相关产品推荐

