gpt4 book ai didi

service-worker - manifest v3 service worker 顶层的整个代码是否在每次唤醒时都重复运行?

转载 作者:行者123 更新时间:2023-12-05 02:27:26 24 4
gpt4 key购买 nike

经测试:为了避免重复执行某些代码(如chrome.contextMenus.create重复执行使得

Unchecked runtime.lastError: Cannot create item with duplicate id

), 它需要移动到 chrome.runtime.onInstalled.addListener 中。但是一些代码(如 chrome.action.onClicked.addListener)移入了 chrome.runtime.onInstalled.addListener 将不会在下次唤醒时运行。

如果 chrome.action.onClicked.addListener 被放置在 service worker 的顶层,

每次Service Worker唤醒时是否会重新添加Listener,

会不会有多个重复的监听器?

新添加的Listener中的函数和之前添加的Listener中的函数都会执行吗?

https://developer.chrome.com/docs/extensions/mv3/service_workers/说:

后台 Service Worker 在需要时加载,空闲时卸载。一些示例包括:

  • 首先安装扩展程序或更新到新版本。
  • 后台页面正在监听一个事件,事件是已派出。
  • 内容脚本或其他扩展程序发送消息。
  • 扩展中的另一个 View ,例如弹出窗口,调用runtime.getBackgroundPage。

'空闲时卸载',之前添加的监听器是否也会被卸载? ___如果是这样,如何再次唤醒服务人员?

或者只卸载之前添加的Listener中的函数,保留Listener空壳只为唤醒service worker?

最佳答案

是的,它重新运行。

不,不会有重复的听众。
没有多线程,没有休眠/挂起/恢复。

混淆是由文档中相当不恰当的描述引起的。实际发生的是,在一定的超时后,service worker 被简单地终止了。它不会“卸载”或“恢复”。它“完全终止”并“重新开始”。

当它终止时,JavaScript 环境(监听器、变量、一切)都会消失。

启动时,您的 SW 脚本将完整运行。 chrome 事件的每个 addListener 都会在内部注册此监听器。然后唤醒 worker 的事件将被分派(dispatch)给听众。这就是为什么在脚本启动时在事件循环的第一个任务中同步注册监听器很重要(文档使用了 V8 制造商的一个相当晦涩的术语“顶级”并将其过度简化为需要声明脚本全局范围内的监听器,这不是强制性的,因为只要它是同步的,您当然可以在函数调用中执行此操作。

contextMenus API 不同:数据保存在 Chrome 的内部首选项中,因此无需在每次运行时重新创建它,在 chrome.runtime.onInstalled 中执行就足够了。 Firefox 还没有保存它们,但我猜他们会在实现 MV3 后保存它们。

附言

生命周期持续时间为最后一个传入外部事件后的 30 秒。使用运行时端口会将超时时间再增加 5 分钟。使用 native 主机消息传递可以使 service worker 无限期地保持事件状态,但即使没有 native 消息传递,也可以在一定程度上模拟持久性 service worker:more info .

Another view in the extension, such as a popup, calls runtime.getBackgroundPage.

在 MV3 中不再如此。

关于service-worker - manifest v3 service worker 顶层的整个代码是否在每次唤醒时都重复运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73206468/

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