Vite - Glob 自动加载文件

230 阅读2分钟

太阳遥不可及,少年一往无前。 --放学等我

2018_11_08_16_47_IMG_0024.JPG

Glob简介

试想一下,在前端开发中,有事我们需要一次性导入一个文件夹中的所有文件,一般是怎么做呢?

好像纯前端技术无法实现这个需求,需要借助node或者第三方库,现在借助Vite的Glob功能(本质上也是用了第三方库),可是实现加载文件夹内文件的功能。

Vite 支持使用特殊的 import.meta.glob 函数从文件系统导入多个模块: --Vite

简单举个栗子🌰

const modules =import.meta.glob('./dir/*.js')

modules对应的内容就是

// vite 生成的代码
const modules = {
  './dir/foo.js': () => import('./dir/foo.js'),
  './dir/bar.js': () => import('./dir/bar.js'),
}

然后遍历 modules 对象的 key 值来访问相应的模块:

for (const path in modules) {
  modules[path]().then((mod) => {
    console.log(path, mod)
  })
}

让我们测试一下:

这里是我自己工程的目录,当前文件夹内包含的.ts 如下:

执行上述代码,替换成自己的文件夹'./*.js',打印的数据如下

可以看到,这里获取到了当前文件夹下所有对应文件格式为 TS 类型的文件。

Glob

注意,这里的模块加载是懒加载的,在构建的时候会创建单独的chunk,如果想要直接引入所有的模块,就像我们平常一个一个引入引入那样,这需要添加一个参数 { eager: true } 作为区分

const modules = import.meta.glob('./dir/*.js', { eager: true })

modules 的内容就是

使用

就这个特性而言,我实际用的主要是模块化加载路由,步骤如下:

router 文件夹下,新建文件夹或者新建文件,用于存放模块化的路由,比如在这里,为了做示例,modules存放模块化的路由,这里存放了 echarts 和 weather 两个模块:

其实不仅可以加载文件夹,加载模块化的文件也是可以的额,只要存放在modules文件下

那么,对应的代码该怎么样开展呢?

模块化路由加载

这里代码做了区分,对于加载文件和加载文件夹都做了兼容,可直接取用:

const modules = import.meta.glob('./modules/**/*.ts', { eager: true });
const routeModuleList = [];

// 加入到路由集合中
Object.keys(modules).forEach((key) => {
  const mod = (modules)[key].default || {};
  const modList = Array.isArray(mod) ? [...mod] : [mod];
  routeModuleList.push(...modList);
});

本初代码的意思就是模块化加载modules下的文件,并加入到对应的路由集合中去

拓展

本处只是简单介绍了一下 Glob 的使用,更多使用方法等待大家的探索和分享~

引用

Vite