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

从0-1搭建一个web项目(路由目录分析)详解

本章分析vue路由目录文件详解

ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 开源的后台管理框架。在一定程度上节省您的开发效率。另外本项目还封装了一些常用组件、hooks、指令、动态路由、按钮级别权限控制等功能。感兴趣的小伙伴可以访问源码点个赞 地址

在这里插入图片描述

先简单看一下目录结构

一个清晰、有序的项目结构对于项目的可维护性和可扩展性至关重要

├─ .husky                  # husky 配置文件
├─ .vscode                 # VSCode 推荐配置
├─ build                   # Vite 配置项
├─ public                  # 静态资源文件(该文件夹不会被打包)
├─ src
│  ├─ api                  # API 接口管理
│  ├─ assets               # 静态资源文件
│  ├─ components           # 全局组件
│  ├─ config               # 全局配置项
│  ├─ directives           # 全局指令文件
│  ├─ enums                # 项目常用枚举
│  ├─ hooks                # 常用 Hooks 封装
│  ├─ languages            # 语言国际化 i18n
│  ├─ layouts              # 框架布局模块
│  ├─ routers              # 路由管理
│  ├─ stores               # pinia store
│  ├─ styles               # 全局样式文件
│  ├─ typings              # 全局 ts 声明
│  ├─ utils                # 常用工具库
│  ├─ views                # 项目所有页面
│  ├─ App.vue              # 项目主组件
│  ├─ main.ts              # 项目入口文件
│  └─ vite-env.d.ts        # 指定 ts 识别 vue
├─ .editorconfig           # 统一不同编辑器的编码风格
├─ .env                    # vite 常用配置
├─ .env.development        # 开发环境配置
├─ .env.production         # 生产环境配置
├─ .env.test               # 测试环境配置
├─ .eslintignore           # 忽略 Eslint 校验
├─ .eslintrc.cjs           # Eslint 校验配置文件
├─ .gitignore              # 忽略 git 提交
├─ .prettierignore         # 忽略 Prettier 格式化
├─ .prettierrc.cjs         # Prettier 格式化配置
├─ .stylelintignore        # 忽略 stylelint 格式化
├─ .stylelintrc.cjs        # stylelint 样式格式化配置
├─ CHANGELOG.md            # 项目更新日志
├─ commitlint.config.cjs   # git 提交规范配置
├─ index.html              # 入口 html
├─ LICENSE                 # 开源协议文件
├─ lint-staged.config.cjs  # lint-staged 配置文件
├─ package-lock.json       # 依赖包包版本锁
├─ package.json            # 依赖包管理
├─ postcss.config.cjs      # postcss 配置
├─ README.md               # README 介绍
├─ tsconfig.json           # typescript 全局配置
└─ vite.config.ts          # vite 全局配置文件
————————————————

对目录进行详细的拆解分析 项目根目录

配置文件

  • .husky:包含Husky的配置文件,用于设置Git钩子,如pre-commit等,以自动化地执行代码格式化、测试等任务。
  • .vscode:存放VSCode编辑器的推荐配置,如代码片段、设置等,以便团队成员使用统一的编辑器设置。
  • .editorconfig:用于定义和维护跨编辑器和IDE的代码风格一致性。
  • .env, .env.development, .env.production, .env.test:Vite的环境变量配置文件,分别用于不同的环境(通用、开发、生产、测试),以便在不同环境下使用不同的配置。
  • .eslintignore, .eslintrc.cjs:ESLint的配置文件和忽略文件,用于代码质量和风格的检查。
  • .prettierignore, .prettierrc.cjs:Prettier的配置文件和忽略文件,用于代码格式化。
  • .stylelintignore, .stylelintrc.cjs:Stylelint的配置文件和忽略文件,用于CSS/SCSS等样式文件的格式化和质量检查。
  • commitlint.config.cjs:用于配置Git提交信息的规范,确保提交信息的一致性和可读性。
  • lint-staged.config.cjs:lint-staged的配置文件,用于在Git提交前自动运行linters。
  • tsconfig.json:TypeScript的配置文件,定义了项目中TypeScript的编译选项。
  • vite.config.ts:Vite的全局配置文件,用于配置项目的打包、开发服务器等选项。

通用文件和目录

  • CHANGELOG.md:项目的更新日志,记录每次版本更新的内容和变更。
  • LICENSE:项目的开源协议文件,如MIT、Apache等。
  • README.md:项目的README文件,介绍项目的用途、安装方法、使用说明等。
  • package-lock.json:依赖包版本锁文件,确保团队成员安装的依赖包版本一致。
  • package.json:项目的依赖包管理和脚本配置文件。
    开发目录
    构建和静态资源
  • build:存放Vite的特定配置文件或脚本(根据项目配置,此目录可能不常见)。
  • public:存放静态资源文件,如图片、favicon等,这些文件不会被Webpack等构建工具处理,而是直接复制到输出目录中。
    源代码
  • src:项目的核心源代码目录。
  • api:API接口管理目录,存放与后端交互的API请求代码。
  • assets:存放静态资源文件,但与public不同,这里的文件可能会通过- Webpack等构建工具处理(如图片压缩、字体转换等)。
  • components:全局组件目录,存放可复用的Vue组件。
  • config:全局配置项目录,存放项目的全局配置信息。
  • directives:全局指令文件目录,存放自定义的Vue指令。
  • enums:项目常用枚举目录,定义项目中常用的枚举类型。
  • hooks:常用Hooks封装目录,存放Vue Composition API的自定义Hooks。
  • languages:语言国际化i18n目录,存放项目的多语言资源。
  • layouts:框架布局模块目录,定义应用的布局结构。
  • routers:路由管理目录,定义Vue Router的路由配置。
  • stores:Pinia store目录,用于管理Vue应用的全局状态。
  • styles:全局样式文件目录,存放项目的全局样式文件。
  • typings:全局ts声明目录,存放TypeScript的类型声明文件。
  • utils:常用工具库目录,存放项目中常用的工具函数。
  • views:项目所有页面目录,存放Vue应用的页面组件。
  • App.vue:项目的主组件文件,Vue应用的根组件。
  • main.ts:项目的入口文件,用于挂载Vue应用并引入全局配置和插件。
  • vite-env.d.ts:TypeScript声明文件,用于指定TypeScript如何识别.vue文件。

分析main.js

上部分的一系列import就不说了,就是导入一些依赖和插件

下面这句是抛出一个未捕获的全局错误

app.config.errorHandler = errorHandler;

接下来就是循环注册全局组件

Object.keys(Icons).forEach(key => {app.component(key, Icons[key as keyof typeof Icons]);
});

分析路由

亿点小知识了路由的逻辑,才能更清楚的了解一个项目

分析routers/index.ts文件

const mode = import.meta.env.VITE_ROUTER_MODE;  //此处VITE_ROUTER_MODE是hash
const routerMode = {hash: () => createWebHashHistory(),history: () => createWebHistory()
};const router = createRouter({history: routerMode[mode](),routes: [...staticRouter, ...errorRouter],strict: false,scrollBehavior: () => ({ left: 0, top: 0 })
});

1.history定义了路由模式,不懂得可以看下边

2.routes定义了静态路由,根据连接可以找到 modules/staticRouter.ts

3.strict:严格模式
scrollBehavior:切换新页面,定义页面的位置
4.路由守卫

  // 6.如果没有菜单列表,就重新请求菜单列表并添加动态路由if (!authStore.authMenuListGet.length) {await initDynamicRouter();return next({ ...to, replace: true });}

首先是异步加载initDynamicRouter方法,打开initDynamicRouter看看具体逻辑,位置在 modules/dynamicRouter.ts

第一部分是异步获取菜单权限列表和按钮权限列表。

const userStore = useUserStore();
const authStore = useAuthStore();

第二部分判断有没有权限,没有权限的话清除token,返回登录页并且抛出一个promist错误

 if (!authStore.authMenuListGet.length) {ElNotification({title: "无权限访问",message: "当前账号无任何菜单权限,请联系系统管理员!",type: "warning",duration: 3000});userStore.setToken("");router.replace(LOGIN_URL);return Promise.reject("No permission");}

第三部分就是加载动态路由,首先看一下authStore.flatMenuListGet是怎么来的,经过搜索发现是调用了如下的方法,位置在 stores/modules/auth

flatMenuListGet: state => getFlatMenuList(state.authMenuList),

继续深入查找getFlatMenuList方法

export function getFlatMenuList(menuList: Menu.MenuOptions[]): Menu.MenuOptions[] {let newMenuList: Menu.MenuOptions[] = JSON.parse(JSON.stringify(menuList));return newMenuList.flatMap(item => [item, ...(item.children ? getFlatMenuList(item.children) : [])]);
}

这一部分可能有同学看不懂,我来解释一下。

这部分主要就是递归将数组扁平化,扁平化的意思就是将多维数组转换成一位数组,类似这样:

[1,2,[3,4]] => [1,2,3,4]

具体是用过数组的flatMap方法来实现的,flatMap方法对数组中的每个元素应用给定的回调函数,然后将结果展开一级,返回一个新数组。

const arr = [1, 2, [3], [4, 5]];
const res = arr.flatMap(item => item);
console.log(res);  // [1,2,3,4,5]

由于flatMap每次只能展开一级,所以需要递归调用。

至此,就已经拿到了authStore.flatMenuListGet的数据。

接着往下走

item.children && delete item.children

这一句就是删除children,因为拿到的是扁平化的数组,所以删处多余的children。

接下来就是动态导入对应的component路径。
最后将路由添加到layout组件下。
至此,动态路由导入成功。

总结:

以上就是路由目录分析详解这个目录结构展示了一个现代Vue.js项目的典型布局,旨在提高项目的可维护性和可扩展性
在这里插入图片描述
如碰到其他的问题 可以私下我 一起探讨学习
如果对你有所帮助还请 点赞 收藏谢谢~!
关注收藏博客 作者会持续更新…

相关文章:

从0-1搭建一个web项目(路由目录分析)详解

本章分析vue路由目录文件详解 ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 开源的后台管理框架。在一定程度上节省您的开发效率。另外本项目还封装了一些常用组件、hooks、指令、动态路由、按钮级别权限控制等功能。感兴趣的小伙伴可以访问源码点个赞…...

Zabbix分布式监控

目录 分布式监控架构 实现分布式监控的步骤 优点和应用场景 安装Zabbix_Proxy Server端Web页面配置 测试 Zabbix 的分布式监控架构允许在大规模和地理上分散的环境中进行高效的监控。通过分布式监控,Zabbix 可以扩展其监控能力,支持大量主机和设备…...

前端面试39(关于git)

针对前端开发者的Git面试题可以覆盖Git的基础概念、常用命令、工作流程、团队协作、以及解决冲突等方面。以下是一些具体的Git面试 Git基础知识 什么是Git? Git是一个分布式版本控制系统,用于跟踪计算机文件的更改,并协调多个人共同在一个项…...

13--memcache与redis

前言:数据库读取速度较慢一直是无法解决的问题,大型网站应对的方式主要是使用缓存服务器来缓解这种情况,减少数据库访问次数,以提高动态Web等应用的速度、提高可扩展性。 1、简介 Memcached/redis是高性能的分布式内存缓存服务器…...

QT学习日记一

创建QT文件步骤 这是创建之后widget.cpp和widget.h文件的具体代码解释,也是主要操作的文件,其中main.cpp不用操作,ui则是图形化操作界面,综合使用时,添加一个元件要注意重编名和编译一下,才能在widget这类…...

redhat7.x 升级openssh至openssh-9.8p1

1.环境准备: OS系统:redhat 7.4 2.备份配置文件: cp -rf /etc/ssh /etc/ssh.bak cp -rf /usr/bin/openssl /usr/bin/openssl.bak cp -rf /etc/pam.d /etc/pam.d.bak cp -rf /usr/lib/systemd/system /usr/lib/systemd/system.bak 3.安装…...

Spring Cloud Eureka

引入:远程调用时,url是写死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 解决思路: 比如(医院,学校等)机构的电话号码发生变化,就需要通知各个使⽤…...

threejs

1.场景清空,释放内容 // 假设你已经有一个Three.js的场景对象scene// 函数:清空场景中的所有对象 function clearScene(scene) {while(scene.children.length > 0){const object scene.children[0];if(object.isMesh) {// 如果有几何体和材质&#…...

将pytorch 模型封装为c++ api 例子

在 PyTorch 中,通常使用 Python 来定义和训练模型,但是可以将训练好的模型导出为 TorchScript,然后在 C 中加载和使用。以下是一个详细的过程,展示了如何将 PyTorch 模型封装成 C API: 步骤 1: 定义和训练模型&#x…...

珠宝迷你秤方案

珠宝迷你秤作为一种便携式电子称重设备,因其小巧、便携、精度高等特点,广泛应用于各种需要精确称重的场景。可能这个目前在国内使用的人比较少,但在西方国家珠宝迷你秤却是可以用来送礼的物品。因为珠宝迷你秤的外观跟手机外观大多相似&#…...

边缘概率密度、条件概率密度、边缘分布函数、联合分布函数关系

目录 二维随机变量及其分布离散型随机变量连续型随机变量边缘分布边缘概率密度举例边缘概率密度 条件概率密度边缘概率密度与条件概率密度的区别边缘概率密度条件概率密度举个具体例子 参考资料 二维随机变量及其分布 离散型随机变量 把所有的概率,都理解成不同质量…...

软件架构之系统分析与设计方法(2)

软件架构之系统分析与设计方法(2) 8.4 面向对象的分析与设计8.4.1 面向对象的基本概念8.4.2 面向对象分析8.4.3 统一建模语言 8.5 用户界面设计8.5.1 用户界面设计的原则8.5.2 用户界面设计过程 8.6 工作流设计8.6.1 工作流设计概述8.6.2 工作流管理系统 8.7 简单分…...

AD确定板子形状

方法1 修改栅格步进值,手动绘制 https://cnblogs.com/fqhy/p/13768031.html 方法2 器件摆放确定板子形状 https://blog.csdn.net/Mark_md/article/details/116445961...

CSS【详解】边框 border,边框-圆角 border-radius,边框-填充 border-image,轮廓 outline

边框 border border 是以下三种边框样式的简写: border-width 边框宽度 —— 数值 px(像素),thin(细),medium(中等),thick(粗)border-style 边框线型 —— none【默认值…...

Error: EBUSY: resource busy or locked, rmdir...npm install执行报错

Error: EBUSY: resource busy or locked, rmdir...npm install执行报错 你一个文件夹目录开了两个cmd命令行(或者powershell),关掉一个就好了。...

Hot100-排序

1.快排 215. 数组中的第K个最大元素 - 力扣(LeetCode) (1)第k大的元素在排序数组中的位置是nums.length - k。 假设我们有一个数组nums [3, 2, 1, 5, 6, 4],并且我们想找到第2大的元素。 步骤 1:排序数…...

树链剖分相关

树链剖分这玩意儿还挺重要的,是解决静态树问题的一个很好的工具~ 这里主要介绍一下做题时经常遇到的两个操作: 1.在线求LCA int LCA(int x,int y){while(top[x]!top[y])if(dep[top[x]]>dep[top[y]]) xfa[top[x]];else yfa[top[y]];return dep[x]&l…...

如何将Grammarly内嵌到word中(超简单!)

1、下载 安装包下载链接见文章结尾 官网的grammarly好像只能作为单独软件使用,无法内嵌到word中🧐🧐🧐 2、双击安装包(安装之前把Office文件都关掉) 3、安装完成,在桌面新建个word文件并打开 注…...

OTG -- 用于FPGA的ULPI接口芯片USB3320讲解(续)

目录 1 背景 2 USB3320在FPGA上的应用 1 背景 最近使用FPGA驱动USB PHY实现高速USB功能,为了方便,购买了一块微雪的USB3300子板,发现怎么都枚举不了,使用逻辑分析仪抓取波形,和STM32F407USB3300波形进行对比&#xf…...

了解劳动准备差距:人力资源专业人员的战略

劳动准备差距是一个紧迫的问题,在全球人事部门回应,谈论未开发的潜力和错过的机会。想象一下,人才和需求之间的悬崖之间有一座桥,这促使雇主思考:我们是否为员工提供了足够的设备来应对未来的考验? 这种不…...

SAP PS学习笔记02 - 网络,活动,PS文本,PS文书(凭证),里程碑

上一章讲了PS 的概要,以及创建Project,创建WBS。 SAP PS学习笔记01 - PS概述,创建Project和WBS-CSDN博客 本章继续讲PS的后续内容。包括下面的概念和基本操作,以及一些Customize: - 网络(Network&#xf…...

Github 2024-07-07php开源项目日报 Top9

根据Github Trendings的统计,今日(2024-07-07统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9Blade项目2JavaScript项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数…...

算法训练(leetcode)第二十六天 | 452. 用最少数量的箭引爆气球、435. 无重叠区间、763. 划分字母区间

刷题记录 452. 用最少数量的箭引爆气球思路一思路二 435. 无重叠区间763. 划分字母区间 452. 用最少数量的箭引爆气球 leetcode题目地址 思路一 先按起始坐标从小到大排序。排序后找交集并将交集存入一个数组中,遍历气球数组从交集数组中找交集,找到与…...

Ubuntu 下 Docker安装 2024

Ubuntu 下 Docker安装 2024 安装1.卸载老版本2.更新apt包索引3.安装必要工具包4.添加Docker GPG秘钥5.配置仓库源6.安装Docker Engine7.启动docker 国内镜像源下架的解决办法1.修改文件 /etc/docker/daemon.json2.换源3.查看是否换源成功4.重启 安装 1.卸载老版本 sudo apt-ge…...

发送者的可靠性

这篇文章是了解MQ消息的可靠性,即:消息应该至少被消费者处理1次 那么问题来了: 我们该如何确保MQ消息的可靠性?如果真的发送失败,有没有其它的兜底方案? 首先,我们一起分析一下消息丢失的可能…...

Profibus_DP转ModbusTCP网关模块连马保与上位机通讯

Profibus转ModbusTCP网关模块(XD-ETHPB20)广泛应用于工业自动化领域。例如,可以将Profibus网络中的传感器数据转换为ModbusTCP协议,实现数据的实时监控和远程控制。本文介绍了如何利用Profibus转ModbusTCP网关(XD-ETHP…...

移动应用:商城购物类,是最常见的,想出彩或许就差灵犀一指

在移动应用中,商城购物类的非常常见,模式也非常成熟,想要设计的出彩也是有难度的,这次分享一些不同的。...

linux 查看历史命令列表来访问之前的内容的命令是:history

在Linux中,要查看历史命令列表以访问之前的内容,你可以使用history命令。这个命令会显示你当前shell会话(或者,如果你指定了参数,可能是所有会话)中执行过的命令列表。 基本用法 简单地输入history并按下…...

NAS免费用,鲁大师 AiNAS正式发布,「专业版」年卡仅需264元

7月10日,鲁大师召开新品发布会,正式发布旗下以“提供本地Ai部署和使用能力以及在线NAS功能”并行的复合软件产品:鲁大师 AiNAS。 全新的鲁大师 AiNAS将持续满足现如今大众对于数字化生活的全新需求,将“云存储”的便捷与NAS的大容…...

spring监听事件

1、spring-监听事件基本原理 Spring的事件监听机制和发布订阅机制是很相似的:发布了一个事件后,监听该类型事件的所有监听器会触发相应的处理逻辑 2、Spring 监听事件相关规范 在Spring中,事件监听机制主要涉及到了一下几个关键的规范&#x…...

汽车装饰网站模板/湖北短视频搜索seo

题目: Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time and O(1) space? 题解: 推断一个链表是不是回文的,这里要求O(n)时间复杂度和O(1&#xf…...

上海html5网站建设/苏州网络推广seo服务

作者:范军 (Frank Fan) 新浪微博:frankfan7核心竞争力,说白了就是一种掌握稀缺资源的能力。你拥有的资源,别人不能很轻易的获得。对于IT技术人而言,我们需要对自己所希望获取的稀缺资源有很清楚…...

wordpress 国内视频教程/广东seo外包服务

1.如何处理单元测试产生的数据,下列哪些说法是正确的? 【ABC 】多选 A .测试数据入库时加特殊前缀标识。 B .测试数据使用独立的测试库。 C .自动回滚单元测试产生的脏数据。 D .无须区别,统一在业务代码中进行判断和识别。 2.关于并发…...

有用模板网在线制作免费网站/杭州seo搜索引擎优化公司

前言 千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区。除此之外,还有其他的思路和解决方案。根据本人多年的工作经验,做了如下总结。 方案 "千万级大表优化"这句话有…...

做网站哪家公司最好/seo优化网站网页教学

一 常见容错场景分析1.1作业某个任务阻塞了,长时间占用资源不释放1.2在MapTask任务运行完毕,ReduceTask运行过程中,某个MapTask节点挂了,或者某个MapTask结果存放的那磁盘坏掉了二 作业某个任务阻塞了,长时间占用资源不…...

web个人网站设计毕业论文/深圳网络营销

sorted(iterable, *, keyNone, reverseFalse) 根据 iterable 中的项返回一个新的已排序列表。具有两个可选参数,它们都必须指定为关键字参数。key 指定带有单个参数的函数,用于从 iterable 的每个元素中提取用于比较的键 (例如 keystr.lower)。 默认值为…...