前言

今天来看看本项目的router
我们都知道js版本下的router写法就是:创建routes数组,该数组包含多个路由信息对象

const routes = [{
		path: '/IndexView',
		component: IndexView,
		children: [{
				path: '/',
				component: HomeView,
				meta: {
					requireToken: true
				}
			},
		]
}]

而我们又知道ts中创建一个对象,需要先明确它的类型,也就是说我们要创建routes就要先去创建一个符合上面代码的类型,用来创建routes,但是这件事不需要我们亲自去做,vue-router中已经内置了用于约束routes的类型,我们只需要引入进来用就好了,

js版本下的vue3+router写法

在这里插入图片描述

ts版本下的vue3+router写法

在这里插入图片描述

自己写的ts版本vue3+router写法


import { createRouter, createWebHashHistory,type RouteRecordRaw } from 'vue-router'

import Home from "@/views/home/Index.vue"

const routes:Array<RouteRecordRaw> = [
    {
        path:'/home',
        component:Home,
        // redirect:'noredirect',
        alias: '/',  // 设置别名,/ 和 /home 都访问同一个组件
        name:'Home',
        meta:{
            isLand:true,
            icon:'#ccc'
        }

    }
]

const router = createRouter({
    history:createWebHashHistory(),
    routes
})
export default router

看起来很简单

目标项目的router写法

在这里插入图片描述
看起来很多,一个个解析

基本引入代码

在这里插入图片描述

读取./constantModules文件夹下的所有ts文件,返回一个数组(元素为router实例)

webpack写法 CommonJS 的 require

在这里插入图片描述

vite写法 ES 模块

在这里插入图片描述
在这里插入图片描述

constantModules下文件

在这里插入图片描述

创建一个以RouteRecordRaw(vue-router@4中定义路由配置对象的类型)为泛型约束的空数组

在这里插入图片描述

扫描 constantModules目录下所有的 .ts文件

排除 index.ts文件(通常是导出文件)
将每个文件中的默认导出(路由配置数组)合并到一个大数组中
最终得到所有路由配置的集合

commonJs写法

在这里插入图片描述

es 写法

在这里插入图片描述

这么做的优点

在这里插入图片描述
仅是自动化这个优点就已经非常的好了,能够根据创建的文件来自动加载新的路由,不需要自己在单个文件中去重复修改添加代码,导致一个router文件中的代码量过大。
这里展示一个项目的router代码,200行routes代码,这看起来会让人很头疼,管理路由的时候也会很不方便。

在这里插入图片描述
所以将这种对象式的路由管理转变为文件式的路由管理是很好的,不仅节省了代码,而且可以通过路由文件直截了当的管理我们的路由,也会方便团队协作的。在这里插入图片描述

自动批量加载和合并权限相关的路由配置模块

commonJs模块管理写法在这里插入图片描述
es模块管理写法
在这里插入图片描述

创建constantRoutes(以Array为泛型约束)

constantRoutes由重定向路由(/redirect)、默认路由(/)和前面使用模块化加载获取到的constantModules模块下的路由数组的展开后元素组成。在这里插入图片描述

创建asyncRoutes(以Array为泛型约束)

constantRoutes由前面使用模块化加载获取到的constantModules模块下的路由数组的展开后元素组成。在这里插入图片描述

使用createRouter创建router

使用Hash 模式作为历史模式
在这里插入图片描述

在这里插入图片描述

创建并暴露resetRouter方法

在这里插入图片描述

结尾

很显然这里我们发现创建asyncRoutes并未在本文件中被使用,而是在store/modules/permission/actions.ts中被使用了

使用ActionTree和Actions的交叉作为泛型约束创建对象,… …
在这里插入图片描述
在这里插入图片描述

router创建并暴露后在main.ts中被使用

在这里插入图片描述
在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐