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