navigator.storage.persisted() 可静默检查持久化授权状态,返回 Promise 解析为 true 或 false;仅 HTTPS/localhost 有效,需配合 estimate() 判断配额稳定性,不可与会触发弹窗的 persist() 混用。

可以直接用 navigator.storage.persisted() 检查当前站点是否已获得持久化存储授权,它返回一个 Promise
检查持久化状态的正确写法
这是最轻量、最直接的方式,不触发权限弹窗,仅做状态查询:
- 调用
navigator.storage.persisted(),无需参数 - 在 HTTPS 或 localhost 环境下才有效;无痕模式中可能始终返回 false
- 返回 Promise,需用
.then()或await获取结果
示例代码:
if ('storage' in navigator && 'persisted' in navigator.storage) {
navigator.storage.persisted().then(granted => {
console.log('持久化授权状态:', granted); // true 或 false
});
}
配合 estimate() 判断配额稳定性
仅知道“是否持久”还不够,实际使用中更关心数据是否会被系统自动清理。可结合 navigator.storage.estimate() 辅助判断:
- 若
persisted()返回 true,且estimate().quota显著大于usage(比如 >100MB),说明配额稳定、风险低 - 若
persisted()为 false,但estimate().quota很小(如几 MB)或为 0,大概率处于临时存储模式,面临静默清理风险 - 注意:Safari 和部分 Firefox 版本可能不支持
persisted(),需降级处理(如默认按临时模式兜底)
不要混淆 persist() 和 persisted()
navigator.storage.persist() 是申请动作,会弹出浏览器权限提示;而 persisted() 是只读检查,完全静默:
- 想“确认现状”,就只用
persisted() - 想“尝试升级权限”,才调用
persist(),且必须由用户手势(如点击)触发 - 二者返回值类型相同(Promise
),但语义和副作用完全不同
实际场景中的建议逻辑
启动时建议按顺序执行以下检查:
- 先确认环境:
if (location.protocol === 'https:' || location.hostname === 'localhost') - 再查授权状态:
navigator.storage.persisted() - 接着获取用量估算:
navigator.storage.estimate() - 最后综合决策:比如已持久化则启用大缓存策略;未持久化则限制 IndexedDB 写入量,并提示用户开启离线功能


















