【问题标题】:Is there a way to manually unload a background script for a chrome extension?有没有办法手动卸载 chrome 扩展的后台脚本?
【发布时间】:2021-01-03 03:41:33
【问题描述】:

我正在开发一个 Chrome 扩展程序,用于跟踪您使用计算机的时间。我使用一个间隔递增,并使用 chrome.idle.queryState 检查计算机是否被锁定,如果它被锁定,我不会更改我的计数器。

有没有办法手动卸载背景页面,而不是定期检查?或者后台脚本是否会自动卸载和重新加载,例如在计算机休眠 X 分钟后?由于我有一个间隔,我想知道脚本是否会自行卸载。我做了类似的事情:

setInterval(function () {
    chrome.idle.queryState(15, function (state) {
        if (state !== "locked") {
            counter += 1;
            console.log(counter);
        }
    }
}, 6000);

【问题讨论】:

  • 您可以使用window.close(),但这是一个不好的方法。正确的方法是重新编写代码以使用non-persistent background script
  • 请注意,您在此处使用 setInterval 的方式非常低效:它在扩展过程中以几乎 100% 的 CPU 负载不断运行代码。
  • 为什么需要经常检查?有什么理由不能使用 chrome.idle.onStateChanged?
  • @wOxxOm 我将后台脚本设置为persistent等于false。我也忘了在最后添加一个 6,000,所以它每 6 秒运行一次(只是再次编辑它)。 100% CPU 负载是什么意思?拥有持久性与非持久性脚本有什么作用(在文档中它刚刚说对 webRequest api 使用非持久性)?
  • @NadiaCibrikova 我认为这可能有效,感谢您的建议!

标签: javascript google-chrome-extension background


【解决方案1】:

感谢 wOxxOm 和 Nadia Chibrikova 回答问题。在卸载脚本时,最好使用非持久化的后台脚本,像这样:

...
"background": {
    "scripts": ["background.js"],
    "persistent": false
},
...

这将在 15-30 秒后卸载,无论任何时间间隔,只要没有打开的消息端口并且您不在 devtools 中检查它。出于我的目的,我保持一个消息端口打开,所以我使用一个变量来跟踪 Chrome 是否空闲,使用 chrome.idle.onStateChanged,并相应地修改了我的代码:

chrome.idle.setDetectionInterval(15);
chrome.idle.onStateChanged.addListener(function (state) {
    if (state === "locked") {
        isLocked = true;
    } else {
        isLocked = false;
    }
});

【讨论】:

    最近更新 更多