gpt4 book ai didi

google-chrome-extension - 按需持久化后台页面还是不卸载的事件页面?

转载 作者:行者123 更新时间:2023-12-04 15:19:58 29 4
gpt4 key购买 nike

我想构建一个行为像计时器的扩展。它应该在激活时倒计时秒数,但不应该对不事件做任何事情。

chrome.alarms API 很有趣,但没有足够的精度和粒度。它每分钟最多只能触发一次,并且可能会延迟触发。如果我想要更频繁地执行某些操作,我将无法使用此 API。

然后,下一个自然的解决方案是使用 background page并使用 setTimeoutsetInterval在那里。然而,后台页面是持久的,即使在空闲时它们也会占用资源(例如内存)。所以它们并不理想。

最好的解决方案似乎是 event page运行计时器。但是,文档说:

Once it has been loaded, the event page will stay running as long as it is active (for example, calling an extension API or issuing a network request).

[…]

Once the event page has been idle a short time (a few seconds), the runtime.onSuspend event is dispatched. The event page has a few more seconds to handle this event before it is forcibly unloaded.

[…]

If your extension uses window.setTimeout() or window.setInterval(), switch to using the alarms API instead. DOM-based timers won't be honored if the event page shuts down.



不幸的是,有一个活跃的 setInterval认为事件页面处于事件状态是不够的。事实上,根据我的测试,最多 10 秒的间隔足够短以保持事件页面运行,但任何大于 10 或 15 秒的间隔都太远,事件页面将被卸载。我已经在 my crx-reload-tab project 上测试过了.

我相信我想要的是一个中间立场:
  • 我想要一个可以按需加载和卸载的背景页面 . (而不是一直加载的。)
  • 我想要一个事件页面,只要我说 ;但否则可以卸载。 (而不是浏览器自动卸载的。)

  • 是否可以?我该怎么做?

    最佳答案

    后台页面无法按需卸载,Chrome 会为您决定事件页面生命周期(您无法在 onSuspend 中做任何事情来阻止它)。

    如果您关心的是计时器,您可以尝试我的解决方案 this answer ,它基本上将计时器拆分为较短的计时器,以进行“稀疏”忙等待。这足以保持事件页面加载,如果您不需要经常这样做,这是一个可行的解决方案。

    一般来说,有一些事情可以保持事件页面加载:

    If you're using message passing, be sure to close unused message ports. The event page will not shut down until all message ports are closed.



    如果您有任何其他上下文来保持打开 Port,则可以利用此漏洞。例如内容脚本。见 Long-lived connections docs更多细节。

    在实践中,如果您经常或经常需要精确的亚分钟计时器,则事件页面是一个糟糕的解决方案。您从使用其中获得的资源可能无法证明其合理性。

    关于google-chrome-extension - 按需持久化后台页面还是不卸载的事件页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37017209/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com