当前位置: 首页 > news >正文

Vue工程化实现约定式路由自动注册

获取编译时态的目录结构方式:

  • webpack工程:     require.context()

  • vite工程:     import.meta.glob()

约定式路由自动注册(vite)

// router/index.js 路由模块import { createRouter, createWebHistory } from "vue-router";const modules = import.meta.glob("../views/**/index.vue");const autoRoutes = Object.keys(modules).map((path) => {const name = path.match(/\.\.\/views\/(.*?)\/index\.vue$/)[1];return {path: `/${name}`,component: modules[path],name: name.replace(/\//g, "-"), // 处理多级目录};
});// 手动配置部分
const manualRoutes = [{path: "/",name: "home",component: () => import("../views/HomeView.vue"),meta: { requiresAuth: false },},// {//   path: "/:pathMatch(.*)*",//   component: () => import("@/views/404/index.vue"),// },
];export default createRouter({history: createWebHistory(),routes: [...manualRoutes, ...autoRoutes], // 合并路由
});

目录结构 转 对象结构 (vite工程)

采用 约定大于配置 的方式获取目录结构

应用示例:

  • 需求

在这里插入图片描述

  • 目录结构

在这里插入图片描述

  • n1/n2文件:每个JS文件中的输出语句对应各自的文件名
    在这里插入图片描述
  • 实现
// 根目录: m.js// webpack 获取编译时态的目录结构: require.context//vite 获取编译时态的目录结构: import.meta.glob/** 获取bar目录下所有js模块*  return: key: 模块路径,  value: 动态导入语句*  ./TempTestModule/bar/a/n1.js:  () => import("/TempTestModule/bar/a/n1.js")*/
// const modules = import.meta.glob("./TempTestModule/bar/**/*.js");// 如果想同时获取bar目录和foo目录下所有的JS模块,可以用数组的形式
const modules = import.meta.glob(["./TempTestModule/bar/**/*.js", "./TempTestModule/foo/**/*.js"],{eager: true, // 不再使用动态导入,直接获取模块的导入结果import: "default", // 获取默认导出结果}
);
// console.log(modules);const result = {};for (const path in modules) {const moduleDefault = modules[path];// 去除路径中的 /反斜杠、 .点,以及删除数组中的第一项TempTestModule(顶端文件夹名)和最后一项 .js(文件后缀名)const matches = path.match(/[^\/\.]+/g).slice(1, -1);// console.log(path, matches);let current = result;for (let i = 0; i < matches.length; i++) {const key = matches[i];current[key] = current[key] || {};// 如果是数组的最后一项,直接赋值为导出结果if (i === matches.length - 1) {current[key] = moduleDefault;}current = current[key];}
}
// console.log(result);export default result;
// 根目录: index.html执行调用 
<script type="module">import M from "./m.js";// 确保DOM加载完成后再执行document.addEventListener("DOMContentLoaded", () => {// 用 约定大于配置的方式在编译时态获取目录结构// 把TempTestModule目录下的整个 目录结构 转换为 对象结构 并输出打印语句M.bar.a.n1.m(); // bar/a/n1.jsM.bar.a.n2.m(); // bar/a/n2.jsM.bar.b.n1.m(); // bar/b/n1.jsM.bar.b.n2.m(); // bar/b/n2.jsM.foo.a.n1.m(); // foo/a/n1.jsM.foo.a.n2.m(); // foo/a/n2.jsM.foo.b.n1.m(); // foo/b/n1.jsM.foo.b.n2.m(); // foo/b/n2.js});
</script>
http://www.lqws.cn/news/558487.html

相关文章:

  • 使用vue3构建一套网站
  • TCP 和 UDP 是什么?
  • 【Python基础】06 实战:视频压缩迷你脚本设计
  • 深入理解C#委托操作:添加、移除与调用全解析
  • 港澳地区,海外服务器ping通可能是地区运营商问题
  • MySQL为什么要使用b+树
  • 1 Studying《Computer Architecture A Quantitative Approach》1-4
  • 鸿蒙HarmonyOS 5小游戏实践:数字记忆挑战(附:源代码)
  • 信号处理学习——文献精读与code复现之TFN——嵌入时频变换的可解释神经网络(下)
  • 给定一个整型矩阵map,求最大的矩形区域为1的数量
  • Insar 相位展开真实的数据集的生成与下载(随机矩阵放大,zernike 仿真包裹相位)
  • Launcher3中的CellLayout 和ShortcutAndWidgetContainer 的联系和各自职责
  • 剑指offer50_0到n-1中缺失的数字
  • python -日期与天数的转换
  • autoas/as 工程的RTE静态消息总线实现与端口数据交换机制详解
  • 解决flash-attn安装报错的问题
  • 【C】陷波滤波器
  • 鸿蒙开发:资讯项目实战之底部导航封装
  • MySQL之MVCC实现原理深度解析
  • 类和对象(中)
  • springboot+Vue驾校管理系统
  • 开疆智能ModbusTCP转CClinkIE网关连接台达DVP-ES3 PLC配置案例
  • Java-正则表达式
  • 测量 Linux 中进程上下文切换需要的时间
  • cocos creator 3.8 - 精品源码 - 挪车超人(挪车消消乐)
  • 同步日志系统深度解析【链式调用】【宏定义】【固定缓冲区】【线程局部存储】【RAII】
  • 蚂蚁百宝箱体验:如何快速创建“旅游小助手”AI智能体
  • LINUX628 NFS 多web;主从dns;ntp;samba
  • AlphaGenome:基因组学领域的人工智能革命
  • Linux离线搭建Redis (centos7)详细操作步骤