前端菜单权限几种方案的使用及对比

 更新时间:2025年09月25日 09:56:53   作者:dreams_dream  
在当今的Web应用开发中,权限控制是一个不可或缺的部分,这篇文章主要介绍了前端菜单权限两种方案的使用及对比,文中通过代码介绍的非常详细,需要的朋友可以参考下

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

思路

  • 所有可能的路由都在前端 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

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

到此这篇关于前端菜单权限几种方案的使用及对比的文章就介绍到这了,更多相关前端菜单权限内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JS 如果改变span标签的是否隐藏属性

    JS 如果改变span标签的是否隐藏属性

    JS 如果改变span标签的是否隐藏属性,大家根据需要选择使用。
    2011-10-10
  • JS倒计时实例_天时分秒

    JS倒计时实例_天时分秒

    下面小编就为大家带来一篇JS倒计时实例_天时分秒。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 通过网页查看JS源码中汉字显示乱码的解决方法

    通过网页查看JS源码中汉字显示乱码的解决方法

    这篇文章给大家主要介绍了通过网页查看JS源码的时候,发现汉字显示是乱码的解决方法,文中通过图文详解的介绍了解决的步骤,详细会对大家很有帮助,有需要的朋友们下面来一起看看吧。
    2016-10-10
  • 图片onload事件触发问题解决方法

    图片onload事件触发问题解决方法

    当页面上存在一个图片元素时如:<img src='xxxx' alt="" />,页面加载中ie7、8跟chrome下图片的onload事件非常奇怪,有后完全不触发,有时候触发后进行改变某些元素的操作,操作结果无效。
    2011-07-07
  • 原生JavaScript轮播图实现方法

    原生JavaScript轮播图实现方法

    这篇文章主要为大家详细介绍了原生JavaScript轮播图实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • ajaxfileupload.js实现上传文件功能

    ajaxfileupload.js实现上传文件功能

    这篇文章主要为大家详细介绍了ajaxfileupload.js实现上传文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • JavaScript实现点击复制功能具体代码(JS访问剪贴板相关)

    JavaScript实现点击复制功能具体代码(JS访问剪贴板相关)

    这篇文章主要给大家介绍了关于JavaScript实现点击复制功能(JS访问剪贴板相关)的相关资料,复制功能指的是将一个文本或者图片等资源从一个位置通过复制的方式再次拷贝到另一个位置,需要的朋友可以参考下
    2023-10-10
  • 探究JavaScript原型数据共享与方法共享实现

    探究JavaScript原型数据共享与方法共享实现

    这篇文章主要介绍了探究JavaScript原型数据共享与方法共享实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • JavaScript高级程序设计 阅读笔记(十七) js事件

    JavaScript高级程序设计 阅读笔记(十七) js事件

    IE中是冒泡型事件,即从最特定的事件目标到最不特定的事件目标
    2012-08-08
  • 前端JavaScript获取本地文件目录内容的两种实现方案

    前端JavaScript获取本地文件目录内容的两种实现方案

    由于浏览器的沙箱安全机制,前端 JavaScript 无法直接访问本地文件系统,必须通过用户主动授权(如选择目录操作)才能获取文件目录内容,所以本文详细介绍两种方案的实现流程、代码示例及适用场景,需要的朋友可以参考下
    2025-08-08

最新评论