场景

下面是其中一种场景,我们定义二种方法对外提供一个方案,按需调用。

// list/test1.ts
export default () => {
  console.log("test")
}
// list/test2.ts

export default () => {

  console.log("test")

}
// index.ts
import test1 from "./list/test1";
import test2 from "./list/test2";
const modules = {
  test1,
  test2
}

function execute() {
  for (let modulesKey in modules) {
	// 条件
    modules[modulesKey]();
  }
}

⚠ 这种方式在后面想在 list 文件夹下再扩充方法时候需要改 2 个地方凡是漏掉一处都会导致程序无法运行

第一个:需要在 index.ts 导入新模块

第二个:需要 modules 注册这个新的模块

解决

我们可以使用 vite 的 Glob 方法动态导入模块。

详情 Glob 使用文档可以直接看官方的文档 地址 这里不过多描述。

这里我们可以直接修改 index.ts 文件

// 导入 list 中全部的 ts 文件
const modules: Record<string, () => void> = import.meta.glob('./list/*.ts', {
  eager: true,
  import: 'default',
});

function execute() {
  for (let modulesKey in modules) {
	// 条件
    modules[modulesKey]();
  }
}

这样子就可以实现动态导入,后面只需要在 list 文件夹中直接新建模块文件即可。

技术推广

责任链模式

// list/test1.ts
export default {
	// 处理
	execute: (args) => {

	},

	// 是否支持处理
	support: (args) => {
		return false;
    }
}
// 导入 list 中全部的 ts 文件
const modules: Record<string, () => void> = import.meta.glob('./list/*.ts', {
  eager: true,
  import: 'default',

});

function execute(args) {
  for (let modulesKey in modules) {
     if(modules[modulesKey].support(args)) {
		modules[modulesKey](args);
  	 }
   }

}

批量注册组件

// components/lib/ComponentDemo1.vue
<template>
  <div>我是一个组件</div>
</template>
<style lang="less" scoped></style>
// components/lib/index.ts
import type {App} from "vue";

const modules: Record<string, () => void> = import.meta.glob('./*.vue', {
  eager: true,
  import: 'default',
});


export function install(app: App) {
  for (const modulesKey in modules) {
	// 从文件路径中格式化出组件的名称
    const componentName = modulesKey.replace('./', '').replace('.vue', '')
    console.log(componentName)
    app.component(componentName, modules[modulesKey])
    // app.use(modules[modulesKey]);
  }
}