navigator.storage.persist() 可申请将站点存储标记为持久化以降低自动清除风险,但非强制保证,需用户授权且 safari 不支持;用 navigator.storage.persisted() 检查状态,结合 indexeddb、cache api 版本化等策略提升离线可靠性。

调用 navigator.storage.persist() 可向浏览器申请将当前站点的存储(如 Cache API、IndexedDB、localStorage)标记为“持久化”,从而降低被系统自动清除的风险,尤其在存储空间紧张时。但它不是强制保证永不清理,而是提升保留优先级,并需用户授权(部分浏览器会静默授予,部分需显式权限)。
判断是否已获得持久化权限
使用 navigator.storage.persisted() 检查当前是否已启用持久化:
- 返回
true:已持久化(可能之前调用过persist()并获准) - 返回
false:未持久化,需主动申请
注意:该方法返回 Promise,应 await 或 .then() 处理:
if (!(await navigator.storage.persisted())) {
// 尚未持久化,可考虑申请
}
主动申请持久化权限
调用 navigator.storage.persist() 发起申请。浏览器会根据用户行为(如是否曾与站点交互)、存储用量、平台策略等决定是否批准:
- 桌面 Chrome / Edge:通常在用户有交互(点击、滚动等)后弹出权限提示(仅首次)
- Android Chrome:一般静默授予,尤其对已添加到主屏幕的 PWA
- Safari(iOS/macOS):不支持该 API,调用会抛错或静默失败,需降级处理
建议在关键操作前(如用户登录成功、完成离线内容下载后)申请,并捕获异常:
try {
const granted = await navigator.storage.persist();
if (granted) {
console.log('持久化权限已获得');
} else {
console.log('用户拒绝或浏览器未授予');
}
} catch (err) {
console.warn('persist() 调用失败', err);
}
配合存储实践提升离线数据可靠性
仅调用 persist() 不足以确保数据绝对安全,还需结合合理存储策略:
- 优先使用 IndexedDB 存储结构化离线数据(比 localStorage 更大、更可靠)
- 用 Cache API 缓存静态资源时,命名缓存带版本号(如
v2-offline-shell),便于更新与清理 - 监听
storage.estimate()获取配额信息,在接近上限时主动归档或提醒用户 - 对核心数据做轻量校验(如保存时间戳 + 简单哈希),启动时验证完整性
兼容性与降级处理
并非所有浏览器都支持该 API。使用前应检测可用性,并为不支持场景提供替代逻辑:
if ('storage' in navigator && 'persist' in navigator.storage) {
// 支持,可申请
} else {
// 降级:依赖浏览器默认配额策略,加强定期备份或服务端同步提示
}
Safari 用户需依赖其自身的“网站数据保留策略”(通常更保守),建议在文档中说明离线功能限制,并引导用户手动设置(如 Safari 设置 → 网站数据 → 找到你的域名 → 设为“永不删除”)。











