news 2026/4/20 10:17:39

Vue Router 越写越乱,如何架构设计?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue Router 越写越乱,如何架构设计?

网罗开发(小红书、快手、视频号同名)

大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 前言
    • 为什么 Vue Router 最容易失控?
      • 路由文件不断膨胀
      • beforeEach 成了“万能垃圾桶”
      • 页面结构、权限、布局全部耦合
    • 路由架构设计的核心原则
      • 原则一:路由只负责“路径映射”
      • 原则二:业务模块必须“路由模块化”
      • 原则三:meta 是“声明”,不是“执行”
    • 推荐的路由目录结构(非常关键)
      • 核心思路
    • 路由模块拆分示例
      • modules/user.ts
    • 统一的路由守卫架构
      • index.ts
      • guard/auth.ts
      • guard/title.ts
      • guard/index.ts
    • layout + route 的解耦设计
    • 权限设计的正确姿势
      • meta 只做声明
      • 权限逻辑集中处理
    • 路由与页面生命周期管理
    • 关于 DeepLink / URL 的设计建议
    • 总结

前言

如果你接手过中大型 Vue 项目,大概率都会遇到这样一个阶段:

路由文件 1000 行起步
嵌套路由一层套一层
权限、布局、登录判断全写在 beforeEach
新同学不敢动,老同学不想动

然后某一天,你发现自己也开始往路由里“随手加一段逻辑”,心里还安慰自己一句:

“先这样吧,后面再重构。”

这篇文章就来系统聊一件事:
Vue Router 到底应该怎么“架构”,而不是怎么“凑合着用”。

为什么 Vue Router 最容易失控?

先说结论一句话版:

路由一乱,基本不是 Router 的锅,而是“职责没拆清楚”。

我们先看看常见的“失控现场”。

路由文件不断膨胀

最典型的结构:

// router/index.jsconstroutes=[{path:'/',component:Layout,children:[{path:'/user',component:User,meta:{requiresAuth:true}},{path:'/order',component:Order,meta:{requiresAuth:true,role:'admin'}}]}]

一开始还好,后面慢慢变成:

  • 业务模块全堆在一个文件
  • meta 越写越多
  • 嵌套层级越来越深

最后谁都不敢动。

beforeEach 成了“万能垃圾桶”

router.beforeEach((to,from,next)=>{if(!isLogin()){next('/login')}if(to.meta.role==='admin'&&!isAdmin()){next('/403')}if(to.meta.title){document.title=to.meta.title}// 再加点埋点、再加点统计……})

问题不在代码本身,而在于:

所有“页面级逻辑”都往这里塞。

时间一长,这里就变成了不可维护区域

页面结构、权限、布局全部耦合

最典型的问题是:

  • 一个路由 = 一个页面 + 一个布局 + 一套权限规则
  • 需求一变,全链路都要改

这在多人协作时,几乎是灾难。

路由架构设计的核心原则

在讲方案前,先给你 3 条非常重要的原则:

原则一:路由只负责“路径映射”

路由的职责是:URL → 页面组件

不是:

  • 权限系统
  • 业务逻辑
  • 页面状态管理

原则二:业务模块必须“路由模块化”

不要再把所有路由写在一个文件里。

原则三:meta 是“声明”,不是“执行”

meta 只用来描述页面特性,不直接写逻辑。

推荐的路由目录结构(非常关键)

这是一个在中大型项目中非常稳的结构:

router/ ├── index.ts ├── modules/ │ ├── user.ts │ ├── order.ts │ ├── dashboard.ts │ └── auth.ts ├── guard/ │ ├── auth.ts │ ├── permission.ts │ └── title.ts └── types.ts

核心思路

  • modules:只管“有哪些路由”
  • guard:只管“进入路由前做什么”
  • index:做组装,不写业务

路由模块拆分示例

modules/user.ts

importtype{RouteRecordRaw}from'vue-router'exportconstuserRoutes:RouteRecordRaw[]=[{path:'/user',component:()=>import('@/layouts/MainLayout.vue'),children:[{path:'',name:'UserList',component:()=>import('@/views/user/index.vue'),meta:{requiresAuth:true,title:'用户列表'}}]}]

特点:

  • 只描述路径、组件、meta
  • 不写权限判断逻辑

统一的路由守卫架构

index.ts

import{createRouter,createWebHistory}from'vue-router'import{userRoutes}from'./modules/user'import{setupRouterGuard}from'./guard'constrouter=createRouter({history:createWebHistory(),routes:[...userRoutes]})setupRouterGuard(router)exportdefaultrouter

guard/auth.ts

exportfunctionauthGuard(to,from,next){if(to.meta.requiresAuth&&!isLogin()){next('/login')}else{next()}}

guard/title.ts

exportfunctiontitleGuard(to){if(to.meta.title){document.title=to.meta.title}}

guard/index.ts

exportfunctionsetupRouterGuard(router){router.beforeEach(authGuard)router.afterEach(titleGuard)}

这样做的好处是:

  • 每个 guard 单一职责
  • 新需求只加 guard,不改旧逻辑
  • beforeEach 不再是“垃圾场”

layout + route 的解耦设计

推荐用layout 作为中间层

/views /layouts ├── MainLayout.vue ├── EmptyLayout.vue

路由里只负责选 layout:

{path:'/login',component:()=>import('@/layouts/EmptyLayout.vue'),children:[...]}

好处:

  • 页面不感知布局
  • 布局可复用
  • 权限和 UI 解耦

权限设计的正确姿势

meta 只做声明

meta:{requiresAuth:true,roles:['admin']}

权限逻辑集中处理

functionpermissionGuard(to,from,next){const{roles}=to.metaif(roles&&!hasRole(roles)){next('/403')}else{next()}}

不要在页面里写权限判断。

路由与页面生命周期管理

合理使用:

  • onBeforeRouteEnter
  • onBeforeRouteLeave

而不是所有状态都放 Vuex / Pinia。

onBeforeRouteLeave(()=>{clearTempState()})

关于 DeepLink / URL 的设计建议

  • URL 代表页面状态
  • 参数必须可恢复
  • 不依赖内存状态
/query?id=123

这样页面才能:

  • 刷新不丢状态
  • 分享可复现

总结

如果你记住一件事就够了:

路由不是业务逻辑的承载体,而是应用的“骨架”。

一旦 Router 乱了:

  • 新功能变慢
  • Bug 变多
  • 新人上手成本暴涨

而一个清晰的路由架构,带来的好处是长期的工程红利

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 9:46:35

用自然语言画图是什么体验?Excalidraw AI功能亲测报告

用自然语言画图是什么体验?Excalidraw AI功能亲测报告 在一次远程架构评审会议上,团队正讨论一个微服务系统的交互流程。以往这种场景下,总得有人花十几分钟在白板上拖拽框框、连线标注,边画还边解释:“这个是订单服务…

作者头像 李华
网站建设 2026/4/18 15:21:29

LangChain核心逻辑详解:数据流动与无限处理问题解决方案,建议收藏

本文详解LangChain框架核心逻辑,阐明数据在加载、处理、存储、检索和生成四环节的流动过程。针对RAG和Agent场景中常见的无限处理问题,提供实用的紧急处理和预防方法,包括设置超时限制、资源约束和循环检测等。强调LangChain不是黑盒&#xf…

作者头像 李华
网站建设 2026/4/18 12:07:17

AgentScope深入学习-Pipeline与消息

协调的艺术:Pipeline 与消息系统核心解析 请关注公众号【碳硅化合物AI】 摘要 多智能体系统的核心是协调。AgentScope 通过 Pipeline 和消息系统实现了优雅的多智能体编排。本文将深入分析 MsgHub、Pipeline 模式以及消息系统的设计。你会发现,消息&a…

作者头像 李华
网站建设 2026/4/17 8:17:35

18、电脑打印、扫描与上网全攻略

电脑打印、扫描与上网全攻略 1. 打印难题解决与技巧 1.1 特殊情况打印方法 当网页只有邮件选项而无打印选项时,可将页面邮件发送给自己,依据邮件程序,以邮件形式打印或许效果更佳。若只想打印网页中的几段内容,用鼠标选中目标部分,在 Internet Explorer 的工具菜单中选择…

作者头像 李华
网站建设 2026/4/16 18:28:45

19、微软 Edge 浏览器:高效上网的利器

微软 Edge 浏览器:高效上网的利器 在当今数字化时代,浏览器是我们访问互联网的重要工具。微软 Edge 浏览器以其快速的浏览速度和简洁的界面,成为了很多用户的选择。本文将详细介绍微软 Edge 浏览器的使用方法、功能特点以及一些实用技巧。 一、微软 Edge 浏览器简介 微软…

作者头像 李华
网站建设 2026/4/14 17:51:24

23、深入探索Windows控制面板:个性化与功能定制全攻略

深入探索Windows控制面板:个性化与功能定制全攻略 1. 控制面板的核心功能区域 Windows系统提供了丰富的设置选项,以满足不同用户的需求。其中,控制面板涵盖了几个关键的功能区域: - 轻松访问 :该设置旨在让视力和听力有障碍的用户更方便地操作Windows系统,提升系统的…

作者头像 李华