PeriodicSync 仅限合格 PWA 在 Chromium 系统中使用,需 HTTPS、Service Worker、manifest 及用户安装,注册后仅在设备空闲/充电/联网时触发受限后台同步,不保证准时或唤醒页面,iOS/Firefox 不支持。

PeriodicSync 不能用于普通离线网页的后台静默更新。它是一个受严格限制的 Web API,仅在满足特定条件的 PWA(渐进式 Web 应用)中可用,且目前仅在 Chrome/Edge(基于 Chromium)的 Android 和桌面端部分支持,iOS/iPadOS 完全不支持,Firefox 未实现。更重要的是,它不保证准时执行、不保证唤醒页面、也不允许任意网络请求或 DOM 操作——它只允许在浏览器判定“合适时机”(如设备充电、联网、空闲)时触发一次受限的 background sync 事件,且必须配合 Service Worker 使用。
前提条件:必须是合格的 PWA
PeriodicSync 不是独立功能,它依赖完整的 PWA 基础设施:
- 部署在 HTTPS 环境下(本地 localhost 可豁免)
- 注册了有效的 Service Worker(sw.js),且其生命周期稳定(无频繁报错或 unregister)
- 存在符合规范的
manifest.json,包含"start_url"、"display": "standalone"或"minimal-ui"等字段,并被页面正确引用 - 用户已至少一次手动访问并“安装”该 PWA(Android 上会提示“添加到主屏幕”,桌面 Chrome 需点击地址栏安装图标)
注册周期同步:registerPeriodicSync()
注册需在已激活的 Service Worker 中进行,通常放在 install 或 activate 事件里(但更推荐在前端页面中、用户明确授权后调用,避免未经同意自动注册):
前端页面中(需用户交互上下文,如按钮点击):
立即学习“前端免费学习笔记(深入)”;
// 检查支持性
if ('periodicSync' in registration) {
try {
await registration.periodicSync.register('update-content', {
minInterval: 24 * 60 * 60 * 1000 // 至少 24 小时(毫秒)
});
console.log('周期同步注册成功');
} catch (err) {
console.warn('注册失败:', err);
}
}注意:minInterval 是建议最小间隔,浏览器可能延长至数小时甚至数天;名称(如 'update-content')用于后续取消或查询。
在 Service Worker 中响应同步事件
在 sw.js 中监听 periodicsync 事件,执行轻量数据拉取(如获取 JSON 更新摘要),不可操作 DOM、不可弹窗、不可播放声音、不可长时间运行:
self.addEventListener('periodicsync', (event) => {
const tag = event.tag; // 如 'update-content'
<p>if (tag === 'update-content') {
// 推荐:只 fetch 关键元数据(如版本号、变更列表),非完整 HTML
event.waitUntil(
fetch('/api/latest-version')
.then(res => res.json())
.then(data => {
// 将新数据存入 Cache Storage 或 IndexedDB
return caches.open('content-cache')
.then(cache => cache.put('/latest.json', new Response(JSON.stringify(data))));
})
.catch(err => console.error('同步失败:', err))
);
}
});关键点:
-
event.waitUntil()必须包裹异步操作,否则事件会被立即终止 - 避免
fetch大文件或渲染资源(如图片、CSS);优先用轻量 API 获取变更摘要 - 更新后的数据需由前端页面主动读取(如每次打开时检查缓存中的
/latest.json),PeriodicSync 本身不会刷新页面
现实约束与替代方案
当前阶段,PeriodicSync 实际可用性较低:
- Chrome Android 用户需启用「后台同步」系统级权限(默认开启,但可被用户关闭)
- 桌面端触发频率极低(常数天一次),且仅当浏览器进程活跃时才可能执行
- 无法指定具体时间(如每天 8:00),也不能保证每次成功
- 若用户长期不打开 PWA,同步几乎不会发生
更可靠的做法:
- 页面加载时发起一次轻量
fetch检查更新(配合 ETag/Last-Modified 缓存) - 结合
push通知(需用户授权)+ 后台消息,由服务端主动触发更新提示 - 对真正离线优先场景,使用 Cache-first 策略 + 定期
skipWaiting()+clients.matchAll()主动通知前台页面更新



















