小程序热启动不更新是因为仅冷启动触发版本检查,热启动复用旧包;需在onlaunch中调用getupdatemanager监听oncheckforupdate、onupdateready和onupdatefailed,主动处理更新,而非依赖自动机制。

小程序热启动时页面不更新,是因为没触发冷启动检查
微信小程序的版本更新只在冷启动时自动检测,热启动直接复用旧包。用户反复打开小程序却看不到新功能,大概率是卡在热启动流程里了。这不是代码问题,而是机制限制。
解决的关键是主动调用 uni.getUpdateManager(),在 onLaunch 中监听更新状态,而不是依赖微信自动行为。
- 必须在
onLaunch里初始化,不能放在页面级生命周期(如onLoad)中 -
onCheckForUpdate是异步检测,返回hasUpdate: true后,要等onUpdateReady触发才能调用applyUpdate() - 若
onUpdateFailed被触发,说明下载失败,此时不应静默忽略,建议弹窗引导用户手动冷启动(即完全退出再打开)
缓存未清除导致 setData 渲染异常或白屏
即使版本已更新,如果本地缓存的 WXML/JS 文件未失效,仍可能加载旧逻辑,造成 setData 不生效、样式错乱甚至白屏。这不是 Vue 响应式问题,而是资源文件被缓存住了。
常见表现:控制台无报错,但页面空白或内容停滞;修改 data 后视图不刷新;this.$nextTick 也无效。
- 优先使用
uni.clearStorageSync()清除本地存储,尤其影响uni.setStorage缓存的数据 - 对静态资源(如图片、CSS、JS)加版本参数,例如
logo.png?v=1.0.2,避免 CDN 或 WebView 层缓存 - 真机调试时,不要只看开发者工具——它自带强缓存机制,务必在真机上验证
manifest.json 版本号未更新导致整包更新失效
uni-app 的整包更新依赖 manifest.json 中的 versionName 和 versionCode。如果只改了代码但没改这两个字段,APP 端根本不会触发资源比对和下载。
更隐蔽的情况是:云打包时用了旧的 manifest 配置,或 HBuilderX 缓存了上一次的编译结果。
- 每次发布前,手动检查
manifest.json中的versionName是否递增(如从"1.2.3"→"1.2.4") - 执行
npm run build:mp-weixin后,确认输出目录下dist/build/mp-weixin/manifest.json已同步更新 - 若使用云打包,需在 HBuilderX 中点击「发行」→「原生App-云打包」并勾选「强制重新编译」
onShow/onLoad 未触发导致页面“假死”
有些页面在热启动后没有重新执行 onLoad 或 onShow,看起来像卡住,其实是生命周期没走完,数据没拉取、UI 没重绘。
这不是缓存本身的问题,而是小程序框架复用页面实例时的副作用,但用户感知和缓存问题几乎一致。
- 在
onShow中加日志,确认是否执行:console.log('page onShow') - 避免把关键逻辑(如接口请求、权限校验)只写在
onLoad里;对需要实时更新的内容,移到onShow或配合getCurrentPages()手动判断 - 如果页面必须每次刷新,可在
onShow中调用uni.reLaunch({ url: '/pages/home/home' })强制重建栈,但注意体验成本
实际中最容易被忽略的是:热启动 + 旧 manifest + 未监听 onUpdateReady 这三者叠加。一个没做,就可能让更新延迟数小时甚至数天。











