Chrome扩展Manifest V3 Service Worker在macOS上setTimeout/setInterval出现异常延迟问题求助
Chrome扩展Manifest V3 Service Worker在macOS上setTimeout/setInterval出现异常延迟问题求助
我最近遇到了一个非常诡异的问题,和Chrome扩展Manifest V3的Service Worker有关,想请教大家有没有类似的排查思路或者解决方案。
最开始我实现了一个常规的sleep函数:
async sleep (ms: number) { return new Promise(resolve => setTimeout(resolve, ms)) }
问题详情
这个函数在内容脚本、Chrome开发者控制台里运行都很正常,但只有在Mac的Service Worker中执行时,延迟会变得完全随机——有时候接近设定的ms值,有时候偏差大到离谱,比如设500ms实际等了5000ms左右。更奇怪的是:
- Windows上用同版本Chrome(131)完全没有这个问题
- 这个异常是最近才出现的(大概在2024年8-12月之间),之前两年多时间里都运行正常
- 延迟的偏差幅度已经远超出JS定时器本身的正常精度误差,所以我怀疑是有外部因素在干扰
进一步测试:排除Service Worker闲置的可能
为了确认是不是Service Worker被闲置后重新激活导致的延迟,我在Service Worker里加了这段测试代码:
self.addEventListener('activate', () => { console.log('+++++++++++++ Service Worker activated') }) var lastHeartbeat = Date.now() setInterval(() => { const now = Date.now() console.log(`${now - lastHeartbeat}ms`) lastHeartbeat = now }, 100);
日志里除了首次加载扩展时的激活记录,之后再也没有新的激活日志,这说明Service Worker没有被闲置重启。但setInterval的执行间隔依然完全随机,比如这段采样日志:
101ms, 99ms, 2055ms, 100ms, 3511ms, 394ms, 1416ms, 4439ms, 1341ms, 2862ms, 1216ms, 1794ms, 1885ms, 802ms, 303ms, 405ms, 77ms, 100ms, 367ms, 34ms, 1348ms, 52ms, 99ms
有时候甚至会出现10秒级的延迟,看起来像是事件循环被什么东西阻塞或者拖慢了?
其他尝试
我考虑过用chrome.alarms替代定时器,但它在生产环境下精度只能到分钟级,开发环境也只有秒级,完全满足不了我的需求。
有没有朋友遇到过类似的Mac Chrome Service Worker定时器异常的情况?或者有没有什么Chrome的版本更新、Mac系统的变化可能导致这个问题?
备注:内容来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

