npm run dev 启动后 Vue 组件不热更新是怎么回事?
我最近在用 Vue 3 + Vite 搭的项目,本地开发时执行 npm run dev 能正常启动服务,但改了组件代码后页面不会自动刷新,得手动刷新才行。我已经确认开启了 HMR,也试过删 node_modules 重装依赖,还是不行。
比如下面这个简单的组件,我改了按钮文字,保存后控制台没报错,但浏览器没反应:
<template>
<button @click="count++">点了 {{ count }} 次</button>
</template>
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
是不是 npm scripts 里少配了什么参数?或者 vite.config.js 哪里要特别设置?
如果控制台没问题,试试在 vite.config.js 里显式配置一下 HMR:
这个配置会把 HMR 错误以覆盖层的方式显示在浏览器页面上,能帮你看到是不是有隐藏的错误。
另外有个坑要注意:如果你的组件是在
defineComponent或者普通里写的,而不是,热更新确实有时候会失灵。你这个组件写法没问题。还有一种情况是项目路径有中文或者特殊字符,有时候也会导致 HMR 出问题。
你先加上上面那个配置,启动项目后改一下组件,看看浏览器右上角会不会弹出 HMR 的覆盖层提示。如果有错误会显示在那里。
先确认几个关键点:
你是不是用的是 WSL?或者用了 Docker 容器开发?或者是在虚拟机里?或者用了同步盘(比如 Dropbox、OneDrive)?
如果是 WSL2,最常见的是
/mnt/c下的项目路径监听失效,得把项目挪到/home/xxx/里再跑。如果是在 Linux 上,可能是 inotify 监听数量不够。可以临时跑这个命令加上限:
echo 999999 | sudo tee /proc/sys/fs/inotify/max_user_watches
然后重启 dev 服务试试。
再就是 vite.config.js 里加个显式的监听配置(虽然理论上不需要):
如果上面都不行,再试试把 watch.usePolling 改成 true,不过轮询会吃点 CPU,适合万般无奈时用。
对了,还有个坑:你改文件后确认下有没有触发 rebuild。在终端里看 npm run dev 的输出,保存后应该能看到类似 [vite] hmr update /src/components/xxx.vue 的日志,要是连这个都没有,说明监听根本没生效。
最后说个真实的:我之前在 Mac 上用 Parallels 虚拟机跑 Linux,项目挂在共享文件夹里,HMR 完全失效,挪到虚拟机本地盘里就好了……有时候真不是代码问题,是环境太骚。