Vite中使用glob导入组件后页面不刷新怎么办?
在用Vite+Vue3开发时,我用glob导入了所有组件,但修改组件后页面热更新失效了。明明按了保存,页面就是不刷新,这是为什么呢?
代码是这样写的:
import { globImport } from 'vite-glob';
const components = globImport('./**/*.vue', { importName: 'default' });
Object.values(components).forEach(component => {
app.component(component.name, component);
});
我试过重启Vite服务器和清除浏览器缓存,但问题依旧。有没有同学遇到过类似情况?是插件配置问题还是代码写错了?
vite-glob这个第三方包在处理组件热更新时有坑,Vite官方的import.meta.glob也有同样的问题——静态glob导入后,Vite不知道具体哪个组件文件被改了,所以HMR触发不了。核心原因:glob导入在构建时就把所有文件收集起来了,文件修改后Vite找不到对应关系。
解决办法是用 eager 模式强制立即加载:
这样写完之后,修改任意组件保存,页面应该就能正常热更新了。
如果还不行,检查一下你的组件文件里有没有正确定义 name 属性,比如:
没有name的话,组件注册上去之后Vite也追踪不到是哪个文件。
还有一点提醒,glob路径别用
./**/*.vue这种,容易把 node_modules 里的也扫进去,用具体目录./components/*.vue更稳。建议你改成这样:
给组件起个动态名字,比如加上 index,这样每次注册都会用新名字,就不会被 Vue 缓存住了。热更新就能正常生效了。
或者换个思路,用 defineAsyncComponent 动态加载,这样反而更符合 Vue 的响应式哲学。