Google chrome extension &引用;“扩展上下文无效”;调用chrome.runtime.sendMessage()时出错

Google chrome extension &引用;“扩展上下文无效”;调用chrome.runtime.sendMessage()时出错,google-chrome-extension,content-script,Google Chrome Extension,Content Script,我在Chrome扩展中有一个传递消息的内容脚本。每隔一段时间,当内容脚本调用 chrome.runtime.sendMessage({ message: 'hello', }); 它抛出一个错误: Uncaught Error: Extension context invalidated. 这个错误是什么意思?我找不到关于它的任何文档 这种情况并不总是发生。事实上,它很难复制。如果我只是让页面在后台打开一段时间,似乎就会发生这种情况 另一个线索:我写过很多Chrome扩展,其中包含传递

我在Chrome扩展中有一个传递消息的内容脚本。每隔一段时间,当内容脚本调用

chrome.runtime.sendMessage({
  message: 'hello',
});
它抛出一个错误:

Uncaught Error: Extension context invalidated.
这个错误是什么意思?我找不到关于它的任何文档

这种情况并不总是发生。事实上,它很难复制。如果我只是让页面在后台打开一段时间,似乎就会发生这种情况


另一个线索:我写过很多Chrome扩展,其中包含传递消息的内容脚本,我以前从未见过这个错误。主要区别在于,此内容脚本由后台页面使用

chrome.tabs.executeScript({
  file: 'contentScript.js',
});

使用“代码>执行文件Script < /COD>而不是清单文件以某种方式改变内容脚本的生命周期?

< P>这肯定与在内容和后台脚本之间的连接中丢失的消息监听器有关。

我一直在扩展中使用这种方法,因此我有一个可以在后台脚本和内容脚本中使用的模块

messenger.js

const context=(typeof browser.runtime.getBackgroundPage!=='function')?'内容“:“背景”
chrome.runtime.onConnect.addListener(函数(端口){
port.onMessage.addListener(函数(请求){
试一试{
const object=window.myGlobalModule[request.class]
对象[request.action].apply(模块,request.data)
}捕获(){
控制台错误(错误)
}
})
})
导出函数postMessage(请求){
如果(上下文=='content'){
const port=chrome.runtime.connect()
port.postMessage(请求)
}
如果(上下文=='background'){
if(request.allTabs){
chrome.tabs.query({},(tabs)=>{
for(设i=0;i{
tabs.forEach((tab)=>{
const port=chrome.tabs.connect(tab.id)
port.postMessage(请求)
})
})
}否则{
查询({active:true,currentWindow:true},(制表符)=>{
const port=chrome.tabs.connect(tabs[0].id)
port.postMessage(请求)
})
}
}
}
导出默认值{postMessage}
现在,您只需要在内容和后台脚本中导入此模块。如果要发送消息,只需执行以下操作:

messenger.postMessage({
课程:“SomeClassimyGlobalModuçe”,
动作:'SomeMethodOfAtClass',
数据:[//任何要发送的数据类型
})

您可以指定是否要发送到
allTabs:true
、特定域
tabDomain:'google.com'
或单个选项卡
tabId:12

是否尝试了长期连接?@herodrigues是的,我打算下一步尝试。你觉得有用吗?我想有用。我从未开发过没有长期连接的扩展。请参阅我在回答中使用的方法。该错误意味着您重新加载了扩展或禁用/启用了扩展,因此旧内容脚本是孤立的,需要检测。有几个现有的答案显示了如何处理这个问题,尝试搜索。这是非常甜蜜的!我一定要试一试。谢谢分享!“消息侦听器丢失”-您能澄清一下吗?除了浏览器中的一个bug之外,从技术上讲,这似乎不可能发生,这需要调查和确认。此外,使用chrome.runtime.sendMessage进行一次性消息传递也没有什么问题。OP错误的常见原因是在扩展重新加载/更新时孤立内容脚本。