背景

拆分vue路由

发表于 2023/04/20 16:00
🌺 摘要
介绍 Vue 路由按模块拆分的组织方式与工程化维护思路。

拆分vue路由

1.webpack构建的项目:

原理利用webpack批量导入函数require.context()

约定以.routes.js结尾的是每个模块的路由

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)
const files = require.context('./', false, /\.routes.js$/)
// 把每个模块的默认暴露取出来
const constantRoutes = files.keys().map((key) => files(key).default)
const createRouter = () => new Router({
  mode: 'hash',
  scrollBehavior: () => ({ y: 0 }),
  routes: constantRoutes
})

const router = createRouter()
export function resetRouter () {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // reset router
}

export default router

2.vite构建的项目

那么在vue3+vite+ts中,如何找到对应的方法呢?就可以使用 import.meta.globEage或者 import.meta.glob方法了。

import.meta.glob 为动态导入,构建时,会分离为独立的 chunk;而import.meta.globEager为直接引入。

const utilFuns: any = {};
const files = import.meta.globEager('./*.ts');
Object.keys(files).forEach((fileName) => {
    const name = fileName.replace(/\.\/|\.ts/g, '');
    utilFuns[name] = files[fileName].default;
});
export default utilFuns;
import { createRouter, createWebHashHistory,RouteRecordRaw } from "vue-router";
//createWebHistory:history路由
import {filesInf} from '../types/routerModel'
const history = createWebHashHistory()
const routes: Array<RouteRecordRaw> = [];
const files:filesInf = import.meta.glob('./*.routes.ts',{ eager: true });
Object.keys(files).forEach((fileName) => {
  routes.push(files[fileName].default) ;
});
const router = createRouter({
  history,
  routes
})
export default router
import {RouteRecordRaw } from "vue-router";
interface routeDefault{
    default:RouteRecordRaw,
    [propName:string]:unknown
  }
 export interface filesInf {
    [propName:string]:routeDefault
  }
文章发表于 2023/04/20 16:00
上一篇 双飞翼布局
下一篇 js中charAt与charCodeAt的区别