/** * routeRegistry - 路由注册系统 * 支持动态路由注册,避免硬编码导入 */ import React from 'react'; import { ModuleRegistry } from './ModuleRegistry'; import { createModuleRouteLoader } from './createModuleRouteLoader'; /** * 路由注册表 * 存储已注册的路由组件 */ const routeRegistry: Map> = new Map(); /** * 路由键格式:`${moduleId}:${routeKey}` */ function getRouteKey(moduleId: string, routeKey: string): string { return `${moduleId}:${routeKey}`; } /** * 注册模块路由 * * @param moduleId 模块 ID * @param routeKey 路由 key(对应模块 exports.routes[routeKey]) * @param component 路由组件(可选,如果不提供则使用 createModuleRouteLoader 自动生成延迟加载组件) * * @example * ```typescript * // 方式1:自动从模块 exports 中提取(延迟加载) * registerModuleRoute('home', 'Home'); * * // 方式2:手动提供组件 * registerModuleRoute('home', 'Home', MyHomeComponent); * ``` */ export function registerModuleRoute( moduleId: string, routeKey: string, component?: React.ComponentType ): React.ComponentType { const key = getRouteKey(moduleId, routeKey); if (component) { // 直接注册提供的组件 routeRegistry.set(key, component); return component; } else { // 使用 createModuleRouteLoader 自动生成(延迟加载) // 注意:这里返回的是组件,而不是加载器函数 // 为了兼容性,我们调用加载器函数获取组件 const createLoader = createModuleRouteLoader(moduleId, routeKey); const lazyComponent = createLoader(); routeRegistry.set(key, lazyComponent); return lazyComponent; } } /** * 获取已注册的路由组件 * * @param moduleId 模块 ID * @param routeKey 路由 key * @returns 路由组件,如果未注册则返回 undefined */ export function getModuleRoute( moduleId: string, routeKey: string ): React.ComponentType | undefined { const key = getRouteKey(moduleId, routeKey); return routeRegistry.get(key); } /** * 检查路由是否已注册 */ export function hasModuleRoute(moduleId: string, routeKey: string): boolean { const key = getRouteKey(moduleId, routeKey); return routeRegistry.has(key); } /** * 批量注册路由 * * @param routes 路由配置数组 * * @example * ```typescript * registerRoutes([ * { moduleId: 'home', routeKey: 'Home' }, * { moduleId: 'details', routeKey: 'Details' }, * ]); * ``` */ export function registerRoutes( routes: Array<{ moduleId: string; routeKey: string; component?: React.ComponentType }> ): void { routes.forEach(({ moduleId, routeKey, component }) => { registerModuleRoute(moduleId, routeKey, component); }); } /** * 清除所有已注册的路由(主要用于测试) */ export function clearRoutes(): void { routeRegistry.clear(); } /** * 获取所有已注册的路由键 */ export function getAllRouteKeys(): string[] { return Array.from(routeRegistry.keys()); }