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

news2024/11/13 20:23:22

本章分析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项目的典型布局,旨在提高项目的可维护性和可扩展性
在这里插入图片描述
如碰到其他的问题 可以私下我 一起探讨学习
如果对你有所帮助还请 点赞 收藏谢谢~!
关注收藏博客 作者会持续更新…

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

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

相关文章

【计算机网络03】不花钱怎么搭建一个网络实验室

使用GNS3和虚拟机搭建网络实验室 1、安装抓包工具分析数据包2、定义和使用抓包筛选器3、安装和配置GNS34、配置路由器和VPCS5、使用WireShark捕获GNS3网络数据包6、VMware创建虚拟机7、使用思科PacketTracer 1、安装抓包工具分析数据包 官网安装wireshark:https://…

前端面试题26(vue3中响应式实现原理)

Vue 3 中响应式系统的实现主要依赖于 ES6 的 Proxy 对象,这与 Vue 2 中使用 Object.defineProperty 的方式有着本质的区别。Proxy 提供了一种更为强大且灵活的方法来拦截和定制对象的操作,例如获取、设置属性值等。下面是对 Vue 3 响应式系统实现方式的详…

鸿蒙语言基础类库:【@ohos.util.TreeSet (非线性容器TreeSet)】

非线性容器TreeSet 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 T…

PLC数据采集网关的具体使用说明-天拓四方

PLC数据采集网关通过以太网、串口等通信接口与PLC设备连接,实现数据的实时采集。网关内置数据处理模块,可以对采集到的数据进行清洗、转换和存储,以满足不同应用场景的需求。同时,PLC数据采集网关支持多种通信协议,如M…

用python生成带图片的二维码(python实例二十二)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.带图片的二维码 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读…

每日一题~abc356(对于一串连续数字 找规律,开数值桶算贡献)

添加链接描述 题意:对于给定的n,m 。计算0~n 每一个数和m & 之后,得到的数 的二进制中 1的个数的和。 一位一位的算。最多是60位。 我们只需要计算 在 1-n这些数上,有多少个数 第i位 为1. 因为是连续的自然数,每一位上1 的…

32 华三vlan案例+STP

32 华三vlan案例STP 1 开启STP 显示根桥信息 查看stp中的接口角色 查看设备的根桥ID 最小的值是根网桥 原则一 网络初始化时,网络中所有的STP设备都认为自己是“根桥”,根桥ID为自身的设备ID。通过交换BPDU,设备之间比较根桥ID,网…

品牌策划必读:9本改变游戏规则的营销经典

作为深耕品牌十余年的策划人,这些年自学啃下的书不计其数。 这里特意挑选了几本知名度不高但是却非常有用的“遗珠”优质品牌策划书籍分享出来。 如果你是一位初步了解品牌的人,这些书籍既包含了品牌理论基础,也有实用的实践指导。 这些书…

【区块链 + 智慧政务】省级一体化区块链平台 | FISCO BCOS应用案例

在加强数字政府建设的大背景下,科大讯飞广泛应用数字技术于政府管理服务,推动政府数字化、智能化运行。同时, 统筹推进业务、数据和技术的融合,提升跨地域、跨层级、跨部门和跨业务的协同管理和服务水平。 当前政务信息化建设中&…

Apache配置与应用(企业网站架构部署与优化)

本章结构 如果要修改以上文件中的内容,想要生效,需要在主配置文件中能够扫描到这个默认文件的修改: 文件在: Apache 连接保持 Apache 的访问控制 针对IP地址的限制缺陷是不可预知性,需要事先直到对方的IP才能进行基于…

VIM模式之间的切换

命令行界面下,常用的文本编辑器是 VI / VIM(VI增强版),VI 是 Linux 最通用的文本编辑器,VIM相较于VI,提供了代码高亮等功能,两者用法完全兼容; 1. 进入 VIM 工作界面 vim 文件名 2. 进入编辑模式 三种方…

ZFT9-7VE8043-Z同期脉冲发送装置100V JOSEF约瑟 柜内安装

ZFT9(PIG)同期脉冲发送装置 系列型号 ZFT9(PIG) 7VE8033同期脉冲发送装置; ZFT9(PIG) 7VE8043同期脉冲发送装置; ZFT9 7VE8033同期脉冲发送装置; ZFT9 7VE8043同期脉冲发送装置; 用途: ZFT9同期脉冲发送装置用于船舶的三相系统,根据发电机和电力系…

Ceph资源池pool管理

目录 1.Ceph Pool管理命令 1.1 创建 Pool 资源池 1.2 查看集群 Pool 信息 1.3 查看资源池副本、PG 和 PGP的数量 1.4 修改 Pool 副本、PG 和 PGP数量 1.5 删除 Pool 资源池 2.一个pool资源池应该包含多少PG数? 完成了 Ceph 集群的部署,但是我们如…

从零开学C++:类和对象(上)

引言:在学习了C的入门级知识之后,现在就让我们一起进入类和对象的学习吧,该知识点我将分为上,中,下三个部分对其进行讲解。 更多有关C语言和数据结构的知识详解可前往个人主页:计信猫 目录 一,类…

【RHCE】NFS 实验

主服务器 下载nfs-utils软件包: 1.如果停⽌该服务,启动并启⽤该服务: systemctl enable - now rpcbind 2.要启动 NFS 服务器,并使其在引导时⾃动启动:systemctl enable - now nfs- server 3.配置防火墙,开…

RAG应用的典型工作流程

下面是RAG应用的典型工作流程: 具体步骤如下: 输入: 是指LLM系统需要回答的问题。如果不使用RAG,问题直接由LLM回答。 索引: 使用RAG时,会先将相关文档分块,为这些块生成嵌入向量,并…

prometheus回顾(2)--如何使用Grafana对接Prometheus数据源的详细过程,清晰易懂。

文章目录 Grafana简介什么是GrafanaGrafana 能做什么?什么时候我们会用到Grafana?Prometheus有图形化展示,为什么我们还要用Grafana? 环境操作步骤一、Grafana安装二、Grafana数据源Prometheus添加三、Grafana添加数据仪表盘补充、如何查找仪表盘 Graf…

力扣题解(设计跳表)

1206.设计跳表 已解答 不使用任何库函数,设计一个 跳表 。 跳表 是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。 …

09.C2W4.Word Embeddings with Neural Networks

往期文章请点这里 目录 OverviewBasic Word RepresentationsIntegersOne-hot vectors Word EmbeddingsMeaning as vectorsWord embedding vectors Word embedding processWord Embedding MethodsBasic word embedding methodsAdvanced word embedding methods Continuous Bag-…

汉初三杰韩信,是不是颍川人

再重复一次,此韩信非彼韩信,说的是汉初三杰淮阴侯韩信,不是韩王信。 他俩的共同之处还真多,同名同姓,都被封王,八大异姓王韩姓占了两位。而且,结局也一样,都因反判罪被朝廷处死。这…