SSF0SSF0
首页
前端
  • Node
  • Go
  • Python
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
  • 开源项目
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • Python
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
  • 开源项目
Timeline
Github
标签
分类
  • HTML

    • html1
    • html2
  • CSS

    • Flex 布局常见问题与解决方案
  • JavaScript

    • 数据类型及引用问题
    • 处理 Blob 类型文件下载问题总结
    • localStorage 与 sessionStorage 区别
    • JavaScript 中的 script 标签问题详解
    • JavaScript 中的 this 指向问题详解
    • SessionStorage踩坑记录
    • 动态加载 JS 脚本方法对比
    • 浏览器页面关闭场景下的数据上报
    • HTTP流式接口详解与封装实践
    • JavaScript 中 this 绑定与解构:为什么 Pinia Store 可以解构,但 Class 实例方法不行?
  • es6

    • Promise
    • es6 模块导出方式全解析
    • reduce
    • forEach 中使用 async/await 的异步陷阱
  • Vue2

    • created VS mounted 发起异步请求
    • vue2-2
  • Vue3

    • Vite + Vue3 修改 element-plus 源码
    • Vue v-if 与 v-show
    • Vue3 ref 获取组件
    • Vue3 路由传参
    • 父子组件与组件里 Hooks 加载顺序
    • 第三方组件传入参数TS提示
    • Vue3 Props 在 Hooks 中的响应性处理
    • Vue Router 的两种历史模式及部署配置详解
    • 在Vue 3项目中顺利集成Tailwind CSS的完整指南
    • Vue Scoped CSS 深度解析
    • Vue 3 Teleport 组件完全指南:从原理到实战
    • Vant List 组件中双向绑定 loading 的注意事项
    • Vue 3 + Vite 中的路径别名与静态资源处理深度解析
    • 获取图片高度
    • 深入理解 Pinia:storeToRefs vs toRefs - 避开 TypeScript 类型推断的坑
  • webSocket

    • WebSocket 鉴权入门(实战版):握手票据 / 首帧鉴权 + 连接级 cid
  • Electron

    • 快速构建 electron + vue3 项目
  • TS

    • TS 泛型
    • 记录模板使用断言的问题
    • type 与 interface
  • WebPack

    • Webpack 介绍
  • Vite

    • Vite CLI 常见命令
    • vite 与 webpack 比较
    • Vite base 配置与 public 静态资源路径问题
  • 客户端数据库

    • IndexedDB 索引陷阱:字段重命名后索引返回旧数据
    • IndexedDB 事务陷阱与最佳实践:TransactionInactiveError 完全解析
  • UniApp

    • uni-app + Monorepo + 微信小程序热更新失效问题排查与结论总结
    • Monorepo + uni-app 开发中监听 / 热更新机制差异与解决方案
    • uni-app 运行与编译原理梳理
    • 为什么 uni-app 在 Monorepo 中必须做「环境区分」,而 Web 项目却不用?
  • 项目工程

    • 前端代码风格
    • Vue3 项目规范
    • npm 镜像问题
    • 包管理工具
    • 使用 engines 限制开发环境依赖
    • 打包与shell交互指定模式
    • Monorepo示例
    • PC 项目兼容 uni-app:基于 pnpm Monorepo 的工程化重构实践
    • Vue3 + Vite + pnpm Monorepo 迁移问题指南
    • 前端工程化:深入理解 npm 依赖管理机制
    • pnpm 修改依赖源码打包报错
    • 代码片段
  • 移动端

    • 浏览器跳转外部应用时请求状态码问题
  • 记录一下小程序
  • 控制浏览器正确保存网站账号密码的技巧
  • 信息泄露
  • 使用Gulp实现前端项目哈希化压缩打包
  • 前端缓存策略与文件哈希化的关联解析
  • 浏览器刷新方式与 Vue 生命周期、缓存行为解析
  • 浏览器消息铃声实现记录

uni-app + Monorepo + 微信小程序热更新失效问题排查与结论总结

记录一次 uni-app + Vite + Monorepo 场景下,微信小程序热更新行为不一致的问题排查过程。 结论不是“配置问题”,而是 启动方式 + 微信开发者工具生命周期 + 项目结构共同作用的结果。


一、问题背景

我这边实际同时维护了 三种 uni-app 项目形态:

  1. 传统 uni-app(HBuilderX 黑盒项目)
  2. Vite + Vue3 + TS 的 uni-app 项目
  3. 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.json

apps/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 项目生命周期」


更准确地说:

项目结构启动方式微信工具状态热更新
项目 1HBuilderX自动管理✅
项目 2HBuilderX自动管理✅
项目 2CLI工具未重载❌
项目 3CLI工具未重载❌

五、为什么 HBuilderX 启动没问题?

因为:

  • HBuilderX 控制了

    • 编译
    • 输出目录
    • 微信开发者工具的打开 / 重载
  • 微信开发者工具能明确知道:

    • 什么时候是「新项目」
    • 什么时候该重新加载

六、稳妥可行的解决方案

✅ 方案 1(最稳)

使用命令行启动 uni-app 时:

  • 如果微信开发者工具中还保留旧项目

  • 先关闭微信开发者工具

  • 再启动项目

  • 再打开微信开发者工具


⚠️ 方案 2(自己猜想,未实践)

  • 写脚本强杀微信开发者工具进程
  • 不同系统 / 不同版本不可靠

七、一句话总结(给后来者)

uni-app 小程序热更新是否可靠,取决于:

「是不是 HBuilderX 启动 + 微信开发者工具是否被正确重载」

Monorepo + CLI 场景下,手动重开微信开发者工具是目前最稳的方案。


八、快速自检:你属于哪种情况?

  • ❌ 没有 package.json → 项目 1
  • ✅ 有 vite.config.ts → 项目 2
  • ✅ 在 apps/uni + packages → 项目 3
  • ❌ CLI 启动 + 微信工具没关 → 一定会踩坑
最后更新时间:
贡献者: 何风顺
下一页
Monorepo + uni-app 开发中监听 / 热更新机制差异与解决方案