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

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.xdnf.cn/news/14742.html

相关文章:

  • 汇总表支持表头分组,查询组件查询框可以调整高度,DataEase开源BI工具v2.10.11 LTS版本发布
  • Linux基本指令篇 —— tac指令
  • 基于JavaWeb的校园失物招领系统设计与实现
  • C++11 <chrono> 库特性:从入门到精通
  • 在shell中直接调用使用R
  • Spring Boot整合Redis指南
  • 强化学习理论基础:从Q-learning到PPO的算法演进(2)
  • RabbitMQ RPC模式Python示例
  • go写前端打包的自动化工具
  • oracle内存参数调整
  • 【Redis】解码Redis中的list类型,基本命令,内部编码方式以及适用的场景
  • 流程管理系统技术选型避坑指南(含开源)
  • 优化 ArcPy 脚本性能
  • Jmeter并发测试和持续性压测
  • AI+实时计算如何赋能金融系统?DolphinDB 在国泰君安期货年度中期策略会的演讲
  • 鸿蒙版FlutterSDK3.27.4可以使用了
  • 报道称CoreWeave洽谈收购Core Scientific,后者涨超30%
  • 人工智能-基础篇-2-什么是机器学习?(ML,监督学习,半监督学习,零监督学习,强化学习,深度学习,机器学习步骤等)
  • 报表控件stimulsoft教程:在报表、仪表板和 PDF 表单自动生成缩略图
  • 华为云鸿蒙应用入门级开发者认证 实验(HCCDA-HarmonyOS Cloud Apps)
  • 【缓存技术】深入分析如果使用好缓存及注意事项
  • C++(模板与容器)
  • python中学物理实验模拟:斜面受力分析
  • 苍穹外卖day3--公共字段填充+新增菜品
  • python基于协同过滤的动漫推荐系统
  • 【51单片机5毫秒定时器】2022-6-1
  • Linux 内核 TCP 的核心引擎:tcp_input.c 与 tcp_output.c 的协同之道
  • Miniconda+Jupyter+PyCharm初始环境配置
  • 物联网与低代码:Node-RED如何赋能工业智能化与纵横智控的创新实践
  • 【已解决】Android Studio gradle遇到unresolved reference错误