Vite中使用glob导入组件后为什么路径报错?
大家好,我在用Vite+React项目里用glob导入组件时遇到了问题。按照网上的方法写了这样的代码:
import { glob } from 'glob';
const components = glob.sync('./components/*.jsx').map(path =>
require(path).default
);
但启动时提示Cannot find module 'D:/project/components/Button.jsx',明明文件路径是对的。试过把路径改成绝对路径、加./都不行,换成Webpack应该没问题吧?是不是Vite处理glob导入需要额外配置?
glob模块来动态导入文件,它需要在构建时就能静态分析出模块的依赖关系,而glob.sync这种方式是运行时的操作,Vite 无法解析。试试这个方法:用 Vite 提供的
import.meta.glob来替代glob。这是 Vite 内置的功能,专门用来处理这种场景。代码可以改成这样:这里的关键点是
import.meta.glob会返回一个对象,键是匹配到的文件路径,值是一个返回 Promise 的函数,调用后可以加载对应的模块。另外需要注意的是,
import.meta.glob默认是懒加载的,所以需要用await来获取模块内容。如果你希望在构建时就把所有模块打包进来,可以在import.meta.glob的第二个参数传入{ eager: true },像这样:这样做的话,
modules的值会直接是导入的模块对象,而不是一个函数。总结一下,Vite 和 Webpack 的工作方式不同,不能直接用 Node.js 的
glob,换成import.meta.glob就能解决问题了。这其实是 Vite 的一个特性,虽然刚开始可能有点不习惯,但用熟了会觉得挺方便的。