shared worker 通过请求合并、带 ttl 的内存缓存、主动取消挂起请求及降级兜底机制,从源头减少重复无效请求。具体包括:用 url+序列化参数作 key 合并请求;map 缓存响应并读时校验过期;页面卸载前通知取消 pending 请求;worker 不可用时自动回退 fetch 并打日志。

Shared Worker 本身不发请求,但能大幅减少后端收到的重复、无效、竞态请求——这才是清理“垃圾流量”的本质。关键不是让它多做什么,而是让它拦住不该发的那些。
合并相同请求,从源头砍掉冗余
多个窗口同时查 /api/user/123,传统做法是发 5 次;Shared Worker 把它们收口成一次真实请求,响应返回后分发给所有等待方。实现靠一个 pending 请求 Map:
- 用 URL + 序列化参数(如 JSON.stringify({id: 123}))生成唯一 key
- 首次请求进入时,创建 Promise 并存入 Map,同时发起 fetch
- 后续同 key 请求不发网络,只把当前 port 加入 resolveList
- fetch 完成后遍历 resolveList,逐个 postMessage 返回结果
缓存带 TTL 的响应,避免短时高频重刷
用户快速切页、刷新、开新标签,常导致同一接口在几秒内被反复调用。Shared Worker 可用内存 Map 实现轻量缓存:
一款AI工具,主要用于Monitor and clean up invalid Codex authentication files in CPA. Check quota status, disable files returning 401 errors, and perform dual verification before deletion.,适合需要提升相关任务效率的用户。
- 缓存结构:Map
- 默认 TTL 设为 30–60 秒,适合用户操作间隙(如列表页切换再返回)
- get 前检查 expiresAt,过期则删除并返回未命中,不走缓存
- 不依赖 setTimeout 清理——Shared Worker 可能长期空闲,改用“读时校验”更可靠
主动取消挂起请求,防止页面关闭后残留
用户关掉某个标签页,但该页发起的请求还在 pending 队列里?它不会自动消失,可能等几秒后才超时,白白占着资源。必须由页面主动通知:
- 页面卸载前发 { type: "cancel", key: "user-123" }
- Worker 收到后从 pendingRequests Map 中移除对应项
- 调用 AbortController.abort() 终止正在 fetch 的请求(若尚未完成)
- 避免使用 onbeforeunload —— 页面崩溃时无法触发,推荐用 pagehide 或 visibilitychange
降级兜底,不让 Worker 失效变成放大器
Shared Worker 在 Safari 旧版、file:// 协议或 HTTPS 缺失时会静默失败。此时若页面逻辑仍依赖它,反而会丢请求或卡死:
- 创建 SharedWorker 后立即监听 port.onmessage,超时 500ms 无响应即判定不可用
- 不可用时 fallback 到原生 fetch,并打日志标记“SW fallback”便于监控
- 避免在 Worker 不可用时还往 port.postMessage,否则消息丢失且无提示
- 可在页面侧加一层请求代理函数,统一处理 Worker 存在性判断










