uni-app + Monorepo + 微信小程序热更新失效问题排查与结论总结
记录一次 uni-app + Vite + Monorepo 场景下,微信小程序热更新行为不一致的问题排查过程。 结论不是“配置问题”,而是 启动方式 + 微信开发者工具生命周期 + 项目结构共同作用的结果。
一、问题背景
我这边实际同时维护了 三种 uni-app 项目形态:
- 传统 uni-app(HBuilderX 黑盒项目)
- Vite + Vue3 + TS 的 uni-app 项目
- Monorepo 中的 uni-app 子项目(复用 packages)
在开发 微信小程序 时,我遇到了一个非常诡异的问题:
- 第一次启动项目可以热更新
- 项目中断 → 再次启动
- 微信开发者工具 不报错
dist/dev/mp-weixin文件确实发生变化- ❌ 但页面完全不热更新
而这个问题在不同项目形态下,表现并不一致。
二、三种 uni-app 项目形态 & 目录结构对照
项目 1:传统 uni-app(HBuilderX 黑盒项目)
创建方式
- HBuilderX:
新建 → uni-app 项目
目录结构
project-uni-classic/
├── pages/
│ └── index/
│ └── index.vue
├── static/
├── uni.scss
├── App.vue
├── main.js
├── manifest.json
├── pages.json
└── uni_modules/特征
- ❌ 无
package.json - ❌ 无
vite.config - ✅ 只能通过 HBuilderX 面板运行
- ✅ 微信小程序热更新 最稳定
项目 2:Vite + Vue3 + TS 的 uni-app 项目
创建方式
npx degit dcloudio/uni-preset-vue#vite-ts目录结构
project-uni-vite/
├── src/
│ ├── pages/
│ │ └── index/
│ │ └── index.vue
│ ├── App.vue
│ ├── main.ts
│ ├── manifest.json
│ └── pages.json
├── index.html
├── package.json
├── shims-uni.d.ts
├── tsconfig.json
└── vite.config.ts特征
- ✅ Vite + Vue3 + TS
- ✅ 可通过 HBuilderX 或命令行启动
- ⚠️ 热更新是否稳定,取决于 启动方式
项目 3:Monorepo 中的 uni-app 子项目
整体结构
monorepo-root/
├── packages/
│ └── core/
│ ├── src/
│ └── package.json
├── apps/
│ ├── web/
│ └── uni/
│ ├── src/
│ ├── index.html
│ ├── package.json
│ ├── shims-uni.d.ts
│ ├── vite.config.ts
│ └── tsconfig.json
├── pnpm-workspace.yaml
└── package.jsonapps/uni 本质
本质上就是 项目 2 被放进了 Monorepo
特征
- ✅ Vite + Vue3 + TS
- ✅ 依赖 packages 共享逻辑
- ❌ 通常只能通过命令行启动,热更新最容易失效
三、问题现象总结
使用微信开发者工具 Stable 1.06.x
项目 1 / 项目 2(HBuilderX 操作面板启动)
- ❌ 项目中断后再运行,热更新失效
项目 3(命令行)
- ❌ 始终不稳定
升级微信开发者工具到 Stable 2.01.2510260 后
情况 1:使用 HBuilderX 操作面板启动(项目 1 / 项目 2)
✅ 即便终端中断,再次运行 仍然可以热更新
情况 2:使用命令行启动(项目 2 / 项目 3)
第一次启动:✅ 热更新正常
中断项目(Ctrl+C)
微信开发者工具 仍保留上一次的项目实例
再次启动:
- ❌ 页面不热更新, 需要手动关闭微信开发者工具并重新打开
四、最终结论(重点)
问题根本不是:
- Vite 监听
- alias
- Monorepo
- packages 软链接
- 游客模式 / 登录态
而是:
👉 微信开发者工具 无法正确感知「命令行启动的 uni-app 项目生命周期」
更准确地说:
| 项目结构 | 启动方式 | 微信工具状态 | 热更新 |
|---|---|---|---|
| 项目 1 | HBuilderX | 自动管理 | ✅ |
| 项目 2 | HBuilderX | 自动管理 | ✅ |
| 项目 2 | CLI | 工具未重载 | ❌ |
| 项目 3 | CLI | 工具未重载 | ❌ |
五、为什么 HBuilderX 启动没问题?
因为:
HBuilderX 控制了
- 编译
- 输出目录
- 微信开发者工具的打开 / 重载
微信开发者工具能明确知道:
- 什么时候是「新项目」
- 什么时候该重新加载
六、稳妥可行的解决方案
✅ 方案 1(最稳)
使用命令行启动 uni-app 时:
如果微信开发者工具中还保留旧项目
先关闭微信开发者工具
再启动项目
再打开微信开发者工具
⚠️ 方案 2(自己猜想,未实践)
- 写脚本强杀微信开发者工具进程
- 不同系统 / 不同版本不可靠
七、一句话总结(给后来者)
uni-app 小程序热更新是否可靠,取决于:
「是不是 HBuilderX 启动 + 微信开发者工具是否被正确重载」
Monorepo + CLI 场景下,手动重开微信开发者工具是目前最稳的方案。
八、快速自检:你属于哪种情况?
- ❌ 没有
package.json→ 项目 1 - ✅ 有
vite.config.ts→ 项目 2 - ✅ 在
apps/uni+packages→ 项目 3 - ❌ CLI 启动 + 微信工具没关 → 一定会踩坑