应优先用uni.setStorage存关键数据、uni.setStorageSync存小且稳定的配置项;存对象需手动JSON.stringify/parse;各端存储隔离,跨端不可互通;注意10MB限制及HTTP缓存残留。

别直接传对象,也别在异步写完立刻同步读——否则大概率拿到 undefined 或空字符串。
uni.setStorage 和 uni.setStorageSync 怎么选
不是看哪个写得快,是看数据大小、执行时机和是否允许阻塞。
-
uni.setStorageSync会卡住 JS 线程,适合存小且稳定的数据:比如'lang'、'theme'、单个字符串token;必须确保调用上下文稳定(不能嵌套在多次异步回调里) -
uni.setStorage不阻塞,但success回调才是真实写入完成点,适合存用户信息、列表草稿、token 等关键数据 - 混用风险高:同一 key 先
uni.setStorage异步写,再立刻uni.getStorageSync同步读,在低端机上几乎必读空;应统一走异步链,或封装成 Promise
存对象/数组时为什么取出来是 undefined
因为 uni.setStorage 和 uni.setStorageSync 内部虽会自动 JSON 序列化,但只对可序列化类型生效。Date、RegExp、Function、undefined、循环引用会被静默丢弃或转成 null。
- 必须手动
JSON.stringify()再传入:uni.setStorageSync('user', JSON.stringify({ name: '张三', loginTime: new Date() })) - 读取后必须手动
JSON.parse():const user = JSON.parse(uni.getStorageSync('user') || '{}') - 别依赖
try/catch捕获序列化失败——它不抛错,只是存了个空字符串或null,后续JSON.parse('')会直接报错
为什么 H5 能读到、小程序却读不到
各端存储完全隔离:uni.setStorage 在微信小程序里写入的数据,H5 端、App 端、支付宝小程序都访问不到,反之亦然。这不是 bug,是设计。
- 开发调试时,别在 H5 页面里测试小程序的缓存逻辑,否则永远查不到值
- 跨端项目中,不要假设“存一次,全端可用”;需按平台分别处理,或改用后端 session + 短期本地 key 做桥接
-
uni.clearStorage()只清uni.*Storage*数据,不会动 WebView 缓存、HTTP DNS 缓存等——登出后仍有旧页面残留,往往是因为这个
取不到值?先查这三件事
uni.getStorageSync('key') 返回 undefined 是高频问题,不是 API 坏了,而是环境或逻辑出了岔子。
- 检查
key是否拼写一致(大小写敏感,不能含空格或特殊符号) - 确认数据是同一端写入的:App 端存的,H5 端读不到;微信小程序存的,支付宝小程序也读不到
- 如果是异步写入后立刻同步读,可能还没写完就去读了(尤其在低性能设备上),此时应改用
uni.getStorage+success回调,或加一层 Promise 封装
真正容易超限的不是文本,而是 base64 图片、离线 HTML 片段、大数组日志;存图片优先用 uni.saveFile 写入本地文件系统,再存路径——这点很多人忽略,直到上线后频繁 fail 才回头查。


















