You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:47:31