use*_*750 3 service-worker chrome-extension-manifest-v3
经过测试:为了避免重复执行某些代码(比如chrome.contextMenus.create重复执行使得
未选中的runtime.lastError:无法创建具有重复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 在需要时加载,在空闲时卸载。一些例子包括:
说“空闲时卸载”,之前添加的监听器也会被卸载吗?___如果是这样,如何再次唤醒服务人员?
或者只卸载前面添加的Listener中的功能,并保留Listener空壳只是为了唤醒service worker?
是的,它重新开始。
不,不会有重复的听众。
没有多线程,没有睡眠/挂起/恢复。
造成混乱的原因是旧版本文档中的描述相当不恰当,现在已重写。实际发生的情况是,在一定的超时后,服务工作人员将被终止。它不会“卸载”或“恢复”。它“完全终止”并“重新开始”。
当它终止时,JavaScript 环境就会消失(JS 监听器、变量、一切)。
当浏览器启动它以响应您在上次运行软件时通过 addListener 订阅的事件时,您的软件脚本将完整运行。每个addListener事件都会chrome在内部注册此侦听器。然后唤醒工作人员的事件将被分派给侦听器。这就是为什么在脚本启动时在事件循环的第一个任务中同步注册侦听器非常重要(旧文档使用了 V8 制造商的一个相当晦涩的术语“顶级”,并将其过度简化为需要声明脚本全局范围内的侦听器,这不是强制性的,因为只要它是同步的,您当然可以在函数调用中执行此操作)。
contextMenus API 有所不同:数据保存在 Chrome 的内部首选项中,因此无需在每次运行时重新创建它,在 chrome.runtime.onInstalled 中执行就足够了。Firefox 还没有保存它们,但我猜一旦他们实现了 MV3,他们就会保存它们。
聚苯乙烯
生命周期为最后传入外部事件后 30 秒。使用运行时端口会额外增加 5 分钟的超时时间。使用本机主机消息传递可以使 Service Worker 无限期地保持活动状态,但即使没有本机消息传递,也可以在一定程度上模拟持久 Service Worker:更多信息。
扩展中的另一个视图(例如弹出窗口)调用runtime.getBackgroundPage。
MV3 中不再如此。
| 归档时间: |
|
| 查看次数: |
715 次 |
| 最近记录: |