前端菜单权限方案

方案一:前端全量配置路由表 + 后端返回权限码

思路

  • 所有可能的路由都在前端 router 中静态配置好(就像你现在这样)。

  • 登录后,后端返回当前用户的菜单权限(通常是一个权限 code 列表)。

  • 前端根据权限码过滤掉无权访问的路由,生成最终的可访问菜单。

优点

  • 路由结构清晰,开发时有完整的路由提示和类型支持。

  • 不依赖后端返回路由结构,前端可独立开发和调试。

  • 性能好,减少一次菜单结构的接口解析。

缺点

  • 每次新增菜单都需要前端改代码并发版。

  • 如果菜单结构变化频繁,前端维护成本高。

方案二:后端返回菜单/路由结构,前端动态生成路由

思路

  • 登录后,后端直接返回当前用户可访问的菜单树(包含 pathcomponentmeta 等信息)。

  • 前端用 router.addRoute() 动态注册路由。

  • 菜单渲染直接用后端返回的数据。

优点

  • 菜单和权限完全由后端控制,前端无需改代码即可调整菜单结构。

  • 多端(Web、App、小程序)可共用一套菜单权限数据。

缺点

  • 前端需要做动态组件加载(import()),并处理找不到组件的情况。

  • 路由类型提示和 IDE 自动补全会缺失。

  • 如果后端返回的路由数据有误,前端可能直接挂掉。

建议

  • 如果你的系统菜单变化不频繁(比如 ERP、后台管理系统),推荐方案一: 前端全量配置路由,后端只返回权限码,前端过滤展示。 这样开发体验好,调试方便,出错率低。

  • 如果你的系统菜单变化频繁(比如 SaaS 平台,不同客户菜单差异大),推荐方案二: 后端返回菜单树,前端动态注册路由,真正做到菜单和权限后端可配。

混合方案(很多企业在用)

  • 前端维护一个路由组件映射表pathcomponent)。

  • 后端返回菜单结构(只包含 pathmeta 等),前端用映射表找到对应组件并动态注册。

  • 这样既能后端控制菜单,又能保证组件路径可控。

// 路由组件映射表
const componentMap = {'dashboard': () => import('@/views/Dashboard/index.vue'),'system/user': () => import('@/views/System/User.vue'),// ...
}// 动态注册
menus.forEach(menu => {router.addRoute('Layout', {path: menu.path,name: menu.name,component: componentMap[menu.component]})
})

方案一和方案二速度上性能比较

性能对比

对比项方案一:前端全量配置 + 权限过滤方案二:后端返回菜单/路由结构
首屏速度较快。路由表已经在打包时编译进前端代码,进入系统时只需拿到权限码做一次本地过滤即可。稍慢。登录后需要额外请求菜单数据,再根据数据动态注册路由,才能进入页面。
网络请求登录接口 + 权限接口(可合并),不需要额外的菜单结构接口。登录接口 + 菜单接口(必需),多一次网络往返。
渲染延迟几乎无延迟,过滤完成即可渲染。需要等菜单接口返回并处理完动态路由后才能渲染。
打包体积稍大(包含所有路由组件),但可配合懒加载减少首屏体积。可能稍小(只加载基础路由),但动态加载组件时会有额外延迟。

总结

  • 速度优先 → 方案一更快,因为路由表和组件都已经在前端准备好,进入系统时只做一次本地过滤。

  • 灵活性优先 → 方案二更灵活,菜单结构改动不需要前端发版,但首屏会慢一点。

为什么混合方案比方案二能提升速度那?

组件路径提前确定,避免运行时查找失败

  • 方案二:后端返回的 component 通常是字符串(如 "system/user"),前端需要在运行时用 import() 去拼接路径并加载,这个过程会触发 Webpack 的动态模块查找,范围大时会生成一个很大的动态 chunk map,解析和匹配都要时间。

  • 混合方案:前端事先维护一个 componentMapkey → import函数),直接用 componentMap[menu.component] 获取组件加载函数,跳过了运行时路径匹配,Webpack 只打包实际用到的模块,按需加载更快。

路由注册逻辑更轻量

  • 方案二:后端返回的菜单数据需要先做一轮“数据清洗 + 动态 import + 异步注册”,这一步必须等接口返回后才能开始。

  • 混合方案:后端只返回菜单结构(不含复杂组件路径解析),前端拿到数据后直接用映射表匹配组件并注册,省去了动态路径解析的耗时。

首屏渲染提前启动

  • 方案二:首屏必须等菜单接口返回 + 动态 import 完成后才能渲染主框架。

  • 混合方案:因为组件映射表在打包时就存在,首屏可以先渲染 Layout 框架,菜单接口返回后再补充路由,不会阻塞主框架渲染。

打包优化更好

  • 方案二:动态路径 import 可能导致 Webpack 打包出一个大而全的 chunk(因为它无法静态分析具体会用到哪些组件)。

  • 混合方案:映射表是静态的,Webpack 能精确分割 chunk,按需加载,减少首屏下载体积。

总结

混合方案的提速点在于:

  • 路径解析提前到编译期,减少运行时动态匹配

  • 组件按需打包,避免大 chunk

  • 首屏可并行渲染,减少等待时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98885.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring项目部署后为什么会生成 logback-spring.xml文件

以下内容为豆包生成,此处仅做记录在 Spring 项目(尤其是 Spring Boot 项目)部署后生成 logback-spring.xml 文件,通常有以下几种原因:1. 项目打包时主动包含了该文件logback-spring.xml 是 Logback 日志框架在 Spring …

如何解决pip安装报错ModuleNotFoundError: No module named ‘vaex’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘vaex’问题 摘要 在Python开发过程中,使用pip install时遇到错误是非常常见的情况。特别是在使用PyCharm等集成开发环境(IDE&#xff0…

实习总结——关于联调解决的因CRC校验导致协议交互失败的调试经验总结

1.场景还原:在我开发USB PD测试模块时,发现待测主板始终不回复Request消息,导致我的测试失败;此时我的任务就是快速定位这个协议交互失败的原因,无论是软件、硬件还是协同。2.大致的调试步骤:1.首先使用了逻…

STM32之RTC

RTC简介 实时时钟(Real Time Clock,RTC),本质是一个计数器,计数频率常为秒,专门用来记录时间。 普通定时器拿来作时钟可行吗?普通定时器无法掉电运行! RTC特性: 1,能提供时间&…

【OC】单例模式

文章目录前言概念优缺点优点缺点两种使用模式懒汉模式实现代码运行结果饿汉模式实现代码运行结果在自定义类方法时的几种常见写法总结前言 在之前我们已经学习过单例模式的有关内容,但是只是最简单的单例,无法胜任多线程或者稍微多一点的情况便无法确定…

机器学习(七)决策树-分类

一 概念1 决策节点通过条件判断而进行分支选择的节点。将样本的属性值,也就是特征值与决策节点上的值进行比较,从而判断它的流向。2 叶子节点没有子节点的节点,表示最终的决策结果。3 决策树的深度所有节点的最大层次数决策树具有一定的层次结…

IT 服务管理的新格局:从工单系统到一体化 ITSM 平台

企业 IT 部门的角色转变在过去,IT 部门更多被视为“技术支持”,主要负责设备维护和故障处理。但随着数字化转型加速,IT 已经成为业务连续性和创新的重要推动力。从客户体验到数据安全,从业务敏捷到成本控制,IT 服务管理…

创建一个Spring Boot Starter风格的Basic认证SDK

文章目录前言设计思路SDK实现步骤1. 创建SDK Maven项目(sdk目录)2. 实现配置类3. 实现认证逻辑4. 实现拦截器5. 实现自动配置6. 创建spring.factories文件使用方集成步骤1. 引入SDK依赖2. 配置Application属性3. 创建测试接口4. 测试接口访问SDK扩展功能…

mybatis处理统计sql进度丢失问题

如何处理统计sql进度丢失 SELECT sum(decimal_column) AS sum_value FROM your_table如上sql执行时没有问题,在数据库可视工具可以正常显示,但是在mybatis执行时,却出现解决办法 使用转 decimal 控制精度 SELECT CAST(SUM(decimal_column) A…

全球首款!科聪控制器获德国 TÜV 莱茵功能安全认证

近日,浙江科聪控制技术有限公司(以下简称"科聪")的安全移动机器人控制器MSC5000荣获全球权威认证机构德国莱茵TV集团(TV Rheinland)颁发的功能安全认证证书。这款控制器是全球首款通过SIL3、PLe 认证的移动机…

pureadmin的动态路由和静态路由

在 PureAdmin(基于 Vue3 的后台管理框架)中,静态路由和动态路由是实现路由管理的两种方式,主要区别在于路由的定义时机、加载方式和灵活性,具体区别如下: 1. 静态路由 定义方式:路由规则在代码中…

第3章:CPU实战

1. Linux操作系统CPU平均负载 以前我们总认为CPU使用率和CPU平均负载是一样的,负载高了就是CPU使用率提高。但是到底是什么情况呢? 1.1. CPU的平均负载 单位时间内 系统处于 可运行状态 和不可中断状态 的平均进程数,就是平均活跃进程数&a…

【Vue3】06-利用setup编写vue(1)

其它篇章: 1.【Vue3】01-创建Vue3工程 2.【Vue3】02-Vue3工程目录分析 3.【Vue3】03-编写app组件——src 4.【Vue3】04-编写vue实现一个简单效果 5.【Vue3】05-Options API和Composition API的区别 6.【Vue3】06-利用setup编写vue(1) 7.【Vue…

UDS NRC速查

目录 NRC 一、通用NRC(0x10~0x5F) 二、数据相关NRC(0x70~0x8F) 三、会话与状态NRC 注意事项 UDS中的NRC(Negative Response Code)即否定响应码,用于在诊断通信中表示服务端无法成功执行客户端请求的原因。以下是一些常用的UDS NRC码及其含义: HEX Name Description 01 …

【AI论文】多模态大型语言模型的视觉表征对齐

摘要:通过视觉指令微调训练的多模态大型语言模型(MLLMs)在各类任务中均取得了优异表现,然而在以视觉为中心的任务(如物体计数或空间推理)中,其性能仍存在局限。我们将这一差距归因于当前主流的纯…

SKywalking Agent配置+Oracle监控插件安装指南

SKywalking Agent配置Oracle监控插件安装指南前言: SkyWalking Elasticsearch8 容器化部署指南 Skywalking版本:V10.2.0 Skywalking Agent版本:V9.4.0 Skywalking Agent下载地址:Downloads | Apache SkyWalking 插件下载地址&…

ES相关问题汇总

问题一:关于【QueryBuilder对象】和【Query String语法】查询时底层运行方式和结果的差异

5. STM32 时钟系统分配

文章目录下述将以stm32f407 为例1. 时钟系统及频率分析2. 时钟配置下述将以stm32f407 为例 1. 时钟系统及频率分析 上述STM32F4时钟系统图解析入下: STM32F407 系列微控制器(基于 Cortex-M4 内核,带 FPU)的工作频率配置如下&…

《从 0 建立测试开发认知:先搞懂 “是什么”,再学 “怎么做”》

🔥个人主页:草莓熊Lotso 🎬作者简介:C研发方向学习者 📖个人专栏: 《C知识分享》《Linux 入门到实践:零基础也能懂》《数据结构与算法》《测试开发实战指南》《算法题闯关指南》 ⭐️人生格言&a…

net::ERR_EMPTY_RESPONSE

net::ERR_EMPTY_RESPONSE表现解决表现 Java后端封装一个接口,透传前端参数,请求到其他模块服务 本地开发环境联调时是没有问题,测试环境上报错 1.前端报错,F12检查,network上的请求,返回response选项中为空…