小程序globaldata不自动持久化,需手动用uni.setstoragesync同步关键字段;初始化须在app.vue的onlaunch/onshow中读storage并赋值,修改时同步写入且只存可序列化必要字段。

小程序端 globalData 不能自动持久化,必须手动同步到 storage
getApp().globalData 本身不持久——App 重启、小程序冷启动后就清空。所谓“自动持久化”,其实是把 globalData 的关键字段(比如 token、userInfo)在变更时主动写入 uni.setStorageSync,读取时优先从 storage 恢复,再赋值给 globalData。
常见错误现象:onLaunch 里只读了 uni.getStorageSync 但没反向写回 globalData;或者登录成功后只改了 globalData,却忘了调用 uni.setStorageSync,导致杀进程后 token 丢失。
- 初始化逻辑必须放在
App.vue的onLaunch和onShow中:先读 storage,再挂载到getApp().globalData - 所有修改 globalData 的地方(如登录、登出、切换账号),都要同步调用
uni.setStorageSync,且 key 名需与读取一致 - 避免直接存整个 globalData 对象——只存必要字段,比如
{ token: 'xxx', userId: 123 },不要存函数、Date 实例等不可序列化值
vuex + persistedState 在小程序端必须重写 storage 接口
vuex-persistedstate 默认用 localStorage,小程序里会报错或静默失败。必须传入自定义的 storage 对象,底层调用 uni.setStorageSync 和 uni.getStorageSync。
使用场景:你已在用 Vuex 管理用户状态、购物车等复杂响应式数据,又希望冷启动后恢复上次状态。
- 插件配置里不能直接写
storage: window.localStorage,要改成:storage: { getItem: (key) => uni.getStorageSync(key), setItem: (key, value) => uni.setStorageSync(key, value), removeItem: (key) => uni.removeStorageSync(key) } - 注意 state 中不能含不可序列化内容(
RegExp、function、undefined),否则uni.setStorageSync会静默截断或报错 - H5 端仍可用原生 localStorage,建议用平台判断做适配:
uni.getSystemInfoSync().platform === 'mp-weixin'
防抖 + 节流是避免高频写 storage 的关键
用户连续输入昵称、频繁切换主题色时,如果每次 change 都触发 uni.setStorageSync,不仅卡 UI,还可能触发微信的写文件频率限制(尤其低端机)。
性能影响:实测连续 10 次同步写入,平均耗时 8–12ms/次,主线程明显卡顿;异步写入虽不阻塞,但无法保证顺序和最终一致性。
- 对非关键字段(如界面偏好设置),用
setTimeout做 300ms 防抖,只保留最后一次变更 - 对关键字段(如
token),可不防抖,但必须加 try/catch ——uni.setStorageSync在磁盘满或权限异常时会直接 throw - 别在
watch里无条件调用写入,先比对新旧值:if (newVal !== oldVal) { ... }
跨端兼容性最容易被忽略的三个点
同一套持久化逻辑,在微信小程序、支付宝小程序、H5、App 上行为并不完全一致。最常踩坑的是路径、容量、序列化规则。
-
uni.setStorageSync在 H5 端实际走的是localStorage,而小程序端是独立沙箱文件系统,二者最大容量不同(微信约 10MB,H5 一般 5–10MB,但受浏览器策略影响更大) - App 端若用
uni.getFileSystemManager()存大文件,路径必须用uni.env.USER_DATA_PATH,不能硬编码/wxfile/或temp/ - 支付宝小程序不支持
uni.getStorageSync同步读取二进制数据(如 base64 图片),必须改用异步uni.getStorage+ Promise 封装
真正麻烦的不是写一次逻辑,而是每次新增一个字段就得检查它在所有平台是否可序列化、是否超限、是否需要分片。别图省事全量 dump state —— 拆成按业务域划分的 key,比如 user_auth、ui_theme、form_draft,各自独立控制生命周期和同步策略。











