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

Chromium 127+下Chrome扩展后台与Popup消息传递失效问题排查

Manifest V3扩展Background向Popup传消息失败(Chromium 127+ Ubuntu)

这个报错Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.的核心是:Background发起消息传递时,Popup的消息监听还未初始化,或者Popup并未处于打开状态。之前版本正常,大概率是Chromium 127+对Service Worker、Popup的生命周期处理逻辑做了调整,而非你的代码本身存在根本性错误。以下是具体排查和修复方向:

1. 调整Popup的消息监听时机

Chromium 127+可能加快了Service Worker的启动速度,若你把Popup的消息监听放在DOMContentLoaded或window.onload事件内,会导致Background发消息时,监听还未注册完成。

  • 错误示例:
window.addEventListener('DOMContentLoaded', () => {
  chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
    // 处理消息逻辑
  });
});
  • 正确做法:直接在popup.js顶部注册监听,确保页面加载前监听已就绪:
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  // 处理消息逻辑
  sendResponse('消息已接收');
});

2. 确保Background在Popup就绪后发消息

不要让Background在启动后立即发送消息,必须等Popup明确处于打开并就绪的状态。可以采用"Popup主动发就绪信号"的方式:

  • Popup端(popup.js):
// 页面加载后立即告知Background自己已就绪
chrome.runtime.sendMessage({type: 'POPUP_READY'}, () => {
  console.log('已向Background发送就绪信号');
});
  • Background端(background.js):
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (msg.type === 'POPUP_READY') {
    // 此时Popup已就绪,发送目标消息
    chrome.runtime.sendMessage({type: 'DATA_UPDATE', data: '需要传递的内容'});
  }
});

3. 改用长连接替代一次性消息传递

如果一次性消息传递的时机问题难以控制,可以使用chrome.runtime.connect()建立长连接,这种方式更稳定,能避免连接未就绪的问题:

  • Popup端(popup.js):
const port = chrome.runtime.connect({name: 'popup-background-channel'});
port.onMessage.addListener((msg) => {
  console.log('收到Background消息:', msg);
});
  • Background端(background.js):
chrome.runtime.onConnect.addListener((port) => {
  if (port.name === 'popup-background-channel') {
    // 连接建立后立即发送消息
    port.postMessage({type: 'INIT_DATA', data: '初始化数据'});
  }
});

4. 调试与容错处理

  • 分别打开Background Service Worker(扩展管理页→"查看视图"→"Service Worker")和Popup的开发者控制台,排查是否有其他隐藏报错。
  • 在Background发送消息时添加错误捕获,必要时重试:
chrome.runtime.sendMessage({type: 'TEST_MSG'}, (response) => {
  if (chrome.runtime.lastError) {
    console.log('消息发送失败:', chrome.runtime.lastError.message);
    // 延迟100ms重试
    setTimeout(() => {
      chrome.runtime.sendMessage({type: 'TEST_MSG'});
    }, 100);
  }
});

内容的提问来源于stack exchange,提问作者Debanjan Dutta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:12:14