router.js 1.98 KB
/*
 * @Date: 2022-05-26 13:57:28
 * @LastEditors: hookehuyr hookehuyr@gmail.com
 * @LastEditTime: 2022-06-29 21:36:59
 * @FilePath: /tswj/src/router.js
 * @Description: 文件描述
 */
import { createRouter, createWebHashHistory } from 'vue-router';
import RootRoute from './route.js';
import asyncRoutesArr from "./mock/routes"
import generateRoutes from './utils/generateRoute'

// TAG: 路由配置表
/**
 * 把项目独有的路由配置到相应的路径,默认路由文件只放公用部分
 * 但是 vue 文件内容还是要事先准备好
 */
const modules = import.meta.globEager('@/router/routes/modules/**/*.js'); // Vite 支持使用特殊的 import.meta.glob 函数从文件系统导入多个模块
const routeModuleList = [];

Object.keys(modules).forEach((key) => {
  const mod = modules[key].default || {};
  const modList = Array.isArray(mod) ? [...mod] : [mod];
  routeModuleList.push(...modList);
});

// 创建路由实例并传递 `routes` 配置
const router = createRouter({
  history: createWebHashHistory('/index.html'),
  routes: [...RootRoute, ...routeModuleList]
});

// TAG: 动态生成路由
/**
 * generateRoute 负责把后台返回数据拼接成项目需要的路由结构,动态添加到路由表里面
 */
router.beforeEach((to, from, next) => {
  // 使用404为中转页面,避免动态路由没有渲染出来,控制台报警告问题
  if (to.path == '/404' && to.redirectedFrom != undefined) {
    // 模拟异步操作
    setTimeout(() => {
      if (!asyncRoutesArr.length) return; // 没有动态路由避免报错
      const arr = generateRoutes(asyncRoutesArr); // 在路由守卫处生成,避免有子路由时刷新白屏问题。
      arr.forEach(item => {
        router.addRoute(item) // 新增路由
      })
      // 重写被404覆盖路由信息
      next({ ...to.redirectedFrom, replace: true });
    }, 1000);
  } else {
    next()
  }
})

router.afterEach(() => {
  // console.warn(to);
  // console.warn(wx);
  // share(to)
})

export default router;