架构设计思路
- 类型定义先行:使用 TypeScript 的类型系统为路由配置中的各种属性(如路径、组件、权限等)定义明确的类型。这确保在编写路由配置时,编译器能够检查类型错误,提高代码的稳定性。
- 模块化路由配置:将不同模块或功能相关的路由配置分开,便于管理和维护。例如,用户相关的路由、订单相关的路由等各自独立配置,最后合并到总的路由配置中。
- 权限与路由关联:在路由配置中直接关联角色权限,明确每个路由对于不同角色的可见性。这样在导航时,可以根据当前用户的角色快速筛选出可见的路由。
- 动态加载组件支持:利用 Solid.js 的动态导入功能,在路由配置中支持动态加载组件,以优化应用的加载性能。
设计模式
- 策略模式:用于根据不同角色权限决定可见路由。不同角色对应不同的权限策略,通过策略模式可以灵活切换和扩展权限逻辑。
- 模块模式:将路由配置按功能模块划分,每个模块独立维护自己的路由,最后通过主配置文件整合。这种模式提高了代码的可维护性和扩展性。
关键代码结构
- 类型定义
// 定义路由组件类型
type RouteComponent = () => Promise<{ default: JSX.Element }>;
// 定义路由配置项类型
type RouteConfig = {
path: string;
component: RouteComponent;
permissions?: string[];
children?: RouteConfig[];
};
// 定义应用路由类型
type AppRoutes = RouteConfig[];
- 路由配置示例
// 动态加载组件
const HomeComponent = () => import('./components/HomeComponent');
const AdminDashboardComponent = () => import('./components/AdminDashboardComponent');
// 路由配置
const routes: AppRoutes = [
{
path: '/',
component: HomeComponent,
permissions: ['guest', 'user', 'admin']
},
{
path: '/admin',
component: AdminDashboardComponent,
permissions: ['admin'],
children: [
{
path: 'users',
component: () => import('./components/admin/UsersComponent'),
permissions: ['admin']
}
]
}
];
- 权限验证与路由筛选
// 当前用户角色
const currentRole = 'user';
// 筛选可见路由
const visibleRoutes = routes.filter(route => {
if (!route.permissions || route.permissions.includes(currentRole)) {
if (route.children) {
route.children = route.children.filter(child => {
if (!child.permissions || child.permissions.includes(currentRole)) {
return true;
}
return false;
});
return true;
}
return true;
}
return false;
});
- 在 Solid.js 中使用路由配置
import { Router, Routes, Route } from 'solid-router';
const App: JSX.Element = () => (
<Router>
<Routes>
{visibleRoutes.map((route, index) => (
<Route
key={index}
path={route.path}
component={route.component}
>
{route.children && (
<Routes>
{route.children.map((child, childIndex) => (
<Route
key={childIndex}
path={child.path}
component={child.component}
/>
))}
</Routes>
)}
</Route>
))}
</Routes>
</Router>
);