SharedWorker
SharedWorker 是 HTML 标准定义的 Web API 的一部分,是一种特殊的 Worker,支持在多个上下文(例如 window、iframe 甚至 Worker)之间共享
同时,SharedWorker 的全局上下文 SharedWorkerGlobalScope
也与 Worker 不同
创建 SharedWorker
和 Worker 一样,通过调用 SharedWorker()
构造函数来创建
1 | const worker = new SharedWorker('./worker.js') |
SharedWorker()
构造函数支持传入一组可选的配置项,与Worker()
构造函数相同SharedWorker()
构造函数也支持直接传入一个字符串,同配置项的name
参数;特别的,SharedWorker()
中的name
参数作为唯一的一个标识符,在创建新的与之前的拥有相同 URL 的 SharedWorker 时有一定作用
SharedWorker 通过脚本文件 URL 和 name 参数确定是否为同一个 SharedWorker
SharedWorker 消息传递
与 Worker 不同,Client 端通过创建的 SharedWorker 实例上的 port
属性暴露的 MessagePort
接口实例,调用其上的 postMessage()
方法实现发送消息
Client 端通过监听 SharedWorker 实例上的 message
事件实现接收到消息
1 | worker.port.start() |
SharedWorker 环境下接收消息,需要监听 connect
事件,从而获取到新的对应的 MessagePort 实例;监听 MessagePort 实例的 message
事件接收消息
SharedWorker 环境下接收消息,同样需要通过调用 MessagePort 实例的 postMessage()
方法实现发送消息
1 | self.addEventListener('connect', (e) => { |
通常,在 connect
事件回调函数内,会把接收到的 port 存储下来,以便之后使用
1 | const ports = [] |
卸载 SharedWorker
仅支持在 SharedWorker 环境内调用 close()
方法,来卸载当前 Worker
1 | self.close() |
SharedWorker 生命周期
SharedWorker 生命周期与 Client 端的生命周期独立,当任一页面创建 SharedWorker 时其生命周期开始,在没有页面使用 SharedWorker 时其生命周期结束
SharedWorker 全局环境
SharedWorker 全局环境通过 SharedWorkerGlobalScope
表示,该接口继承自 WorkerGlobalScope
,它与 Worker 全局环境差别不大
示例
- https://github.com/skyclouds2001/Frontend-Learning/blob/main/next-learning/shared-worker.html
- https://github.com/skyclouds2001/Frontend-Learning/blob/main/next-learning/shared-worker.js
类型
1 | interface SharedWorker extends EventTarget, AbstractWorker { |