隐私模式下 localStorage 行为不可靠,需提前检测并安全降级:通过 setItem→getItem→removeItem 流程验证可用性,任一环节失败即降级至内存 Map;每次写入均需 try-catch 捕获 QuotaExceededError 和 SecurityError;不依赖 sessionStorage,敏感操作须以服务端为准。

隐私模式下 localStorage 并不总是直接抛出异常,但行为不可靠——有的浏览器(如 iOS Safari)会静默禁用,调用 setItem 时抛出 QuotaExceededError 或 SecurityError;有的则允许写入但数据不持久、不跨窗口共享。处理的关键不是“捕获后修复”,而是“提前检测 + 安全降级”。
先检测是否可用,别等报错才行动
不能依赖 try-catch 被动兜底,必须在初始化阶段主动验证:
- 用一个简短的测试键值对(如
test: "ok")执行setItem → getItem → removeItem全流程 - 任一环节失败(包括返回
null、抛出异常、读取值不匹配),即判定 localStorage 不可用 - 注意:iOS Safari 隐私模式下
setItem可能抛SecurityError,而部分安卓 WebView 直接静默失败,无异常
捕获异常要覆盖所有写入点,不只是初始化
每次调用 localStorage.setItem() 都必须包裹 try-catch:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
-
QuotaExceededError:说明配额已满(隐私模式下可能被设为 0,或仅限内存临时存储) -
SecurityError:常见于 Safari 私密浏览、某些 WebView,表示访问被策略阻止 - 不要只 catch 一次——组件重渲染、表单保存、状态同步等场景都可能触发写入
降级方案要真实可用,不能假降级
检测失败或捕获异常后,需立即切换到可靠替代:
- 首选内存对象缓存:
const fallbackStore = new Map(),保证页面生命周期内读写一致 - 避免用
sessionStorage替代——它在隐私模式中虽可用,但标签页关闭即丢,且新开同域名标签页也不共享 - 敏感操作(如登录态、草稿)应结合服务端响应确认,前端本地存储仅作体验优化,不作为唯一依据
别把隐私模式当普通环境去设计逻辑
很多问题源于错误假设:“localStorage 写了就存在”。在隐私模式中:
- 用户刷新页面后数据还在?→ 是(因会话未结束)
- 用户开第二个无痕窗口能看到同一域名的数据?→ 否(完全隔离)
- 用户关掉所有无痕窗口再重开,还能恢复上次内容?→ 否(彻底清空)
- 所以,引导弹窗、未提交表单、深色模式偏好等,若只靠 localStorage 记录,就会反复出现、丢失、错乱
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










