PeriodicBackgroundSync 已被所有主流浏览器废弃,Chrome 90+ 彻底移除,Firefox 和 Safari 从未实现;替代方案是用 BackgroundSync 结合 visibilitychange、online、push 等事件模拟周期同步,但无法真正定时唤醒。

PeriodicBackgroundSync 在当前(2026年4月)不可用,所有主流浏览器均已废弃该 API。
Chrome 90+ 彻底移除了 navigator.periodicSync,调用 navigator.periodicSync.register() 会直接抛出 TypeError: navigator.periodicSync is undefined;Firefox 和 Safari 从未实现,W3C 规范状态为 “Inactive”。
你看到的“定期后台同步”教程,基本来自 2020–2021 年 Chrome 实验阶段的快照,现在复制粘贴必报错。
PeriodicBackgroundSync.register() 为什么总报 undefined?
-
navigator.periodicSync在任何现代浏览器中都不存在,不是兼容性问题,是彻底删除 - 即使在 localhost 或 HTTPS 下、Service Worker 已激活,也不会出现该属性
- 检查方式必须是:
if ('periodicSync' in navigator)→ 永远为false
替代方案:用 BackgroundSync + 时间逻辑模拟“定期”
BackgroundSync 本身不支持定时唤醒,但可结合以下真实可行的触发点,逼近周期行为:
- 页面重新获得焦点(
visibilitychange事件) - 网络恢复(
online事件 +sync注册) - 用户主动操作(如点击“刷新”按钮)
- 后端推送(
push事件,需用户授权)
关键约束:浏览器禁止无用户交互的后台定时唤醒,这是硬性功耗与隐私策略,无法绕过。
实现 Markdown↔ HTML 互转,支持导出 PDF,用于用户请求的文档格式转换。
示例:在网络恢复时检查是否超时再同步
self.addEventListener('sync', async (event) => {
if (event.tag === 'daily-news-sync') {
const lastSync = await caches.match('/last-sync-timestamp');
const now = Date.now();
const interval = 24 * 60 * 60 * 1000;
const shouldSync = !lastSync || (now - parseInt(await lastSync.text())) > interval;
<pre class="brush:php;toolbar:false;">if (shouldSync) {
event.waitUntil(syncNewsData().then(() =>
caches.put('/last-sync-timestamp', new Response(now.toString()))
));
}
} });
注意:sync 事件只在网络恢复后由浏览器调度,不是定时器,所以它本质是“机会型”,不是“周期型”。
真正需要定时任务?这些点容易被忽略
-
setInterval()在页面后台/休眠时会被浏览器节流甚至暂停,前台才可靠 -
Push API是目前唯一能“唤醒” Service Worker 的方式,但需后端配合定时发 push,且用户必须已授权通知 - 所有同步逻辑必须包裹
event.waitUntil(),否则 Worker 可能在 fetch 完成前终止 - 不能读写
localStorage,待同步数据必须存IndexedDB - 浏览器可能丢弃已注册的 sync tag(比如内存紧张、标签页关闭太久),每次触发前建议先
registration.sync.getTags()校验
最常被低估的一点:所谓“保持内容最新”,往往不需要真·后台定时。多数场景下,在页面显示前做一次轻量检查(如 fetch('/api/last-updated', {cache: 'no-store'}))更可控、更省电、兼容性更好。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










