繁体   English   中英

确切地说,Chrome扩展中的后台脚本何时运行?

[英]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()将被调用。 我还观察到打开一个新的选项卡/窗口不会导致后台脚本再次运行。

我还发现这个页面 ,后台页面被“加载”和“卸载”,但是它很少说明何时运行后台脚本的全局范围中的代码。

它是否仅在安装/重新加载扩展时运行?

任务经理pid和列

由于扩展程序的后台页面只有一个副本全局存在,用于所有用户的选项卡和窗口(响应所有每个选项卡资源),如果永远不会被挂起,您将永远不会看到启动过程(浏览器重新启动和更新期间除外) 。 您可以启动任务管理器,查看扩展程序的后台是否始终存在,并保持相同的Process ID表明它未被关闭。 此外,还有一个可选的Keepalive count列中,显示有多少活动是保持工艺活跃,一个任务-可能被迫持续性,但似乎发生多种原因。

在此输入图像描述

暂停从未发生过

如果后台页面具有persistent:false并且满足所有其他条件以将其关闭,则可以关闭它直到下一个事件发生(listener, getBackgroundPage()等)。 然后,下一个要求它的事件将加载执行全局作用域等的后台页面,作为设置期望被调用的侦听器的一部分。

您可以转到chrome://extensions启用开发人员模式,然后检查扩展程序的后台页面以查看persistentpermissions: [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 例如,如果myDatahandleStateChange()解析的Promise, handleStateChange()其他侦听器可以使用myData.then(..)提供异步响应,并从后台页面的最近重启中获得ajax响应,而不是存储在chrome本地存储中,因为〜安装。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM