小程序 setdata 体积超限需规避:避免大数组直存 data,慎用深层响应式,改用 shallowref 批量更新;启用 easycom 按需引入组件;合理使用 keep-alive 缓存页面并清理资源。

组件过多直接触发 setData 体积超限
小程序逻辑层和视图层分离,所有数据变更必须通过 setData 同步到视图层。当页面包含大量组件(尤其嵌套深、状态多),this.data 对象体积很容易突破 2MB 限制,真机报错 Exceed max data size limit 或静默失败——此时页面不渲染、事件不响应,但控制台未必报错。
- 用
uni.getStorageSync('debug')或console.log(JSON.stringify(this.$data).length)在 onReady 阶段粗略估算当前 data 字符串长度,超 150 万字符就极可能触发限制 - 避免把整个列表数组塞进 data:比如
list: []存 500 个带 8 个字段的对象,光 JSON 序列化就轻松破 1.2MB - 深层响应式对象是“隐形体积杀手”:每个
item若含children: []或extra: { a: {}, b: {} },Vue 的依赖追踪代理会额外膨胀内存
用 shallowRef + 手动更新绕过响应式开销
对只读或批量替换的大型数据结构(如商品列表、日志流),不需要每项都响应式监听。用 shallowRef 替代 ref 或 reactive,可让 Vue 只追踪 `.value` 引用变化,跳过内部属性劫持。
- 模板中仍用
v-for="item in list.value",但修改时只赋值一次:list.value = newData - 配合
JSON.parse(JSON.stringify())深拷贝后赋值,避免意外引用污染(尤其从接口直接赋值时) - 注意:计算属性、watch 无法监听
shallowRef内部变化,只适合“整块换”的场景
拆分组件并启用 easycom 自动按需引入
组件不是越多越差,而是“未用却加载”才拖慢性能。uni-app 的 easycom 能让组件在模板中首次出现时才编译引入,避免主包塞入全部组件代码。
- 在
pages.json中开启:"easycom": {"autoscan": true, "custom": {"^u-.+": "uni_modules/@dcloudio/uni-ui/lib/\1/\1.vue"}} - 命名规范强制执行:自定义组件文件名必须含短横线,如
u-card.vue、u-list-item.vue,否则不会被自动识别 - 禁用全局注册:删掉
main.js里类似Vue.component('u-card', ...)的语句,否则 easycom 失效且组件全量打包
keep-alive 缓存非活跃页面实例
频繁切换 tab 或返回上一页时,反复创建/销毁组件是 CPU 和内存浪费。但 <keep-alive></keep-alive> 不是开箱即用——uni-app 小程序端需配合 pages.json 的 navigationStyle 和页面生命周期才能生效。
- 只对 tabbar 页面或核心流程页加
<keep-alive></keep-alive>,普通页面加了反而增加内存驻留 - 页面内必须定义
onShow和onHide,并在onHide中清理定时器、取消请求,否则后台运行仍耗电 - 慎用
include白名单:匹配字符串必须与pages.json中的路径完全一致,比如"include": ["pages/home/index"],少一个斜杠就失效
console.log 里。











