应统一键名前缀、单对象集中存储、自动序列化、兼容隐私模式。即:为 localStorage 键加 userPrefs_ 等前缀;将所有偏好存为 userPreferences 单对象;读写自动 JSON 序列化并兜底;检测 localStorage 可用性,不可用时降级至内存存储。

统一键名前缀,避免冲突
多个功能模块或第三方库可能共用 localStorage,直接用 theme、fontSize 这类通用 key 容易覆盖。推荐为所有偏好项加统一前缀,例如 userPrefs_ 或 myapp_。写入时拼接:localStorage.setItem("userPrefs_theme", "dark");读取时也按前缀查找。更进一步可封装成带 prefix 的工厂函数,让不同业务线各自隔离。
单对象集中管理,便于维护升级
不建议每个设置项单独存一个 key(如 userPrefs_theme、userPrefs_lang),而应把全部偏好打包成一个对象,用固定 key 存储,比如 userPreferences。这样新增字段、做版本迁移(如从 v1 升级到 v2)只需在解析后做一次兼容处理,无需遍历多个 key。写入示例:localStorage.setItem("userPreferences", JSON.stringify({ theme: "dark", fontSize: 16, lang: "zh" }))。
读写自动序列化,内置异常兜底
localStorage 只接受字符串,但业务层应屏蔽细节。封装的 set() 方法内部自动调用 JSON.stringify;get() 方法先尝试 JSON.parse,失败则返回默认值或原始字符串(避免因手动清空或数据损坏导致页面报错)。例如:get("theme", "light") 在解析失败或 key 不存在时,直接返回 light。
支持降级与隐私模式兼容
部分浏览器在无痕/隐私模式下会禁用 localStorage,或抛出 SecurityError。模块初始化时应先做可用性检测:try { localStorage.setItem("__test__", "ok"); } catch { /* 切换为内存缓存 */ }。若不可用,所有读写操作自动 fallback 到一个纯 JS 对象(const memoryStore = {}),保证功能不中断,只是关闭页面后丢失设置。

















