Life and freedom Ge Lin ——— Draw by Razzh

动态路由的实现方式

Nov 17 · 4 min

#背景

今天看了公司中后台项目中动态路由的实现,基于 AntAdmin 模版。发现它跟 ElementAdmin 的实现方式大不相同,于是打算记录一下两大主流 Vue 后台框架的动态路由实现的差异。

#ElementAdmin 实现

将本地 router/index.js 存到服务端,然后返回数据。

数据可以是由后端处理形成树形结构的 router 表,也可以是返回带 pid 的那种格式让前端处理数据形成 router 表:

const router = [
  {
    id: 2,
    pid: 0,
    path: '/user',
    icon: "user.png"
    name: 'User',
    title: '用户管理',
    components: '/user'
  },
  {
    id: 3,
    pid: 2,
    path: 'info',
    name: 'UserInfo',
    title: '用户信息',
    components: '/user/info'
  }
  ...
]

之后拼装成 Vue-Router 约定的格式,你可以在这个仓库中看到如何转换

最终的格式就像这样:

const router = [
  {
    name: 'User',
    path: 'user',
    component: '@/pages/user',
    meta: {
      title: '用户管理',
      icon: 'user.png',
    },
    children: [...],
  }
  ...
]

#AntAdmin 实现

本地存下完整的 router 信息,服务端也返回路由信息,但服务端返回的信息不包含 component 字段,类似这样:

const serviceRouter = [
  {
    user: {
    path: '/user',
    name: 'User',
    title: '用户管理',
    meta: {
      title: "用户管理",
      icon: 'user.png',
    },
    component: () => import('@/pages/user'),
    children: [...]
  },
  }'
  ...
]

服务端路由需要和本地 routerMap 做对比:

function parseRouter(serviceRouter, routerMap) {
  let finalRouter = {}
  // serviceRouter.rotuer 代表 本地 routerMap 的键名
  finalRouter = routerMap[serviceRouter.rotuer]
}

详细的代码在这里

为什么要费事在本地存一个 routerMap?直接像 ElementAdmin 一样都存在服务端不香?

  • 如果新增一个页面,那么需要提交 components 字段,我们在网页输入页面的路径,是很有可能输入出错的,体验是非常不好的,本地 routerMap 给我们提供在了编译器(VsCode 编写路径的体验。

  • 想要删除一个页面,可以不需要在配置路由删除,可以直接在 map 中注释掉。那么路由在做 parseRouter 的时候,routerMap 中就没有对应的模块就无法映射,所以这个页面就不会出现。

  • 大型项目中,想要查找一个页面,但由于模块多,这时找页面是非常麻烦的,通过检索 routerMap ,我们可以得到这个页面的 pathname 等信息,方便我们在浏览器中输入 path 访问页面等。

浙ICP备2024129591号-1
春秋(Live) - 张敬轩
--:-- / --:--
  1. 1春秋(Live)张敬轩
  2. 2不吐不快(live)张敬轩
  3. 3男孩最痛(live)张敬轩
  4. 4粤语残片(live)陈奕迅
  5. 5几分之几(live)卢广仲
  6. 6地球很危险古巨基
  7. 7樱花树下(live)张敬轩

春秋 (Live) - 张敬轩 (Hins Cheung)

词:林夕

曲:Edmond Tsang

那夜谁将酒喝掉

因此我讲得多了

然后你摇着我手拒绝我

动人像友情深了

我没权终止见面

只因你友善依然

仍用接近甜蜜那种字眼通电

没人应该 怨地怨天

得到这结局

难道怪罪神没有更伪善的祝福

我没有为你伤春悲秋不配有憾事

你没有共我踏过万里

不够剧情延续故事

头发未染霜 着凉亦错在我幼稚

应快活像个天使

有没有运气再扮弱者 玩失意

有没有道理为你落发

必须得到世人同意

心灰得极可耻 心伤得无新意

那一线眼泪 欠大志

爱若能堪称伟大 再难挨照样开怀

如令你发现为你而活到失败

令人不安 我品性坏

我没有为你伤春悲秋不配有憾事

你没有共我踏过万里

不够剧情延续故事

头发未染霜 着凉亦错在我幼稚

应快活像个天使

有没有运气再扮弱者玩失意

有没有道理为你落发

必须得到世人同意

心灰得极可耻 心伤得无新意

那一线眼泪 欠大志 太没意思

若自觉这叫痛苦未免过份容易

我没有被你改写一生怎配有心事

我没有被你害过恨过

写成情史 变废纸

春秋只转载要事

如果爱你欠意义

这眼泪 无从安置

我没有运气放大自私的失意

更没有道理在这日

你得到真爱制造恨意

想心酸 还可以 想心底 留根刺

至少要见面上万次