惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
The Register - Security
The Register - Security
D
Docker
The Cloudflare Blog
A
About on SuperTechFans
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
月光博客
月光博客
B
Blog RSS Feed
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
B
Blog
IT之家
IT之家
美团技术团队
Engineering at Meta
Engineering at Meta
C
Check Point Blog
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
G
Google Developers Blog
MongoDB | Blog
MongoDB | Blog
Microsoft Azure Blog
Microsoft Azure Blog
S
SegmentFault 最新的问题
V
V2EX
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Apple Machine Learning Research
Apple Machine Learning Research
U
Unit 42
H
Help Net Security
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
PCI Perspectives
PCI Perspectives
J
Java Code Geeks
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
M
MIT News - Artificial intelligence
腾讯CDC
A
Arctic Wolf
C
CERT Recently Published Vulnerability Notes
量子位
C
CXSECURITY Database RSS Feed - CXSecurity.com
Latest news
Latest news
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Hacker News
The Hacker News
有赞技术团队
有赞技术团队
Schneier on Security
Schneier on Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

吐槽大王部落格

在 X (Twitter) 上找 IT 工作靠谱吗? 如何在上游分支被反复重写时优雅地 Rebase 我的 2025 我在经营自己的社交帐号,但可能「玩脱了」 我依然没有学会怎么在网上提出技术问题 我是怎么差点被恶意 npm 包攻击的 不用 eas-cli 编译 React Native (Expo) 应用的 Android 版本 【更正版】简单实现类型安全的、能触发 CustomEvent 的 EventTarget 在 IE11 使用 CSS Grid 实现多列卡片列表布局 自建云游戏服务的尝试(2024 更新) 在 Termux 编译和使用 bwm-ng(需要 root) 如何在已有的 Vue CLI 项目使用 esbuild 我的 2021 npm、镜像源与 package-lock.json 新的桌面工作站:HP Z2 G5 Tower 我的 2020 在 Intel 版 MacBook Pro 以 EFI 的形式安装 Windows 10 为什么大家都在安利这一样东西? 新的家庭服务器:MicroServer Gen10 我的 2019 在树莓派(Raspbian)上安装最新稳定版 nginx 驾照 宿舍用小型 UPS 电源与新台灯 拆解我爸 2010 年装的廉价 PC 我的 2018 2018 厦门面基记 我(曾经)设想过的外置智能大脑 没用的无懈可击 tcdw 与 ECMAScript 评论框 如何提出计算机相关问题(更新) 提升古诗词背诵及脸部记忆能力 一袋凉皮引发的『血案』 我写的一言轮播脚本(2018 更新) 土豆评论 我的 2017 我与 Linux 把 WSL 的发行版换成 Debian 时撞的坑 为什么公共 block 列表有时是个很糟的主意 故事:试图不关闭 SIP 在 macOS Sierra 上使用 proxychains-ng Xperia XZ Premium 在 DOSBox 使用 MIDI (MT-32、GM) 音源 昔日的折腾党 Android 手机间的文件传输 胡扯:为什么需要 https 黑历史:在 Flash 里手撕 HTML 与 JSON 从你的 Typecho 博客优雅的导出 Markdown 文件 如何维修电脑 Orange Pi One:百元家庭服务器的软件部分 关于香橙派 Orange Pi One 的碎碎念 在 FC 游戏实现内购 友情链接清理 夏天来了 如何给 tcdw 套上女装 选择 vps-hosting.ca 的廉价 VPS 是个糟糕的主意 Disqus + PJAX 后的小错误修复 域名是建站第一要素 网站搬家喽 重低音 Google Adsense FIR Filter Fader 移植 CMS 程序模板的一般方法 切换到 Ghost 关于以前用的昵称的正式说明 通过甲 JS 加载乙 JS 避免模板烂大街的最佳方法就是自己写一个 强行修改 Android 桌面小部件大小的方法,需 root tcdw 那糟糕的宾馆之旅 用 Flash 实现读取 QQ 空间背景音乐列表 屠城 QZone 播放器 0.1 正式版(求围观)
我对 Vue Router「动态路由」的一点暴论
tcdw · 2025-03-13 · via 吐槽大王部落格

本文是对我之前在 X (Twitter) 平台发表的 推文 的整合。

每当我接触到一些既有的使用 Vue 开发的业务系统时,总是能看到一种被称为「动态路由」的实现方式。

如果你只知道 React Router 或 Next.js 的「动态路由」,嗯,首先我们说的不是一个东西。Vue Router 这边的「动态路由」指的是:服务端存储一份完整的 Vue Router 所需数据结构,前端在初次加载页面时必须先从服务端获取这个结构,然后遍历结构并执行 router.addRoute() 才能继续工作。根据用户角色不同,返回的路由列表也会有所差异。

对于这种实现方式,我一直难以理解将完整路由数据结构放在服务端维护的必要性,尤其是对于那些操作 JSON 不太方便的后端编程语言来说(说的就是你,Java)。当我向早期参与这些项目开发的人询问原因时,他们往往只能给出这两点理由:

  • 需要根据用户角色展示其可访问的页面
  • 可以根据领导要求临时开关某些功能

然而,我觉得第一点理由似乎站不住脚。前端完全可以通过简单地获取用户角色权限字符串来实现相同功能(甚至他们使用的框架,比如若依,就已经内置了这种功能)。同时,这种方式也无法真正阻止「高级用户」了解系统中所有页面的存在,因为这些业务页面通常需要视情况使用 await import()、Vite 的 import.meta.glob、Webpack (Vue CLI) 的 require.context 或其它打包器的类似 API 进行批量导入,查看源代码进行简单查找就能发现所有页面和它们的文件名。

至于第二点关于能够随时关闭某个功能(页面)的需求,也找不到必须由后端传输整个路由表数据结构的合理理由。在我们从零开发的一套业务系统中,采用的方案是:后端维护一个简化的树形结构,仅记录每个路由的技术名称、所需权限和启用状态,而前端则在第一次加载页面时获取该结构,将其转换为 Map,之后由路由守卫来检查 Map 中的项目,判断页面是否可以访问。

以我浅薄的经历来看,「动态路由」真的是一种毫无优点、但是缺点却一大堆的方案。这种做法往往会导致各种混乱的代码出现,成为开发维护的噩梦(前司一些前端调试「动态路由」就要浪费两天时间)。当然,这些问题或许还有一些技术方面外的考量吧,这里我还是不要过多评价了。