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

Manifest V3 Chrome扩展:打开选项页时内容脚本收重复消息

Manifest V3 Chrome扩展重复消息问题排查与解决

问题描述

开发首个Manifest V3版本Chrome扩展时遇到如下bug:

  • 仅当在其他标签页打开选项页(或多个选项页)时,内容脚本会收到重复消息
  • Service Worker监听tabs.Updated事件,按严格过滤规则向内容脚本发送消息,正常场景运行符合预期
  • 打开1个选项页,内容脚本收到2条消息;打开2个选项页,收到3条消息,以此类推
  • 后台脚本控制台仅显示发送1次消息,但选项页控制台会多一条额外的消息发送记录
  • 已确认Chrome开发者工具中无多个Service Worker实例同时运行

Manifest配置

{
    "manifest_version": 3,
    "icons": {
        "16": "images/favicon.ico",
        "192": "images/icon-192-maskable.png",
        "512": "images/icon-512-maskable.png"
    },
    "action": {
        "default_title": "Target Site Dev Tools",
        "default_icon": "images/icon-512-maskable.png",
        "default_popup": "pages/popup.html"
    },
    "options_page": "pages/options.html",
    "permissions": [
        "activeTab",
        "identity",
        "storage",
        "webRequest"
    ],
    "background": {
        "service_worker": "scripts/background.js",
        "type": "module"
    },
    "content_scripts": [
        {
            "css": [
                "css/contentScript.css"
            ],
            "matches": [
                "https://Target-Site.com/*"
            ],
            "js": [
                "scripts/contentScript.js"
            ],
            "run_at": "document_end"
        }
    ],
    "host_permissions": [
        "https://app.Target-Site.com/Target/*",
        "https://api.Target-Site.com/2.0/*"
    ],
    "web_accessible_resources": [
        {
            "resources": [
                "images/*.*",
                "injectedHTML/*.html"
            ],
            "matches": [
                "https://app.Target-Site.com/*"
            ]
        }
    ]
}

排查方向与解决思路

1. 选项页重复触发消息发送

从选项页控制台的额外发送记录来看,问题大概率出在选项页代码中:

  • 检查选项页JS代码,是否每次加载时都执行了消息发送逻辑
  • 若选项页中注册了tabs.Updated监听,需确保仅注册一次,避免多选项页实例重复触发:
    // 选项页中防止重复注册监听
    if (!window.hasTabUpdateListener) {
        const listener = (tabId, changeInfo, tab) => {
            // 此处需添加严格过滤,仅向目标站点tab发送消息
            if (changeInfo.status === 'complete' && tab.url.match(/https:\/\/Target-Site\.com\//)) {
                chrome.tabs.sendMessage(tabId, { type: 'YOUR_MSG_TYPE' });
            }
        };
        chrome.tabs.onUpdated.addListener(listener);
        window.hasTabUpdateListener = true;
        // 页面卸载时移除监听
        window.addEventListener('beforeunload', () => chrome.tabs.onUpdated.removeListener(listener));
    }
    

2. 后台消息发送目标未精准限制

确认Service Worker中发送消息时是否指定了目标tab ID,避免消息广播到所有匹配标签:

// 后台脚本中明确指定目标tab发送消息
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
    if (changeInfo.status === 'complete' && tab.url.match(/https:\/\/Target-Site\.com\//)) {
        console.log('Sending message to tab:', tabId);
        chrome.tabs.sendMessage(tabId, { type: 'YOUR_MSG_TYPE' });
    }
});

3. 选项页误引入内容脚本逻辑

检查选项页的HTML文件,是否意外引入了contentScript.js或包含相同消息发送逻辑的脚本,导致选项页成为消息发送源之一。

内容的提问来源于stack exchange,提问作者Matt Nulton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:58:22