路由扁平化是将多层嵌套路由展开为一维数组,每项含完整路径和元信息,用于加速匹配、权限校验等;需递归拼接path并继承字段,典型实现用flatMap,支持O(1)查找与动态注册。

路由扁平化,就是把原本多层嵌套的路由配置(比如有 children 的父子结构),一次性展开成一个纯一维数组,每项都带完整路径和可直接匹配的元信息。它不是为了视觉展示,而是为匹配、权限校验、动态注册等逻辑提供高效遍历基础。
为什么必须扁平化?
嵌套结构在运行时匹配路径很慢:每次访问 /user/profile,都要逐级进入 children 数组递归查找,时间复杂度高;权限过滤、菜单生成、缓存策略也难以统一处理。扁平后,所有路由记录变成键值对或数组项,用 find 或哈希表 O(1) 就能定位。
源码中典型的扁平化实现方式
Vue Router 内部的 createMatcher 会做这件事。实际项目中常用递归 + flatMap 实现:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 从根路由开始遍历,每遇到一个含
children的路由项,就把它自身和所有子项(递归展开)一起合并进结果 - 关键点是保留原始
path的拼接逻辑:子路由的path要基于父级完整路径计算,例如父级path: '/user',子项path: 'profile'→ 合并后为'/user/profile' - 同时继承或合并
meta、name、component等字段,确保扁平后每条记录仍具备独立渲染能力
一个精简可用的工具函数示例
这是生产环境常见写法,支持无限嵌套:
function flattenRoutes(routes, basePath = '') {<br> return routes.flatMap(route => {<br> const fullPath = basePath === '' ? route.path : `${basePath}${route.path.startsWith('/') ? '' : '/'}${route.path}`;<br> const flatRoute = { ...route, path: fullPath };<br> return [flatRoute, ...(route.children || []).flatMap(child => flattenRoutes([child], fullPath))];<br> });<br>}
调用 flattenRoutes(asyncRoutes.children) 即可得到全部一级路由记录,后续匹配、过滤、注册都基于这个数组操作,无需再关心层级关系。
扁平化后的典型用途
-
路由匹配加速:将扁平数组转为对象映射
{ '/home': record, '/user/profile': record },直接map[location.pathname]查找 -
权限控制:后台返回的权限码列表,可直接与扁平数组中每项的
meta.permission对比筛选 -
动态 addRoute:Vue Router 的
addRoute只接受单条记录,扁平数组正好一一对应 -
菜单生成:左侧菜单只需显示
meta.showInMenu === true的扁平项,不用递归渲染树


















