代码之家  ›  专栏  ›  技术社区  ›  Sweeper

chrome扩展中的后台脚本何时运行?

  •  3
  • Sweeper  · 技术社区  · 6 年前

    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()

    enter image description here 按钮 xhr.send() 将被调用。我还注意到,打开一个新的选项卡/窗口不会导致后台脚本再次运行。

    我也发现了这个 page ,这就是背景 获取“已加载”和“已卸载”,但它很少说明代码何时在后台的全局范围内 剧本

    1 回复  |  直到 6 年前
        1
  •  5
  •   Community CDub    5 年前

    任务管理器pid和列

    由于对于用户的所有选项卡和窗口(响应每个选项卡的所有资源),只有一个扩展背景页的副本全局存在,因此,如果启动过程从未暂停,您将永远看不到启动过程(浏览器重新启动和更新期间除外)。您可以启动任务管理器,查看扩展的背景是否始终存在并保持不变 Process ID Keepalive count 列,该列显示有多少活动保持流程处于活动状态,任务具有 - 可能是被迫坚持,但是 – 似乎有多种原因。

    enter image description here

    永远不会发生

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

    你可以去 chrome://extensions 启用开发人员模式,然后检查要查看的扩展的后台页面 persistent permissions: [chrome.webRequest]

    enter image description here

    enter image description here

    persistent:true 如果没有显式设置,则可能是背景页全局范围中的状态导致的。最好还是照着规则去做 migration guide

    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)))});
        }
      })
    

    这应该大致相当于在全局范围内使用 ,但xhr可以被垃圾收集,因为这不是其他侦听器的作用域等(因为chrome将诸如网络套接字之类的资源类型标记为它不能挂起的原因,所以将它们移出作用域很重要),即使浏览器仍未自动挂起扩展,也可以通过在后台页面检查中重新加载扩展来测试其行为。

    如果你不想适应 持续性:假 ,然后我就开始 在显式中,而不是依赖于当前的隐式行为(即使您无法在测试系统上引起挂起,如果您设置 持续性:假 .)

    暂停发生,但不会导致代码出现问题

    如果你找到 进程ID 正在改变,但你没有任何问题,那么你就有点幸运了。系统确保每当为您重新启动传入请求的后台页面时,您的全局作用域都会运行,但是 it does not make sure any asynchronous parts have completed . 例如,如果它需要启动您的后台页面以查看是否有合适的侦听器,那么它必须启动ajax,但是允许它在全局范围的同步部分完成运行时调用该侦听器,这可能是在响应之前。因此,你不能指望 MyData

    在全局范围内设置/使用数据时呈现事件处理程序

    如果希望将xhr请求保持在全局范围内并正确支持 持续性:假 myData 我的数据 这是一个承诺 handleStateChange() 解析时,其他侦听器可以使用 myData.then(..)