chrome 扩展:持久后台脚本何时停止运行?

问题描述 投票:0回答:2

如果我的 chrome 扩展有一个持久的后台脚本,我可以使用它来存储脚本中的数据,我最终希望将这些数据存储在 chrome.storage.local 中。何时/什么事件触发后台脚本停止运行(以便我可以添加回调以在本地数据超出范围之前将数据存储在 chrome.storage.local 中)?

javascript google-chrome-extension local-storage
2个回答
1
投票

后台脚本可以注册为持久性(在扩展启用且未崩溃时始终运行)或非持久性(不总是但在调用后台脚本中注册的任何运行时事件回调时临时运行)

它们在清单中的“后台”字段下注册,对于非持久后台脚本/页面,“持久”应指定为 

runtime.getBackgroundPage

}
  “背景”: {
    “脚本”:[“背景.js”],
    “持久”:假
  }
}

当卸载
非持久

后台脚本时有一个运行时事件回调(因为它们在几秒钟不活动后自行卸载),当禁用具有持久后台脚本的扩展时(或当然是崩溃了)。 chrome.runtime.onSuspend.addListener(function() { console.log("正在卸载。"); });

您可以使用这个简单的扩展来验证这一点:

manifest.json

{ "name": "onSuspend", “描述”:“暂停”, “版本”:“1.0”, “清单版本”:2, “权限”:[ “贮存” ], “背景”: { “脚本”:[“背景.js”], “持久”:正确 } }

背景.js

false

我发现您可以在禁用持久后台脚本之前注册要运行的回调的唯一方法是加载后台页面并使用窗口的卸载事件,代码用于测试:

{ "name": "停止持久后台脚本之前的回调", "description": "停止持久后台脚本之前的回调", “版本”:“1.0”, “清单版本”:2, “权限”:[ “贮存” ], “背景”: { "页面": "背景.html", “持久”:正确 } }

背景.js

window.addEventListener('卸载', 函数(事件) { localStorage.setItem("已保存", "是"); }); console.log("已保存:", localStorage.getItem('已保存'));

背景.html


要测试它,请尝试禁用并重新启用或重新加载扩展两次。


0
投票

用户 @Wis 的答案在 2020 年可能是正确的 - 但对于 Manifest v3 Chrome 扩展程序来说,这不再是有效的响应。

根据

v3 chrome 扩展服务工作者(又名后台脚本)生命周期的文档

通常,当满足以下条件之一时,Chrome 会终止 Service Worker:

30 秒不活动后。接收事件或调用扩展 API 会重置此计时器。
  • 当单个请求(例如事件或 API 调用)的处理时间超过 5 分钟时。
  • 当 fetch() 响应需要超过 30 秒才能到达时。
并且,再次根据
文档

,看起来有一些黑客方法可以保持 v3 chrome 扩展的活力,例如使用 chrome.runtime.onSuspend.addListener(function() { console.log("Unloading."); chrome.storage.local.set({"Saved": "yes"}, function() {}); }); chrome.storage.local.get("Saved", function(data) { console.log("shouldn't be an empty object": data); }); API 并频繁发送消息。

    

© www.soinside.com 2019 - 2024. All rights reserved.