面向企业级应用的React路由管理体系:react-router-mannge实践
当今复杂的企业级前端应用开发中,尤其是中后台应用中,路由管理已不再是简单的页面切换,而是演变为一套完整的状态管理、权限控制、导航构建和用户体验优化的综合解决方案。react-router-manage 应运而生,它在 react-router v6 的基础上构建了一个更高维度的路由管理生态,为开发者提供了一种优雅而高效的前端架构范式。
该库在网易云商多个项目中已稳定运行4年之久,在2年前也把它开源出来,但没有做过推广。但是两年过去了,react-router社区还是没有一套完整的解决方案,反而在react-router v7中自己演变成了一个和remix高度融合的一个框架项目,不由的想,这已经不是我想要的路由,于是,我想和和大家一起共建react-router生态型路由
突破传统路由管理的局限
传统的React应用路由管理面临多重挑战:分散式的路由配置导致维护困难;权限与路由耦合度高;动态路由管理复杂;缺乏统一的路由守卫机制。这些问题在大型应用中尤为突出,严重影响了开发效率和代码质量,相信大家用了我这个库,开发效率一定能有很大的提升。详细的使用文档可参考 reac-router-manage使用文档或者 GitHub
react-router-manage 通过一种集中式声明式的配置方式,彻底颠覆了传统路由管理的思维模式,先来看如下示例 codesandbox
import React from "react";
import { MRouter, defineRouterConfig, useRouter } from "react-router-manage";
import "./styles.css";
const Users = () => {
const { currentRoute } = useRouter();
return <div>Users - {currentRoute.title}</div>;
};
const Profile = () => {
const { currentRoute } = useRouter();
return <div>Profile - {currentRoute.title}</div>;
};
const routerConfig = defineRouterConfig({
basename: "/",
// 配置层级导航
routes: [
{
path: "/",
redirect: "/user",
name: "根节点",
items: [
{
name: "user", // 每个路由对应一个全局唯一的name
path: "user", // 路径会自动在内部转换为 /user, 由于这里没有配置component,进入 /user 会重定向到 /user/list
title: "用户中心", // 路由名字
items: [
// items用于配置具有层级结构的导航,例如面包屑导航,
{
name: "userList",
path: "list", // 路径会自动在内部转换为 /user/list
component: Users,
title: "用户列表",
},
{
name: "profile",
path: "profile", // 路径会自动在内部转换为 /user/list
component: Profile,
title: "个人中心",
},
],
},
],
},
],
});
function App() {
return (
<MRouter routerConfig={routerConfig}>
{(children) => <Layout>{children}</Layout>}
</MRouter>
);
}
function Layout({ children }) {
const { routesMap, navigate } = useRouter();
const navRoute = routesMap.user;
return (
<div>
<div className="nav">
导航
<span>
{navRoute.items.map((route) => {
return (
<button
onClick={() => navigate(route.path)}
style={{ marginLeft: 20 }}
>
去{route.title}
</button>
);
})}
</span>
</div>
<div className="content">{children}</div>
</div>
);
}
export default App;
安装
npm install react-router-manage
核心优势:超越简单的路由切换
1. 声明式配置与中央管理
告别以往零散和嵌套的路由定义方式,react-router-manage 采用集中声明式配置,通过单一数据源的方式实现路由的全局管理,大幅提升了路由系统的可维护性和可扩展性。
自动解析获取当前路由参数
import React from "react";
import { useRouter } from "react-router-manage";
cconst User = () => {
// 若url为 /user/profile?id=9527
const {query, params} = useRouter();
// 这里query.id为9527
return <div><{query.id}</div>;
};
export default UserList
2.便捷式的路由导航
路由跳转不再需要知道具体pathname
import React from "react";
import { useRouter } from "react-router-manage";
cconst UserList = () => {
const {routesMap, naviagete} = useRouter();
const onClick = () => {
// 所有路由的配置都会放到routesMap对象里
navigate(routesMap.profile.pathname)
}
return <div><button>跳转我的个人中心</button></div>;
};
export default UserList
快捷拿到子级路由
例如我要渲染 /user下的自己路由菜单,点击跳转到对应的路由
import React from "react";
import { useRouter } from "react-router-manage";
cconst UserCenter = () => {
const {routesMap, navigate} = useRouter();
// 拿到 /user下的 /user/profile 和/user/list
const items = routesMap.user.items;
return <div>{
items.map(item => {
return <button onClick={() => navigate(item.pathname)}>跳转到{item.name}</button>
})
}</div>;
};
export default UserCenter
便携式参数传递
navigate对象支持传路由参数query, params,navigate: (to: string, {query: Record<string, any>; params: Record<string, any>; state: any}) => void}
,如下示例
import React from "react";
import { useRouter } from "react-router-manage";
cconst UserList = () => {
const {routesMap, naviagete} = useRouter();
const onClick = () => {
// 所有路由的配置都会放到routesMap对象里
navigate(routesMap.profile.pathname, {
query: {id: 9527} // 会自动拼成 /user/profile?id=9527
})
}
return <div><button>跳转用户A的个人中心</button></div>;
};
export default UserList
3. 动态路由操作的优雅解决方案
在复杂应用的微前端架构或权限变化场景中,动态调整路由结构是一项常见需求。react-router-manage 提供了三个强大的 hooks, useAddRoutes
,useUpdateRoutes
, useRemoveRoutes
。你可以很简单的动态操作路由
// 添加路由
const addRoutes = useAddRoutes();
// 动态更新路由配置
const updateRoutes = useUpdateRoutes();
// 移除路由
const removeRoutes = useRemoveRoutes();
添加路由 useAddRoutes
import React from 'react';
import {useRouter, useAddRoutes} from 'react-router-manage';
const UsersManage = () => {
const {currentRoute} = useRouter();
return <div>UsersManage - {currentRoute.title}</div>;
}
const AddRoutesWrapComponent = ({ children }) => {
const addRoutes = useAddRoutes();
const onAdd = () => {
addRoutes([
{
parentName: "user", // 父路由名称 name
title: "员工管理页",
name: "userManage",
path: "manage",
component: UsersManage,
}
]);
}
return <button onClick={onAdd}>添加一个路由</button>;
};
在上述代码中,点击button即可在 /user
路径下,增加一个/user/manage
的路由
更新路由 useUpdateRoutes
import React from 'react';
import {useRouter, useAddRoutes, useUpdateRoutes} from 'react-router-manage';
const UsersManage = () => {
const {currentRoute} = useRouter();
return <div>UsersManage - {currentRoute.title}</div>;
}
const AddRoutesWrapComponent = ({ children }) => {
const addRoutes = useAddRoutes();
const onAdd = () => {
addRoutes([
{
parentName: "user", // 父路由名称 name
title: "员工管理页",
name: "userManage",
path: "manage",
component: UsersManage,
}
]);
}
const onUpdate = () => {
updateRoutes([
{
routeName: "userManage",
routeData: {
title: "我被修改了"
}
}
]);
}
return (<div>
<button onClick={onAdd}>添加一个路由</button>
<button onClick={onUpdate}>更新当前路由</button>
</div>);
};
此时点击按钮会发现,
4. 多层次的权限控制体系
react-router-manage 突破了传统路由权限的局限性,提供了从全局到局部的多级权限控制机制:
- 声明式权限配置:通过
code
属性简洁地定义路由访问权限 - 权限继承模式:支持
parent
和children
两种权限继承模式 - 动态权限校验:结合
beforeEachMount
和beforeEnter
实现精细的动态权限控制
5. 全面的路由守卫系统
借鉴了Vue Router 的优秀设计,react-router-manage 引入了完整的路由守卫机制:
- 全局前置守卫:
beforeEachMount
- 路由级前置守卫:
beforeEnter
- 组件级离开守卫:
useBeforeLeave
这种分层的守卫架构使得开发者可以精确控制路由导航的每个环节,优雅处理权限验证、数据预加载和离开确认等复杂场景。
6.智能导航生成引擎
可自动生成符合企业规范的面包屑导航、菜单导航
从 React Router v5 到 v6 的平滑迁移
React Router v6 带来了诸多改进,但也带来了升级成本。react-router-manage 通过提供兼容层,大幅降低了迁移门槛:
- 保留部分 v5 风格的 API
- 透明处理 v6 的新特性
- 引入 useHistory 等过渡性 hook
企业级应用的首选路由解决方案
React Router Manage 已在网易云商等多个企业级应用中经受了实战检验,证明了其在大型复杂应用中的可靠性和扩展性。它特别适合以下场景:
- 大型管理后台:复杂权限系统、多层级导航
- 微前端架构:动态路由管理、模块隔离
- 多团队协作:标准化的路由配置、一致的导航体验