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导入需要额外配置?
根本问题有两个:
1. Vite 是基于 ESM 的,不支持
require()语法2.
glob.sync返回的只是字符串路径,Vite 没办法在构建时做静态分析,所以找不到模块Vite 有自己的 glob 导入方式,用
import.meta.glob就行:如果不需要立即加载(懒加载):
关键点就是
{ eager: true }这个选项。加上它会同步加载所有匹配的模块,返回的就是实际的组件;不加的话返回的是一个函数,调用时才加载。不用换 Webpack,Vite 自带这个功能就是干这个用的。
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 的一个特性,虽然刚开始可能有点不习惯,但用熟了会觉得挺方便的。