应先 JSON.stringify 再存、JSON.parse 再取,避免 Date 等不可序列化类型导致静默失败;各端 storage 物理隔离,必须统一用 uni.Storage;同步 API 适合轻量配置,异步 API 配合回调确保关键数据写入成功。

直接用 uni.setStorageSync 存小数据、uni.setStorage 存关键数据,但必须先 JSON.stringify 对象/数组,取的时候再 JSON.parse;各端存储完全隔离,H5 用 localStorage 是错的,跨端必须统一走 uni.*Storage* 系列。
存对象或数组前不序列化,读出来就是 undefined
常见错误是写 uni.setStorageSync('user', { name: 'Alice', createdAt: new Date() })——Date、Function、undefined、RegExp 等无法被 JSON 序列化的值,在部分平台(尤其是微信小程序)会静默失败,getStorageSync 返回 undefined 或空字符串,不报错也不警告。
- 存之前务必用
JSON.stringify:比如uni.setStorageSync('user', JSON.stringify(userObj)) - 取出来立刻
JSON.parse:比如const user = JSON.parse(uni.getStorageSync('user') || '{}'),加|| '{}'防止解析null或空字符串报错 - 如果数据含
Date,建议提前转成时间戳或 ISO 字符串:user.createdAt = new Date().toISOString()
同步 vs 异步 API:别在 onLaunch 里无脑用 setStorageSync
uni.setStorageSync 会阻塞 JS 主线程,适合存开关、语言、主题等轻量且需立即生效的配置;uni.setStorage 不阻塞,但必须靠 success 回调确认写入成功,适合存 token、用户信息等关键数据。
- 登录后存 token:用
uni.setStorage+success回调,避免因写入失败导致后续逻辑误判已登录 - 存用户偏好(如 darkMode: true):用
uni.setStorageSync更稳妥,体积小、无回调依赖 - 千万别在
onLaunch里对所有 key 调用uni.setStorageSync,低端机可能卡顿,影响首屏渲染
取不到值?先盯住这三件事
uni.getStorageSync('key') 返回 undefined,90% 不是 API 坏了,而是环境或时序问题。
- 检查 key 拼写是否完全一致:
'token'和'Token'是两个 key,且不能含空格、点号、斜杠等特殊字符 - 确认是同一端写入的:App 端存的,H5 端读不到;微信小程序存的,抖音小程序也读不到——各平台 storage 物理隔离
- 异步写完立刻同步读,可能还没落盘:比如
uni.setStorage后紧跟uni.getStorageSync,低性能设备上大概率读到旧值或undefined;应改用uni.getStorage回调,或封装 Promise 等待写入完成
清缓存不是“一键全删”就完事
uni.clearStorageSync() 是全局清除,上线后留着它等于埋雷——用户重启 App 就丢设置、丢草稿、登出失效。
- 登出时只删必要 key:
uni.removeStorageSync('token')、uni.removeStorageSync('userInfo')、uni.removeStorageSync('refreshToken') - 避免在
onLaunch或onShow里无条件调用uni.clearStorageSync,测试阶段注释掉,上线前务必删除 - 如果用了
vuex-persistedstate插件,它底层也是调uni.setStorageSync,clearStorageSync会把它持久化的 state 一起清掉,得额外处理
真正容易超 10MB 限制的从来不是文本,而是 base64 图片、离线 HTML、大日志数组;存图片优先用 uni.saveFile 写文件系统,再存路径;日志类数据建议滚动覆盖,别堆着不管。


















