分享Vue3中的一个路由加载函数,基于Glob导入模式,根据路径自动生成路由

哈喽,大家好!我是「励志前端小黑哥」,我带着最新发布的文章又来了!

专注前端领域10年+,专门分享那些没用的前端知识!

今天要分享的内容,是一段路由加载的函数代码,这段代码能自动读取目录中的*.vue文件,并将他们自动组装成Vue3的路由。

前言

在现代前端开发中,单页面应用(SPA)已成为主流,Vue.js作为一个轻量级且功能强大的前端框架,被广泛应用于各种项目中。

在Vue3中,Vue Router是其官方提供的路由管理器,用于处理不同视图之间的切换。在大型项目中,手动定义所有路由可能会变得繁琐且容易出错。

因此,编写一个能够根据文件结构自动生成路由的函数,可以极大地提高开发效率。本文将分享一个这样的函数,希望对你有所帮助。

需求分析

假设我们有这么一个目录结构

文章配图

那我们的需求就是,将目录结构转换为如下可访问的链接:

http://host/car
http://host/device
http://host/env
http://host/index
http://host/people
......

技术点

  1. Vue3 和 Vue Router:Vue3 提供了更强大的组合式 API,Vue Router 也进行了相应的更新,支持更好的类型检查和模块化管理。
  2. 文件遍历:使用Vite的 import.meta.glob 函数来遍历项目目录,获取所有组件文件路径。
  3. 动态路由生成:根据获取的文件路径,动态生成 Vue Router 的路由配置。

实现步骤

1. autoImportVueRouter函数的实现代码

下面我在项目中使用的示例代码,用于根据指定目录下的 Vue 组件文件自动生成路由配置。

// file: autoImportVueRouter.tsexport default function autoImportVueRouter () : Array<VueRouter.RouteRecordRaw> {// 加载views下的所有文件,注意:这里的路径`@`const views = import.meta.glob('@/views/**/**.vue')// 标识index.vue路径是否存在   let indexExist = falseconst subRouter: Array<VueRouter.RouteRecordRaw> = Object.keys(views).map(function (key:string) {const component = views[key]const path = key.toLowerCase().replace(/\.vue$/, '').replace(/.+\/views/g, '')if (path === '/index') indexExist = truereturn {path,component}})// 标识index.vue路径必须存在,否则首页不知道往跳转if (!indexExist) throw new Error('src/views目录下必须存在Index.vue')return subRouter
}

上面函数的关键代码就是import.meta.glob('@/views/**/**.vue'),它能从文件系统中导入多个模块。

这里是该函数的介绍:https://vitejs.cn/vite5-cn/guide/features.html#glob-import

2. 该函数内的注意点

另外需要注意的一个点,是路径'@/views/**/**.vue'中的@符号,它需要在vite.config.ts中进行别名的配置。如果使用ts,还需要在tsconfig.json中进行配置,这样才能排除相对路径对函数引用造成的影响。比如,

import { defineConfig } from 'vite'
import * as path from 'node:path'export default defineConfig({resolve: {alias: {// 别名'@': path.resolve(__dirname, 'src')}}//...其他配置
})

3. 函数引用

在 Vue Router 配置文件中使用这个生成的路由:

import * as VueRouter from 'vue-router'
import autoImportVueRouter from './autoImportVueRouter'const router = VueRouter.createRouter({history: VueRouter.createWebHistory('/'),routes: [// 首页重定向,配合autoImportVueRouter函数内的if判断{path: '/',redirect: '/index'},// 使用路由...autoImportVueRouter(),// 其他路由全部返回404{path: '/:pathMatch(.*)*',redirect: '/404'}]
})export default router;

至此,整个调用流程就实现了,后续无论新增/删除了什么文件,再次打包构建之后,我们都不需要再去修改维护我们的路由模块了。

对于大型项目,或者一部分懒人,这个方式引入路由非常的方便!

举一反三

通过vite的glob的多模块导入功能,我们还可以做更多的事情。比如,

  1. 全局组件自动加载:与路由的差别只是将路由变成了组件,然后利用组件的全局注册功能,将组件自动加载到项目中,方便其他各个页面调用。
  2. 批量导入多个图片/资源:图片或其他资源也可以类似操作,然后在脚本中拿到它们,这在做图片循环的时候也是比较常用的。
  3. 项目所有内容全部批量导入,构造一个基于配置的项目架构:无论图片、模块、路由等,全部可以通过glob导入,这样就可以根据自身项目情况来解析它们,将其抽离成配置文件后,就形成了一套固定的开发流程。如果想要完全掌控项目,这么做是非常有必要的。

结语

通过上述方法,我们可以实现 Vue3 项目中根据文件路径自动生成路由的功能,这不仅减少了手动配置路由的工作量,还提高了项目的可维护性和可扩展性。

希望这个函数能对你的 Vue3 项目开发有所帮助,让你在构建大型单页面应用,或者组件的管理过程中,更加得心应手。

PS:文章看完了,如果本文对你有所帮助,请点赞、收藏,这样能让更多人知道!

励志前端小黑哥,全网唯一账号!
关注我,带你了解更多前端知识!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

StringBulider和StringBuffer的底层源码剖析

要深入了解 StringBuffer 和 StringBuilder 的区别&#xff0c;从底层源码的角度来解析&#xff0c;包括它们的创建、扩容机制等&#xff0c;可以参考 JDK 1.8 的源码。 1. AbstractStringBuilder 类 StringBuffer 和 StringBuilder 都继承自 AbstractStringBuilder。…

Three.js实现小米 su7 压缩后的模型加载

Three.js实现小米 su7 压缩后的模型加载 预览&#xff1a; https://threehub.cn/#/codeMirror?navigationThreeJS&classifybasic&idgltfOptLoader import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js impo…

复旦大学全球供应链研究中心揭牌,合合信息共话大数据赋能

10月13日&#xff0c;复旦大学全球供应链研究中心&#xff08;以下简称“中心”&#xff09;揭牌仪式在复旦大学管理学院政立院区隆重举行。我国的供应链体系庞大复杂&#xff0c;在百年未有之大变局下&#xff0c;保障产业链供应链安全已成为我国的重要战略目标。中心的设立旨…

《Vue3 版本差异》Vue3.5+ 在组件或HTML元素绑定 ref 差异

组件上的 ref&#xff0c;组合式写法的变化&#xff1b; 在 2024.09.03 发布的 v3.5.0 版上新增接口 useTemplateRef&#xff1b; v3.5 之前 代码第 8 行&#xff0c;导入 ref&#xff1b;代码第 10 行&#xff0c;使用 ref 传参为 null&#xff0c;变量名与 第三行 ref 同…

【python】sorted() list.sort()

文章目录 sorted()和list.sort()sorted 函数sorted()根据键对字典排序根据字典的键排序根据字典的值排序将排序结果转换回字典 list.sort() 方法总结 keylambda student: student[age] sorted()和list.sort() 在Python中&#xff0c;sorted 函数和 list.sort() 方法都可以用来…

打造企业数字化转型的未来蓝图:架构蓝图的构建与实施策略深度解析

随着数字经济的蓬勃发展&#xff0c;全球企业正在经历前所未有的变革与挑战。企业的运营模式、客户体验和市场竞争格局都在迅速变化。为了应对这些挑战&#xff0c;企业必须从战略到技术层面进行深度重塑&#xff0c;架构蓝图的构建和实施是数字化转型过程中不可或缺的工具。架…

CSS - grid制作表格

1. grid-template-columns&#xff1a;网格布局中的列的数量&#xff0c;也可以设置列的宽度 .grid-container {display: grid;grid-template-columns: 80px 200px auto 40px; }.grid-container {display: grid;grid-template-columns: auto auto auto auto;//表示所有列的宽度…

Starrocks部署前期准备

前提条件 硬件要求 CPU StarRocks 依靠 AVX2 指令集充分发挥其矢量化能力。因此&#xff0c;在生产环境中&#xff0c;强烈建议您将 StarRocks 部署于 x86 架构 CPU 的服务器上。 您可以在终端中运行以下命令来检查 CPU 是否支持 AVX2 指令集&#xff1a; cat /proc/cpuin…

高效评优:基于SpringBoot的学生奖励管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理学生评奖评优管理系统的相关信息成为必然。…

全连接前馈网络:深度学习的基础架构解析

全连接前馈网络&#xff1a;深度学习的基础架构解析 全连接前馈网络&#xff0c;也称为多层感知机&#xff08;MLP, Multi-Layer Perceptron&#xff09;&#xff0c;是深度学习中最基础的神经网络结构之一。这种网络由多个层次的神经元组成&#xff0c;每一层都完全连接到前一…

[JAVAEE] 线程安全问题

目录 一. 什么是线程安全 二. 线程安全问题产生的原因 三. 线程安全问题的解决 3.1 解决修改操作不是原子性的问题 > 加锁 a. 什么是锁 b. 没有加锁时 c. 加锁时 d. 死锁 e. 避免死锁 3.2 解决内存可见性的问题 > volatile关键字 (易变的, 善变的) a. 不加…

古埃及象形文字在线字典

我在个人网站“小孔的埃及学站点”上推出了在线的象形文字字典&#xff0c;总共收罗了将近700条的象形文字&#xff08;词&#xff09;。在线字典的使用方法很简单&#xff0c;在网站各大版块首页的右上方会有如下图所示的查询入口。 点击文本框&#xff0c;输入中文或英文关键…

深入理解 SQL 中的高级数据处理特性:约束、索引和触发器

在 SQL&#xff08;Structured Query Language&#xff09;中&#xff0c;除了基本的查询、插入、更新和删除操作外&#xff0c;还有一些高级的数据处理特性&#xff0c;它们对于确保数据的完整性、提高查询性能以及实现自动化的数据处理起着至关重要的作用。这些特性包括约束、…

百度文心一言接入流程-java版

百度文心一言接入流程-java版 一、准备工作二、API接口调用-java三、百度Prompt工程参考资料: 百度文心一言:https://yiyan.baidu.com/百度千帆大模型:https://qianfan.cloud.baidu.com/百度千帆大模型文档:https://cloud.baidu.com/doc/WENXINWORKSHOP/index.html千tokens…

使用API有效率地管理Dynadot域名,通过域名命令删除域名服务器(NS)

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

<Project-11 Calculator> 计算器 0.4 公制单位转换器 Metric Units Converter HTML JS

前言 这个参考的是时间转换器 &#xff1c;Project-11 Calculator&#xff1e; 计算器 0.1时间换算器 Time Conversion Calculator-CSDN博客&#xff0c;主要就是替换内容&#xff0c;相当于找不同。 改新内容 index.html 加了新页面链接 添加了 favicon.jpg 橘猫 就当是…

asp.net core会话session设置滑动过期时间

微软asp.net core帮助文档 asp.net core会话 https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/app-state?viewaspnetcore-8.0 Program.cs 文件中&#xff0c;核心代码&#xff1a; builder.Services.AddSession(options > { //滑动过期时间&#xff0c;空闲…

Qt开发-----线程调度

目录 前言 一、Linux下查看进程的情况 二、线程的创建 三、多线程的创建和使用 前言 以下引用内容源自正点原子Qt开发指南文档。 我们写的一个应用程序&#xff0c;应用程序跑起来后一般情况下只有一个线程&#xff0c;但是可能也有特殊情况。比如我们前面章节写的例程都跑…

让你的单细胞数据动起来!|iCellR(一)

今天在翻阅single cell 的github时候&#xff0c;我看见了这个R包&#xff0c;允许我们处理各种来自单细胞测序技术的数据&#xff0c;如scRNA-seq&#xff0c;scVDJ-seq和CITE-Seq。 单细胞转录组教程汇总 想看整套的学习流程还可以戳这里&#xff1a; https://vimeo.com/3…

CSS综合案例——新闻详情

一、知识点 1、文字颜色 属性名&#xff1a;color 属性值&#xff1a; 颜色表示方式属性值说明使用场景颜色关键字颜色英文单词red,green,blue学习测试rgb表示法rg(r,g,b)r,g,b表示红绿蓝三原色&#xff0c;取值0-255了解rgba表示法rgba(r,g,b,a)a表示透明度&#xff0c;取…