![](/img/trans.png)
[英]chrome extension: when does a persistent background script stop running?
[英]Exactly when does the background script in a chrome extension get run?
在我的chrome扩展中,我有一个后台脚本,它将使用XMLHttpRequest
获取它需要的一些数据。
// note that this code is in the global scope i.e. outside of any function
// also note that I got this code from the page talking about XMLHttpRequest
var myData = [];
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = handleStateChange;
xhr.open("GET", "...", true);
xhr.send();
function handleStateChange() {
myData = Object.values(JSON.parse(xhr.responseText));
}
我想知道什么时候运行xor.send()
。
我观察到每次我按下按钮重新加载扩展 按钮,
xhr.send()
将被调用。 我还观察到打开一个新的选项卡/窗口不会导致后台脚本再次运行。
我还发现这个页面 ,后台页面被“加载”和“卸载”,但是它很少说明何时运行后台脚本的全局范围中的代码。
它是否仅在安装/重新加载扩展时运行?
由于扩展程序的后台页面只有一个副本全局存在,用于所有用户的选项卡和窗口(响应所有每个选项卡资源),如果永远不会被挂起,您将永远不会看到启动过程(浏览器重新启动和更新期间除外) 。 您可以启动任务管理器,查看扩展程序的后台是否始终存在,并保持相同的Process ID
表明它未被关闭。 此外,还有一个可选的Keepalive count
列中,显示有多少活动是保持工艺活跃,一个任务-
可能被迫持续性,但–
似乎发生多种原因。
如果后台页面具有persistent:false
并且满足所有其他条件以将其关闭,则可以关闭它直到下一个事件发生(listener, getBackgroundPage()
等)。 然后,下一个要求它的事件将加载执行全局作用域等的后台页面,作为设置期望被调用的侦听器的一部分。
您可以转到chrome://extensions
启用开发人员模式,然后检查扩展程序的后台页面以查看persistent
和permissions: [chrome.webRequest]
因为它们会干扰:
如果你仍然得到persistent:true
没有显式设置导致它的persistent:true
行为,那么它可能是由后台页面的全局范围中的状态引起的。 最好仍然遵循迁移指南 ,例如,如果要将数据从第一次启动暂停到暂停,则xhr请求属于启动:
chrome.runtime.onStartup.addListener(function() {
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = handleStateChange
xhr.open("GET", "...", true)
xhr.send()
function handleStateChange() {
chrome.storage.local.set({ myData:
JSON.stringify(Object.values(JSON.parse(xhr.responseText)))});
}
})
这应该具有在全局范围内使用persistent:true
运行此代码的大致相同的行为,但xhr可以被垃圾收集,因为这不是其他侦听器等的范围。(因为chrome标记资源类型,如网络套接字作为原因无法暂停,重要的是让它们超出范围。)调整后,即使浏览器仍未自动暂停,您也可以在后台页面检查中测试重新加载扩展的行为。
如果你不想适应persistent:false
,那么我会在manifest中设置persistent:true
而不是依赖于当前的隐式行为。 (即使您无法在测试系统上暂停,如果设置persistent:false
,具有更大内存压力或其他条件的系统可能会卸载后台页面。)
如果您发现Process ID
正在发生变化,但您没有遇到任何问题,那么您有点幸运。 系统会确保您的全局作用域在重新启动传入请求的后台页面时运行,但不确保任何异步部分已完成 。 例如,如果需要启动后台页面以查看是否有适当的侦听器,它必须启动ajax,但是当全局作用域的同步部分完成运行时(可能在响应之前),它可以调用该侦听器。 因此,如果挂起工作正常,则无法依赖MyData
。
如果要将xhr请求保留在全局范围内并正确支持persistent:false
,则需要确保侦听器立即注册但在内部等待myData
。 例如,如果myData
是handleStateChange()
解析的Promise, handleStateChange()
其他侦听器可以使用myData.then(..)
提供异步响应,并从后台页面的最近重启中获得ajax响应,而不是存储在chrome本地存储中,因为〜安装。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.