import { IframeRouteManager } from './IframeRouteManager' class RouteTransformer { constructor(componentLoader) { this.componentLoader = componentLoader this.iframeManager = IframeRouteManager.getInstance() } /** * 转换路由配置 */ transform(route, depth = 0) { const { component, children, ...routeConfig } = route const converted = { ...routeConfig, component: void 0 } if (route.meta.isIframe) { this.handleIframeRoute(converted, route, depth) } else if (this.isFirstLevelRoute(route, depth)) { this.handleFirstLevelRoute(converted, route, component) } else { this.handleNormalRoute(converted, component) } if (children?.length) { converted.children = children.map((child) => this.transform(child, depth + 1)) } return converted } /** * 判断是否为一级路由(需要 Layout 包裹) */ isFirstLevelRoute(route, depth) { return depth === 0 && (!route.children || route.children.length === 0) } /** * 处理 iframe 类型路由 */ handleIframeRoute(targetRoute, sourceRoute, depth) { if (depth === 0) { targetRoute.component = this.componentLoader.loadLayout() targetRoute.path = this.extractFirstSegment(sourceRoute.path || '') targetRoute.name = '' targetRoute.children = [ { ...sourceRoute, component: this.componentLoader.loadIframe() } ] } else { targetRoute.component = this.componentLoader.loadIframe() } this.iframeManager.add(sourceRoute) } /** * 处理一级菜单路由 */ handleFirstLevelRoute(converted, route, component) { converted.component = this.componentLoader.loadLayout() converted.path = this.extractFirstSegment(route.path || '') converted.name = '' route.meta.isFirstLevel = true converted.children = [ { ...route, component: component ? this.componentLoader.load(component) : void 0 } ] } /** * 处理普通路由 */ handleNormalRoute(converted, component) { if (component) { converted.component = this.componentLoader.load(component) } } /** * 提取路径的第一段 */ extractFirstSegment(path) { const segments = path.split('/').filter(Boolean) return segments.length > 0 ? `/${segments[0]}` : '/' } } export { RouteTransformer }