@vlian/framework 1.2.16 → 1.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics.umd.js +1 -1
- package/dist/core/router/RouterManager.cjs +32 -2
- package/dist/core/router/RouterManager.cjs.map +1 -1
- package/dist/core/router/RouterManager.d.ts +5 -0
- package/dist/core/router/RouterManager.js +33 -3
- package/dist/core/router/RouterManager.js.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
- package/dist/core/router/dev/RouterDevTools.cjs.map +1 -1
- package/dist/core/router/dev/RouterDevTools.js.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs +24 -4
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.d.ts +1 -0
- package/dist/core/router/middleware/RouterMiddlewareManager.js +24 -4
- package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
- package/dist/core/router/middleware/types.cjs.map +1 -1
- package/dist/core/router/middleware/types.d.ts +1 -1
- package/dist/core/router/middleware/types.js.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.cjs +69 -14
- package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.d.ts +3 -0
- package/dist/core/router/navigation/RouterNavigation.js +69 -14
- package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
- package/dist/core/router/performance/RouteCache.cjs +34 -13
- package/dist/core/router/performance/RouteCache.cjs.map +1 -1
- package/dist/core/router/performance/RouteCache.d.ts +8 -2
- package/dist/core/router/performance/RouteCache.js +34 -13
- package/dist/core/router/performance/RouteCache.js.map +1 -1
- package/dist/core/router/performance/RoutePreloader.cjs +89 -22
- package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
- package/dist/core/router/performance/RoutePreloader.d.ts +9 -1
- package/dist/core/router/performance/RoutePreloader.js +89 -22
- package/dist/core/router/performance/RoutePreloader.js.map +1 -1
- package/dist/core/router/types.d.ts +22 -5
- package/dist/core/router/types.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.cjs +37 -64
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js +37 -59
- package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
- package/dist/core/router/utils/transform.cjs +79 -70
- package/dist/core/router/utils/transform.cjs.map +1 -1
- package/dist/core/router/utils/transform.d.ts +1 -1
- package/dist/core/router/utils/transform.js +80 -71
- package/dist/core/router/utils/transform.js.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.d.ts +66 -4
- package/dist/core/router/validation/schema.cjs +71 -2
- package/dist/core/router/validation/schema.cjs.map +1 -1
- package/dist/core/router/validation/schema.d.ts +102 -6
- package/dist/core/router/validation/schema.js +71 -2
- package/dist/core/router/validation/schema.js.map +1 -1
- package/dist/index.umd.js +677 -428
- package/dist/index.umd.js.map +1 -1
- package/dist/request.umd.js +1 -1
- package/dist/state.umd.js +1 -1
- package/package.json +1 -1
package/dist/analytics.umd.js
CHANGED
|
@@ -90,6 +90,9 @@ let RouterManager = class RouterManager {
|
|
|
90
90
|
if (!config.routes) {
|
|
91
91
|
throw new _errors.RouterError('路由配置不能为空', _errors.RouterErrorCode.ROUTER_CONFIG_ERROR);
|
|
92
92
|
}
|
|
93
|
+
// 更新预加载策略(默认关闭,按需懒加载)
|
|
94
|
+
this.preloader.updateConfig(config.preload);
|
|
95
|
+
this.preloader.clear();
|
|
93
96
|
let result;
|
|
94
97
|
const cacheKey = config.routes;
|
|
95
98
|
const cachedResult = this.cache.get(cacheKey);
|
|
@@ -113,10 +116,11 @@ let RouterManager = class RouterManager {
|
|
|
113
116
|
const reactRoutes = await (0, _transform1.transformRoutesToReactRoutes)(result.routes, result, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent);
|
|
114
117
|
// 注册路由到预加载器
|
|
115
118
|
if (result.routes) {
|
|
116
|
-
this.preloader.registerRoutes(result.routes);
|
|
119
|
+
this.preloader.registerRoutes(result.routes, result);
|
|
117
120
|
// 开始预加载
|
|
118
121
|
this.preloader.startPreload();
|
|
119
122
|
}
|
|
123
|
+
await this.resolveInitialLazyRoutes(reactRoutes);
|
|
120
124
|
let routerInstance = null;
|
|
121
125
|
if (config.mode === 'browser') {
|
|
122
126
|
routerInstance = (0, _reactrouterdom.createBrowserRouter)(reactRoutes, config.options);
|
|
@@ -139,14 +143,40 @@ let RouterManager = class RouterManager {
|
|
|
139
143
|
routes: result.routes
|
|
140
144
|
});
|
|
141
145
|
// 记录监控:路由初始化完成
|
|
146
|
+
const initialPath = typeof window !== 'undefined' ? `${window.location.pathname}${window.location.search}${window.location.hash}` : this.router?.state?.location?.pathname ?? '/';
|
|
142
147
|
this.monitoring.trackRouteAccess({
|
|
143
|
-
path:
|
|
148
|
+
path: initialPath,
|
|
144
149
|
meta: {
|
|
145
150
|
name: 'router-init'
|
|
146
151
|
}
|
|
147
152
|
}, undefined, true);
|
|
148
153
|
_utils.logger.info('路由管理器初始化完成');
|
|
149
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* 预解析当前 URL 命中的 lazy 路由,避免首屏长时间停留在 hydrate fallback。
|
|
157
|
+
* 非首屏路由仍保持懒加载,保留代码分割收益。
|
|
158
|
+
*/ async resolveInitialLazyRoutes(routes) {
|
|
159
|
+
if (typeof window === 'undefined') {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const matches = (0, _reactrouterdom.matchRoutes)(routes, window.location.pathname) ?? [];
|
|
163
|
+
if (matches.length === 0) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
await Promise.all(matches.map(async ({ route })=>{
|
|
167
|
+
const lazy = route.lazy;
|
|
168
|
+
if (typeof lazy !== 'function') {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const resolved = await lazy();
|
|
173
|
+
Object.assign(route, resolved);
|
|
174
|
+
delete route.lazy;
|
|
175
|
+
} catch (error) {
|
|
176
|
+
_utils.logger.warn('首屏路由懒加载预解析失败,回退到 Router 默认懒加载', error);
|
|
177
|
+
}
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
150
180
|
/**
|
|
151
181
|
* 获取路由实例
|
|
152
182
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/router/RouterManager.ts"],"sourcesContent":["import { logger } from '../../utils';\nimport type { RouterConfig } from './types';\nimport { transformRoutes } from './utils/transform';\nimport { transformRoutesToReactRoutes } from './utils/adapters/react-router/transform';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { RouterConfigValidator } from './validation';\nimport { getRouterLifecycleManager } from './lifecycle';\nimport { getRouterMiddlewareManager } from './middleware';\nimport { RouterError, RouterErrorCode } from './errors';\nimport { getRouteCache } from './performance/RouteCache';\nimport { getRoutePreloader } from './performance/RoutePreloader';\nimport { getRouterPluginManager, PluginLifecycleStage } from './plugin';\nimport { getRouterMonitoring } from './monitoring';\nimport { getAdapterManager } from './adapter';\nimport { createReactRouterAdapter } from './adapter/react-router';\n\nexport class RouterManager {\n private static instance: RouterManager | null = null;\n\n /**\n * 路由实例\n * 只能在 initialize 方法中赋值\n */\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 是否已初始化\n */\n private initialized = false;\n\n /**\n * 路由缓存实例\n */\n private cache = getRouteCache();\n\n /**\n * 路由预加载器实例\n */\n private preloader = getRoutePreloader();\n\n /**\n * 路由插件管理器实例\n */\n private pluginManager = getRouterPluginManager();\n\n /**\n * 路由监控服务实例\n */\n private monitoring = getRouterMonitoring();\n\n /**\n * 路由适配器管理器实例\n */\n private adapterManager = getAdapterManager();\n\n private constructor() {\n // 私有构造函数\n // 注册默认的 React Router 适配器\n this.adapterManager.register({\n name: 'react-router',\n factory: createReactRouterAdapter(),\n priority: 10,\n });\n }\n /**\n * 获取单例实例\n */\n static getInstance(): RouterManager {\n if (!RouterManager.instance) {\n RouterManager.instance = new RouterManager();\n }\n return RouterManager.instance;\n }\n /**\n * 初始化路由管理器\n * \n * @param config - 路由配置\n * @param _appInstance - 应用实例(保留用于兼容性,当前未使用)\n */\n async initialize(config: RouterConfig): Promise<void> {\n // 如果路由被禁用,直接返回\n if (config.enabled === false || config.enabled === 'disabled') {\n logger.info('路由系统已禁用');\n return;\n }\n\n // 配置验证(如果启用)\n if (config.enableValidation !== false) {\n try {\n RouterConfigValidator.validate(config);\n logger.debug('路由配置验证通过');\n } catch (error) {\n logger.error('路由配置验证失败', error);\n // 开发环境下抛出错误,生产环境下记录警告但继续执行\n if (process.env.NODE_ENV === 'development') {\n throw error;\n }\n }\n }\n\n // 执行插件钩子:路由初始化前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_INIT, {\n config,\n });\n\n // 注册生命周期钩子\n if (config.hooks) {\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.register(config.hooks);\n logger.debug('路由生命周期钩子已注册');\n }\n\n // 转换数据(使用缓存)\n if (!config.routes) {\n throw new RouterError(\n '路由配置不能为空',\n RouterErrorCode.ROUTER_CONFIG_ERROR\n );\n }\n\n let result;\n const cacheKey = config.routes;\n const cachedResult = this.cache.get(cacheKey);\n\n if (cachedResult) {\n logger.debug('使用缓存的路由转换结果');\n result = cachedResult;\n } else {\n // 执行插件钩子:路由转换前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_TRANSFORM, {\n config,\n });\n\n result = await transformRoutes(config.routes, config.transformOptions);\n\n // 执行插件钩子:路由转换后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_TRANSFORM, {\n config,\n routes: result.routes,\n });\n\n // 缓存转换结果\n this.cache.set(cacheKey, result);\n }\n\n const reactRoutes = await transformRoutesToReactRoutes(result.routes, result, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent);\n\n // 注册路由到预加载器\n if (result.routes) {\n this.preloader.registerRoutes(result.routes);\n // 开始预加载\n this.preloader.startPreload();\n }\n\n let routerInstance: ReturnType<typeof createBrowserRouter> | null = null;\n if (config.mode === 'browser') {\n routerInstance = createBrowserRouter(reactRoutes, config.options);\n } else if (config.mode === 'hash') {\n routerInstance = createHashRouter(reactRoutes, config.options);\n } else if (config.mode === 'memory') {\n routerInstance = createMemoryRouter(reactRoutes, config.options);\n }\n\n if (!routerInstance) {\n throw new RouterError(\n '路由模式不支持',\n RouterErrorCode.ROUTER_CONFIG_ERROR,\n undefined,\n undefined,\n { mode: config.mode }\n );\n }\n\n // 只能在 initialize 方法中赋值\n this.router = routerInstance;\n this.initialized = true;\n\n // 执行插件钩子:路由初始化后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_INIT, {\n config,\n routes: result.routes,\n });\n\n // 记录监控:路由初始化完成\n this.monitoring.trackRouteAccess(\n {\n path: window.location.pathname,\n meta: { name: 'router-init' },\n },\n undefined,\n true\n );\n\n logger.info('路由管理器初始化完成');\n }\n\n /**\n * 获取路由实例\n * \n * @returns 路由实例,如果未初始化则返回 null\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 检查是否已初始化\n * \n * @returns 如果已初始化返回 true,否则返回 false\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 销毁路由管理器\n */\n destroy(): void {\n // 执行插件钩子:销毁\n this.pluginManager.executeHooks(PluginLifecycleStage.DESTROY, {\n config: {} as RouterConfig,\n });\n\n // 停止预加载\n this.preloader.stopPreload();\n\n this.router = null;\n this.initialized = false;\n \n // 清空生命周期钩子和中间件\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.clear();\n \n const middlewareManager = getRouterMiddlewareManager();\n middlewareManager.clear();\n \n logger.info('路由管理器已销毁');\n }\n\n /**\n * 获取路由缓存实例\n */\n getCache() {\n return this.cache;\n }\n\n /**\n * 获取路由预加载器实例\n */\n getPreloader() {\n return this.preloader;\n }\n\n /**\n * 获取路由插件管理器实例\n */\n getPluginManager() {\n return this.pluginManager;\n }\n\n /**\n * 获取路由监控服务实例\n */\n getMonitoring() {\n return this.monitoring;\n }\n}\n\n/**\n * 获取路由管理器\n */\nexport function getRouterManager(): RouterManager {\n return RouterManager.getInstance();\n}"],"names":["RouterManager","getRouterManager","getInstance","instance","initialize","config","enabled","logger","info","enableValidation","RouterConfigValidator","validate","debug","error","process","env","NODE_ENV","pluginManager","executeHooks","PluginLifecycleStage","BEFORE_INIT","hooks","lifecycleManager","getRouterLifecycleManager","register","routes","RouterError","RouterErrorCode","ROUTER_CONFIG_ERROR","result","cacheKey","cachedResult","cache","get","BEFORE_TRANSFORM","transformRoutes","transformOptions","AFTER_TRANSFORM","set","reactRoutes","transformRoutesToReactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","preloader","registerRoutes","startPreload","routerInstance","mode","createBrowserRouter","options","createHashRouter","createMemoryRouter","undefined","router","initialized","AFTER_INIT","monitoring","trackRouteAccess","path","window","location","pathname","meta","name","getRouter","isInitialized","destroy","DESTROY","stopPreload","clear","middlewareManager","getRouterMiddlewareManager","getCache","getPreloader","getPluginManager","getMonitoring","getRouteCache","getRoutePreloader","getRouterPluginManager","getRouterMonitoring","adapterManager","getAdapterManager","factory","createReactRouterAdapter","priority"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/router/RouterManager.ts"],"sourcesContent":["import { logger } from '../../utils';\nimport type { RouterConfig } from './types';\nimport { transformRoutes } from './utils/transform';\nimport { transformRoutesToReactRoutes } from './utils/adapters/react-router/transform';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter, matchRoutes, type RouteObject } from 'react-router-dom';\nimport { RouterConfigValidator } from './validation';\nimport { getRouterLifecycleManager } from './lifecycle';\nimport { getRouterMiddlewareManager } from './middleware';\nimport { RouterError, RouterErrorCode } from './errors';\nimport { getRouteCache } from './performance/RouteCache';\nimport { getRoutePreloader } from './performance/RoutePreloader';\nimport { getRouterPluginManager, PluginLifecycleStage } from './plugin';\nimport { getRouterMonitoring } from './monitoring';\nimport { getAdapterManager } from './adapter';\nimport { createReactRouterAdapter } from './adapter/react-router';\n\nexport class RouterManager {\n private static instance: RouterManager | null = null;\n\n /**\n * 路由实例\n * 只能在 initialize 方法中赋值\n */\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 是否已初始化\n */\n private initialized = false;\n\n /**\n * 路由缓存实例\n */\n private cache = getRouteCache();\n\n /**\n * 路由预加载器实例\n */\n private preloader = getRoutePreloader();\n\n /**\n * 路由插件管理器实例\n */\n private pluginManager = getRouterPluginManager();\n\n /**\n * 路由监控服务实例\n */\n private monitoring = getRouterMonitoring();\n\n /**\n * 路由适配器管理器实例\n */\n private adapterManager = getAdapterManager();\n\n private constructor() {\n // 私有构造函数\n // 注册默认的 React Router 适配器\n this.adapterManager.register({\n name: 'react-router',\n factory: createReactRouterAdapter(),\n priority: 10,\n });\n }\n /**\n * 获取单例实例\n */\n static getInstance(): RouterManager {\n if (!RouterManager.instance) {\n RouterManager.instance = new RouterManager();\n }\n return RouterManager.instance;\n }\n /**\n * 初始化路由管理器\n * \n * @param config - 路由配置\n * @param _appInstance - 应用实例(保留用于兼容性,当前未使用)\n */\n async initialize(config: RouterConfig): Promise<void> {\n // 如果路由被禁用,直接返回\n if (config.enabled === false || config.enabled === 'disabled') {\n logger.info('路由系统已禁用');\n return;\n }\n\n // 配置验证(如果启用)\n if (config.enableValidation !== false) {\n try {\n RouterConfigValidator.validate(config);\n logger.debug('路由配置验证通过');\n } catch (error) {\n logger.error('路由配置验证失败', error);\n // 开发环境下抛出错误,生产环境下记录警告但继续执行\n if (process.env.NODE_ENV === 'development') {\n throw error;\n }\n }\n }\n\n // 执行插件钩子:路由初始化前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_INIT, {\n config,\n });\n\n // 注册生命周期钩子\n if (config.hooks) {\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.register(config.hooks);\n logger.debug('路由生命周期钩子已注册');\n }\n\n // 转换数据(使用缓存)\n if (!config.routes) {\n throw new RouterError(\n '路由配置不能为空',\n RouterErrorCode.ROUTER_CONFIG_ERROR\n );\n }\n\n // 更新预加载策略(默认关闭,按需懒加载)\n this.preloader.updateConfig(config.preload);\n this.preloader.clear();\n\n let result;\n const cacheKey = config.routes;\n const cachedResult = this.cache.get(cacheKey);\n\n if (cachedResult) {\n logger.debug('使用缓存的路由转换结果');\n result = cachedResult;\n } else {\n // 执行插件钩子:路由转换前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_TRANSFORM, {\n config,\n });\n\n result = await transformRoutes(config.routes, config.transformOptions);\n\n // 执行插件钩子:路由转换后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_TRANSFORM, {\n config,\n routes: result.routes,\n });\n\n // 缓存转换结果\n this.cache.set(cacheKey, result);\n }\n\n const reactRoutes = await transformRoutesToReactRoutes(\n result.routes,\n result,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent,\n );\n\n // 注册路由到预加载器\n if (result.routes) {\n this.preloader.registerRoutes(result.routes, result);\n // 开始预加载\n this.preloader.startPreload();\n }\n\n await this.resolveInitialLazyRoutes(reactRoutes);\n\n let routerInstance: ReturnType<typeof createBrowserRouter> | null = null;\n if (config.mode === 'browser') {\n routerInstance = createBrowserRouter(reactRoutes, config.options);\n } else if (config.mode === 'hash') {\n routerInstance = createHashRouter(reactRoutes, config.options);\n } else if (config.mode === 'memory') {\n routerInstance = createMemoryRouter(reactRoutes, config.options);\n }\n\n if (!routerInstance) {\n throw new RouterError(\n '路由模式不支持',\n RouterErrorCode.ROUTER_CONFIG_ERROR,\n undefined,\n undefined,\n { mode: config.mode }\n );\n }\n\n // 只能在 initialize 方法中赋值\n this.router = routerInstance;\n this.initialized = true;\n\n // 执行插件钩子:路由初始化后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_INIT, {\n config,\n routes: result.routes,\n });\n\n // 记录监控:路由初始化完成\n const initialPath = typeof window !== 'undefined'\n ? `${window.location.pathname}${window.location.search}${window.location.hash}`\n : this.router?.state?.location?.pathname ?? '/';\n\n this.monitoring.trackRouteAccess(\n {\n path: initialPath,\n meta: { name: 'router-init' },\n },\n undefined,\n true\n );\n\n logger.info('路由管理器初始化完成');\n }\n\n /**\n * 预解析当前 URL 命中的 lazy 路由,避免首屏长时间停留在 hydrate fallback。\n * 非首屏路由仍保持懒加载,保留代码分割收益。\n */\n private async resolveInitialLazyRoutes(routes: RouteObject[]): Promise<void> {\n if (typeof window === 'undefined') {\n return;\n }\n\n const matches = matchRoutes(routes, window.location.pathname) ?? [];\n if (matches.length === 0) {\n return;\n }\n\n await Promise.all(\n matches.map(async ({ route }) => {\n const lazy = route.lazy;\n if (typeof lazy !== 'function') {\n return;\n }\n\n try {\n const resolved = await lazy();\n Object.assign(route, resolved);\n delete (route as RouteObject & { lazy?: unknown }).lazy;\n } catch (error) {\n logger.warn('首屏路由懒加载预解析失败,回退到 Router 默认懒加载', error);\n }\n }),\n );\n }\n\n /**\n * 获取路由实例\n * \n * @returns 路由实例,如果未初始化则返回 null\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 检查是否已初始化\n * \n * @returns 如果已初始化返回 true,否则返回 false\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 销毁路由管理器\n */\n destroy(): void {\n // 执行插件钩子:销毁\n this.pluginManager.executeHooks(PluginLifecycleStage.DESTROY, {\n config: {} as RouterConfig,\n });\n\n // 停止预加载\n this.preloader.stopPreload();\n\n this.router = null;\n this.initialized = false;\n \n // 清空生命周期钩子和中间件\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.clear();\n \n const middlewareManager = getRouterMiddlewareManager();\n middlewareManager.clear();\n \n logger.info('路由管理器已销毁');\n }\n\n /**\n * 获取路由缓存实例\n */\n getCache() {\n return this.cache;\n }\n\n /**\n * 获取路由预加载器实例\n */\n getPreloader() {\n return this.preloader;\n }\n\n /**\n * 获取路由插件管理器实例\n */\n getPluginManager() {\n return this.pluginManager;\n }\n\n /**\n * 获取路由监控服务实例\n */\n getMonitoring() {\n return this.monitoring;\n }\n}\n\n/**\n * 获取路由管理器\n */\nexport function getRouterManager(): RouterManager {\n return RouterManager.getInstance();\n}\n"],"names":["RouterManager","getRouterManager","getInstance","instance","initialize","config","enabled","logger","info","enableValidation","RouterConfigValidator","validate","debug","error","process","env","NODE_ENV","pluginManager","executeHooks","PluginLifecycleStage","BEFORE_INIT","hooks","lifecycleManager","getRouterLifecycleManager","register","routes","RouterError","RouterErrorCode","ROUTER_CONFIG_ERROR","preloader","updateConfig","preload","clear","result","cacheKey","cachedResult","cache","get","BEFORE_TRANSFORM","transformRoutes","transformOptions","AFTER_TRANSFORM","set","reactRoutes","transformRoutesToReactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","registerRoutes","startPreload","resolveInitialLazyRoutes","routerInstance","mode","createBrowserRouter","options","createHashRouter","createMemoryRouter","undefined","router","initialized","AFTER_INIT","initialPath","window","location","pathname","search","hash","state","monitoring","trackRouteAccess","path","meta","name","matches","matchRoutes","length","Promise","all","map","route","lazy","resolved","Object","assign","warn","getRouter","isInitialized","destroy","DESTROY","stopPreload","middlewareManager","getRouterMiddlewareManager","getCache","getPreloader","getPluginManager","getMonitoring","getRouteCache","getRoutePreloader","getRouterPluginManager","getRouterMonitoring","adapterManager","getAdapterManager","factory","createReactRouterAdapter","priority"],"mappings":"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"}
|
|
@@ -43,6 +43,11 @@ export declare class RouterManager {
|
|
|
43
43
|
* @param _appInstance - 应用实例(保留用于兼容性,当前未使用)
|
|
44
44
|
*/
|
|
45
45
|
initialize(config: RouterConfig): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* 预解析当前 URL 命中的 lazy 路由,避免首屏长时间停留在 hydrate fallback。
|
|
48
|
+
* 非首屏路由仍保持懒加载,保留代码分割收益。
|
|
49
|
+
*/
|
|
50
|
+
private resolveInitialLazyRoutes;
|
|
46
51
|
/**
|
|
47
52
|
* 获取路由实例
|
|
48
53
|
*
|
|
@@ -14,7 +14,7 @@ function _define_property(obj, key, value) {
|
|
|
14
14
|
import { logger } from "../../utils";
|
|
15
15
|
import { transformRoutes } from "./utils/transform";
|
|
16
16
|
import { transformRoutesToReactRoutes } from "./utils/adapters/react-router/transform";
|
|
17
|
-
import { createBrowserRouter, createHashRouter, createMemoryRouter } from "react-router-dom";
|
|
17
|
+
import { createBrowserRouter, createHashRouter, createMemoryRouter, matchRoutes } from "react-router-dom";
|
|
18
18
|
import { RouterConfigValidator } from "./validation";
|
|
19
19
|
import { getRouterLifecycleManager } from "./lifecycle";
|
|
20
20
|
import { getRouterMiddlewareManager } from "./middleware";
|
|
@@ -72,6 +72,9 @@ export class RouterManager {
|
|
|
72
72
|
if (!config.routes) {
|
|
73
73
|
throw new RouterError('路由配置不能为空', RouterErrorCode.ROUTER_CONFIG_ERROR);
|
|
74
74
|
}
|
|
75
|
+
// 更新预加载策略(默认关闭,按需懒加载)
|
|
76
|
+
this.preloader.updateConfig(config.preload);
|
|
77
|
+
this.preloader.clear();
|
|
75
78
|
let result;
|
|
76
79
|
const cacheKey = config.routes;
|
|
77
80
|
const cachedResult = this.cache.get(cacheKey);
|
|
@@ -95,10 +98,11 @@ export class RouterManager {
|
|
|
95
98
|
const reactRoutes = await transformRoutesToReactRoutes(result.routes, result, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent);
|
|
96
99
|
// 注册路由到预加载器
|
|
97
100
|
if (result.routes) {
|
|
98
|
-
this.preloader.registerRoutes(result.routes);
|
|
101
|
+
this.preloader.registerRoutes(result.routes, result);
|
|
99
102
|
// 开始预加载
|
|
100
103
|
this.preloader.startPreload();
|
|
101
104
|
}
|
|
105
|
+
await this.resolveInitialLazyRoutes(reactRoutes);
|
|
102
106
|
let routerInstance = null;
|
|
103
107
|
if (config.mode === 'browser') {
|
|
104
108
|
routerInstance = createBrowserRouter(reactRoutes, config.options);
|
|
@@ -121,14 +125,40 @@ export class RouterManager {
|
|
|
121
125
|
routes: result.routes
|
|
122
126
|
});
|
|
123
127
|
// 记录监控:路由初始化完成
|
|
128
|
+
const initialPath = typeof window !== 'undefined' ? `${window.location.pathname}${window.location.search}${window.location.hash}` : this.router?.state?.location?.pathname ?? '/';
|
|
124
129
|
this.monitoring.trackRouteAccess({
|
|
125
|
-
path:
|
|
130
|
+
path: initialPath,
|
|
126
131
|
meta: {
|
|
127
132
|
name: 'router-init'
|
|
128
133
|
}
|
|
129
134
|
}, undefined, true);
|
|
130
135
|
logger.info('路由管理器初始化完成');
|
|
131
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* 预解析当前 URL 命中的 lazy 路由,避免首屏长时间停留在 hydrate fallback。
|
|
139
|
+
* 非首屏路由仍保持懒加载,保留代码分割收益。
|
|
140
|
+
*/ async resolveInitialLazyRoutes(routes) {
|
|
141
|
+
if (typeof window === 'undefined') {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const matches = matchRoutes(routes, window.location.pathname) ?? [];
|
|
145
|
+
if (matches.length === 0) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
await Promise.all(matches.map(async ({ route })=>{
|
|
149
|
+
const lazy = route.lazy;
|
|
150
|
+
if (typeof lazy !== 'function') {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const resolved = await lazy();
|
|
155
|
+
Object.assign(route, resolved);
|
|
156
|
+
delete route.lazy;
|
|
157
|
+
} catch (error) {
|
|
158
|
+
logger.warn('首屏路由懒加载预解析失败,回退到 Router 默认懒加载', error);
|
|
159
|
+
}
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
132
162
|
/**
|
|
133
163
|
* 获取路由实例
|
|
134
164
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/router/RouterManager.ts"],"sourcesContent":["import { logger } from '../../utils';\nimport type { RouterConfig } from './types';\nimport { transformRoutes } from './utils/transform';\nimport { transformRoutesToReactRoutes } from './utils/adapters/react-router/transform';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { RouterConfigValidator } from './validation';\nimport { getRouterLifecycleManager } from './lifecycle';\nimport { getRouterMiddlewareManager } from './middleware';\nimport { RouterError, RouterErrorCode } from './errors';\nimport { getRouteCache } from './performance/RouteCache';\nimport { getRoutePreloader } from './performance/RoutePreloader';\nimport { getRouterPluginManager, PluginLifecycleStage } from './plugin';\nimport { getRouterMonitoring } from './monitoring';\nimport { getAdapterManager } from './adapter';\nimport { createReactRouterAdapter } from './adapter/react-router';\n\nexport class RouterManager {\n private static instance: RouterManager | null = null;\n\n /**\n * 路由实例\n * 只能在 initialize 方法中赋值\n */\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 是否已初始化\n */\n private initialized = false;\n\n /**\n * 路由缓存实例\n */\n private cache = getRouteCache();\n\n /**\n * 路由预加载器实例\n */\n private preloader = getRoutePreloader();\n\n /**\n * 路由插件管理器实例\n */\n private pluginManager = getRouterPluginManager();\n\n /**\n * 路由监控服务实例\n */\n private monitoring = getRouterMonitoring();\n\n /**\n * 路由适配器管理器实例\n */\n private adapterManager = getAdapterManager();\n\n private constructor() {\n // 私有构造函数\n // 注册默认的 React Router 适配器\n this.adapterManager.register({\n name: 'react-router',\n factory: createReactRouterAdapter(),\n priority: 10,\n });\n }\n /**\n * 获取单例实例\n */\n static getInstance(): RouterManager {\n if (!RouterManager.instance) {\n RouterManager.instance = new RouterManager();\n }\n return RouterManager.instance;\n }\n /**\n * 初始化路由管理器\n * \n * @param config - 路由配置\n * @param _appInstance - 应用实例(保留用于兼容性,当前未使用)\n */\n async initialize(config: RouterConfig): Promise<void> {\n // 如果路由被禁用,直接返回\n if (config.enabled === false || config.enabled === 'disabled') {\n logger.info('路由系统已禁用');\n return;\n }\n\n // 配置验证(如果启用)\n if (config.enableValidation !== false) {\n try {\n RouterConfigValidator.validate(config);\n logger.debug('路由配置验证通过');\n } catch (error) {\n logger.error('路由配置验证失败', error);\n // 开发环境下抛出错误,生产环境下记录警告但继续执行\n if (process.env.NODE_ENV === 'development') {\n throw error;\n }\n }\n }\n\n // 执行插件钩子:路由初始化前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_INIT, {\n config,\n });\n\n // 注册生命周期钩子\n if (config.hooks) {\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.register(config.hooks);\n logger.debug('路由生命周期钩子已注册');\n }\n\n // 转换数据(使用缓存)\n if (!config.routes) {\n throw new RouterError(\n '路由配置不能为空',\n RouterErrorCode.ROUTER_CONFIG_ERROR\n );\n }\n\n let result;\n const cacheKey = config.routes;\n const cachedResult = this.cache.get(cacheKey);\n\n if (cachedResult) {\n logger.debug('使用缓存的路由转换结果');\n result = cachedResult;\n } else {\n // 执行插件钩子:路由转换前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_TRANSFORM, {\n config,\n });\n\n result = await transformRoutes(config.routes, config.transformOptions);\n\n // 执行插件钩子:路由转换后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_TRANSFORM, {\n config,\n routes: result.routes,\n });\n\n // 缓存转换结果\n this.cache.set(cacheKey, result);\n }\n\n const reactRoutes = await transformRoutesToReactRoutes(result.routes, result, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent);\n\n // 注册路由到预加载器\n if (result.routes) {\n this.preloader.registerRoutes(result.routes);\n // 开始预加载\n this.preloader.startPreload();\n }\n\n let routerInstance: ReturnType<typeof createBrowserRouter> | null = null;\n if (config.mode === 'browser') {\n routerInstance = createBrowserRouter(reactRoutes, config.options);\n } else if (config.mode === 'hash') {\n routerInstance = createHashRouter(reactRoutes, config.options);\n } else if (config.mode === 'memory') {\n routerInstance = createMemoryRouter(reactRoutes, config.options);\n }\n\n if (!routerInstance) {\n throw new RouterError(\n '路由模式不支持',\n RouterErrorCode.ROUTER_CONFIG_ERROR,\n undefined,\n undefined,\n { mode: config.mode }\n );\n }\n\n // 只能在 initialize 方法中赋值\n this.router = routerInstance;\n this.initialized = true;\n\n // 执行插件钩子:路由初始化后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_INIT, {\n config,\n routes: result.routes,\n });\n\n // 记录监控:路由初始化完成\n this.monitoring.trackRouteAccess(\n {\n path: window.location.pathname,\n meta: { name: 'router-init' },\n },\n undefined,\n true\n );\n\n logger.info('路由管理器初始化完成');\n }\n\n /**\n * 获取路由实例\n * \n * @returns 路由实例,如果未初始化则返回 null\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 检查是否已初始化\n * \n * @returns 如果已初始化返回 true,否则返回 false\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 销毁路由管理器\n */\n destroy(): void {\n // 执行插件钩子:销毁\n this.pluginManager.executeHooks(PluginLifecycleStage.DESTROY, {\n config: {} as RouterConfig,\n });\n\n // 停止预加载\n this.preloader.stopPreload();\n\n this.router = null;\n this.initialized = false;\n \n // 清空生命周期钩子和中间件\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.clear();\n \n const middlewareManager = getRouterMiddlewareManager();\n middlewareManager.clear();\n \n logger.info('路由管理器已销毁');\n }\n\n /**\n * 获取路由缓存实例\n */\n getCache() {\n return this.cache;\n }\n\n /**\n * 获取路由预加载器实例\n */\n getPreloader() {\n return this.preloader;\n }\n\n /**\n * 获取路由插件管理器实例\n */\n getPluginManager() {\n return this.pluginManager;\n }\n\n /**\n * 获取路由监控服务实例\n */\n getMonitoring() {\n return this.monitoring;\n }\n}\n\n/**\n * 获取路由管理器\n */\nexport function getRouterManager(): RouterManager {\n return RouterManager.getInstance();\n}"],"names":["logger","transformRoutes","transformRoutesToReactRoutes","createBrowserRouter","createHashRouter","createMemoryRouter","RouterConfigValidator","getRouterLifecycleManager","getRouterMiddlewareManager","RouterError","RouterErrorCode","getRouteCache","getRoutePreloader","getRouterPluginManager","PluginLifecycleStage","getRouterMonitoring","getAdapterManager","createReactRouterAdapter","RouterManager","getInstance","instance","initialize","config","enabled","info","enableValidation","validate","debug","error","process","env","NODE_ENV","pluginManager","executeHooks","BEFORE_INIT","hooks","lifecycleManager","register","routes","ROUTER_CONFIG_ERROR","result","cacheKey","cachedResult","cache","get","BEFORE_TRANSFORM","transformOptions","AFTER_TRANSFORM","set","reactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","preloader","registerRoutes","startPreload","routerInstance","mode","options","undefined","router","initialized","AFTER_INIT","monitoring","trackRouteAccess","path","window","location","pathname","meta","name","getRouter","isInitialized","destroy","DESTROY","stopPreload","clear","middlewareManager","getCache","getPreloader","getPluginManager","getMonitoring","adapterManager","factory","priority","getRouterManager"],"mappings":";;;;;;;;;;;;;AAAA,SAASA,MAAM,QAAQ,cAAc;AAErC,SAASC,eAAe,QAAQ,oBAAoB;AACpD,SAASC,4BAA4B,QAAQ,0CAA0C;AACvF,SAASC,mBAAmB,EAAEC,gBAAgB,EAAEC,kBAAkB,QAAQ,mBAAmB;AAC7F,SAASC,qBAAqB,QAAQ,eAAe;AACrD,SAASC,yBAAyB,QAAQ,cAAc;AACxD,SAASC,0BAA0B,QAAQ,eAAe;AAC1D,SAASC,WAAW,EAAEC,eAAe,QAAQ,WAAW;AACxD,SAASC,aAAa,QAAQ,2BAA2B;AACzD,SAASC,iBAAiB,QAAQ,+BAA+B;AACjE,SAASC,sBAAsB,EAAEC,oBAAoB,QAAQ,WAAW;AACxE,SAASC,mBAAmB,QAAQ,eAAe;AACnD,SAASC,iBAAiB,QAAQ,YAAY;AAC9C,SAASC,wBAAwB,QAAQ,yBAAyB;AAElE,OAAO,MAAMC;IAgDT;;KAEC,GACD,OAAOC,cAA6B;QAChC,IAAI,CAACD,cAAcE,QAAQ,EAAE;YACzBF,cAAcE,QAAQ,GAAG,IAAIF;QACjC;QACA,OAAOA,cAAcE,QAAQ;IACjC;IACA;;;;;KAKC,GACD,MAAMC,WAAWC,MAAoB,EAAiB;QAClD,eAAe;QACf,IAAIA,OAAOC,OAAO,KAAK,SAASD,OAAOC,OAAO,KAAK,YAAY;YAC3DvB,OAAOwB,IAAI,CAAC;YACZ;QACJ;QAEA,aAAa;QACb,IAAIF,OAAOG,gBAAgB,KAAK,OAAO;YACnC,IAAI;gBACAnB,sBAAsBoB,QAAQ,CAACJ;gBAC/BtB,OAAO2B,KAAK,CAAC;YACjB,EAAE,OAAOC,OAAO;gBACZ5B,OAAO4B,KAAK,CAAC,YAAYA;gBACzB,2BAA2B;gBAC3B,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;oBACxC,MAAMH;gBACV;YACJ;QACJ;QAEA,gBAAgB;QAChB,MAAM,IAAI,CAACI,aAAa,CAACC,YAAY,CAACnB,qBAAqBoB,WAAW,EAAE;YACpEZ;QACJ;QAEA,WAAW;QACX,IAAIA,OAAOa,KAAK,EAAE;YACd,MAAMC,mBAAmB7B;YACzB6B,iBAAiBC,QAAQ,CAACf,OAAOa,KAAK;YACtCnC,OAAO2B,KAAK,CAAC;QACjB;QAEA,aAAa;QACb,IAAI,CAACL,OAAOgB,MAAM,EAAE;YAChB,MAAM,IAAI7B,YACN,YACAC,gBAAgB6B,mBAAmB;QAE3C;QAEA,IAAIC;QACJ,MAAMC,WAAWnB,OAAOgB,MAAM;QAC9B,MAAMI,eAAe,IAAI,CAACC,KAAK,CAACC,GAAG,CAACH;QAEpC,IAAIC,cAAc;YACd1C,OAAO2B,KAAK,CAAC;YACba,SAASE;QACb,OAAO;YACH,eAAe;YACf,MAAM,IAAI,CAACV,aAAa,CAACC,YAAY,CAACnB,qBAAqB+B,gBAAgB,EAAE;gBACzEvB;YACJ;YAEAkB,SAAS,MAAMvC,gBAAgBqB,OAAOgB,MAAM,EAAEhB,OAAOwB,gBAAgB;YAErE,eAAe;YACf,MAAM,IAAI,CAACd,aAAa,CAACC,YAAY,CAACnB,qBAAqBiC,eAAe,EAAE;gBACxEzB;gBACAgB,QAAQE,OAAOF,MAAM;YACzB;YAEA,SAAS;YACT,IAAI,CAACK,KAAK,CAACK,GAAG,CAACP,UAAUD;QAC7B;QAEA,MAAMS,cAAc,MAAM/C,6BAA6BsC,OAAOF,MAAM,EAAEE,QAAQlB,OAAO4B,0BAA0B,EAAE5B,OAAO6B,4BAA4B;QAEpJ,YAAY;QACZ,IAAIX,OAAOF,MAAM,EAAE;YACf,IAAI,CAACc,SAAS,CAACC,cAAc,CAACb,OAAOF,MAAM;YAC3C,QAAQ;YACR,IAAI,CAACc,SAAS,CAACE,YAAY;QAC/B;QAEA,IAAIC,iBAAgE;QACpE,IAAIjC,OAAOkC,IAAI,KAAK,WAAW;YAC3BD,iBAAiBpD,oBAAoB8C,aAAa3B,OAAOmC,OAAO;QACpE,OAAO,IAAInC,OAAOkC,IAAI,KAAK,QAAQ;YAC/BD,iBAAiBnD,iBAAiB6C,aAAa3B,OAAOmC,OAAO;QACjE,OAAO,IAAInC,OAAOkC,IAAI,KAAK,UAAU;YACjCD,iBAAiBlD,mBAAmB4C,aAAa3B,OAAOmC,OAAO;QACnE;QAEA,IAAI,CAACF,gBAAgB;YACjB,MAAM,IAAI9C,YACN,WACAC,gBAAgB6B,mBAAmB,EACnCmB,WACAA,WACA;gBAAEF,MAAMlC,OAAOkC,IAAI;YAAC;QAE5B;QAEA,uBAAuB;QACvB,IAAI,CAACG,MAAM,GAAGJ;QACd,IAAI,CAACK,WAAW,GAAG;QAEnB,gBAAgB;QAChB,MAAM,IAAI,CAAC5B,aAAa,CAACC,YAAY,CAACnB,qBAAqB+C,UAAU,EAAE;YACnEvC;YACAgB,QAAQE,OAAOF,MAAM;QACzB;QAEA,eAAe;QACf,IAAI,CAACwB,UAAU,CAACC,gBAAgB,CAC5B;YACIC,MAAMC,OAAOC,QAAQ,CAACC,QAAQ;YAC9BC,MAAM;gBAAEC,MAAM;YAAc;QAChC,GACAX,WACA;QAGJ1D,OAAOwB,IAAI,CAAC;IAChB;IAEA;;;;KAIC,GACD8C,YAA2D;QACvD,OAAO,IAAI,CAACX,MAAM;IACtB;IAEA;;;;KAIC,GACDY,gBAAyB;QACrB,OAAO,IAAI,CAACX,WAAW;IAC3B;IAEA;;KAEC,GACDY,UAAgB;QACZ,YAAY;QACZ,IAAI,CAACxC,aAAa,CAACC,YAAY,CAACnB,qBAAqB2D,OAAO,EAAE;YAC1DnD,QAAQ,CAAC;QACb;QAEA,QAAQ;QACR,IAAI,CAAC8B,SAAS,CAACsB,WAAW;QAE1B,IAAI,CAACf,MAAM,GAAG;QACd,IAAI,CAACC,WAAW,GAAG;QAEnB,eAAe;QACf,MAAMxB,mBAAmB7B;QACzB6B,iBAAiBuC,KAAK;QAEtB,MAAMC,oBAAoBpE;QAC1BoE,kBAAkBD,KAAK;QAEvB3E,OAAOwB,IAAI,CAAC;IAChB;IAEA;;KAEC,GACDqD,WAAW;QACP,OAAO,IAAI,CAAClC,KAAK;IACrB;IAEA;;KAEC,GACDmC,eAAe;QACX,OAAO,IAAI,CAAC1B,SAAS;IACzB;IAEA;;KAEC,GACD2B,mBAAmB;QACf,OAAO,IAAI,CAAC/C,aAAa;IAC7B;IAEA;;KAEC,GACDgD,gBAAgB;QACZ,OAAO,IAAI,CAAClB,UAAU;IAC1B;IAlNA,aAAsB;QApCtB;;;KAGC,GACD,uBAAQH,UAAwD;QAEhE;;KAEC,GACD,uBAAQC,eAAc;QAEtB;;KAEC,GACD,uBAAQjB,SAAQhC;QAEhB;;KAEC,GACD,uBAAQyC,aAAYxC;QAEpB;;KAEC,GACD,uBAAQoB,iBAAgBnB;QAExB;;KAEC,GACD,uBAAQiD,cAAa/C;QAErB;;KAEC,GACD,uBAAQkE,kBAAiBjE;QAGrB,SAAS;QACT,yBAAyB;QACzB,IAAI,CAACiE,cAAc,CAAC5C,QAAQ,CAAC;YACzBgC,MAAM;YACNa,SAASjE;YACTkE,UAAU;QACd;IACJ;AA2MJ;AAzPI,iBADSjE,eACME,YAAiC;AA2PpD;;CAEC,GACD,OAAO,SAASgE;IACZ,OAAOlE,cAAcC,WAAW;AACpC"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/router/RouterManager.ts"],"sourcesContent":["import { logger } from '../../utils';\nimport type { RouterConfig } from './types';\nimport { transformRoutes } from './utils/transform';\nimport { transformRoutesToReactRoutes } from './utils/adapters/react-router/transform';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter, matchRoutes, type RouteObject } from 'react-router-dom';\nimport { RouterConfigValidator } from './validation';\nimport { getRouterLifecycleManager } from './lifecycle';\nimport { getRouterMiddlewareManager } from './middleware';\nimport { RouterError, RouterErrorCode } from './errors';\nimport { getRouteCache } from './performance/RouteCache';\nimport { getRoutePreloader } from './performance/RoutePreloader';\nimport { getRouterPluginManager, PluginLifecycleStage } from './plugin';\nimport { getRouterMonitoring } from './monitoring';\nimport { getAdapterManager } from './adapter';\nimport { createReactRouterAdapter } from './adapter/react-router';\n\nexport class RouterManager {\n private static instance: RouterManager | null = null;\n\n /**\n * 路由实例\n * 只能在 initialize 方法中赋值\n */\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 是否已初始化\n */\n private initialized = false;\n\n /**\n * 路由缓存实例\n */\n private cache = getRouteCache();\n\n /**\n * 路由预加载器实例\n */\n private preloader = getRoutePreloader();\n\n /**\n * 路由插件管理器实例\n */\n private pluginManager = getRouterPluginManager();\n\n /**\n * 路由监控服务实例\n */\n private monitoring = getRouterMonitoring();\n\n /**\n * 路由适配器管理器实例\n */\n private adapterManager = getAdapterManager();\n\n private constructor() {\n // 私有构造函数\n // 注册默认的 React Router 适配器\n this.adapterManager.register({\n name: 'react-router',\n factory: createReactRouterAdapter(),\n priority: 10,\n });\n }\n /**\n * 获取单例实例\n */\n static getInstance(): RouterManager {\n if (!RouterManager.instance) {\n RouterManager.instance = new RouterManager();\n }\n return RouterManager.instance;\n }\n /**\n * 初始化路由管理器\n * \n * @param config - 路由配置\n * @param _appInstance - 应用实例(保留用于兼容性,当前未使用)\n */\n async initialize(config: RouterConfig): Promise<void> {\n // 如果路由被禁用,直接返回\n if (config.enabled === false || config.enabled === 'disabled') {\n logger.info('路由系统已禁用');\n return;\n }\n\n // 配置验证(如果启用)\n if (config.enableValidation !== false) {\n try {\n RouterConfigValidator.validate(config);\n logger.debug('路由配置验证通过');\n } catch (error) {\n logger.error('路由配置验证失败', error);\n // 开发环境下抛出错误,生产环境下记录警告但继续执行\n if (process.env.NODE_ENV === 'development') {\n throw error;\n }\n }\n }\n\n // 执行插件钩子:路由初始化前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_INIT, {\n config,\n });\n\n // 注册生命周期钩子\n if (config.hooks) {\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.register(config.hooks);\n logger.debug('路由生命周期钩子已注册');\n }\n\n // 转换数据(使用缓存)\n if (!config.routes) {\n throw new RouterError(\n '路由配置不能为空',\n RouterErrorCode.ROUTER_CONFIG_ERROR\n );\n }\n\n // 更新预加载策略(默认关闭,按需懒加载)\n this.preloader.updateConfig(config.preload);\n this.preloader.clear();\n\n let result;\n const cacheKey = config.routes;\n const cachedResult = this.cache.get(cacheKey);\n\n if (cachedResult) {\n logger.debug('使用缓存的路由转换结果');\n result = cachedResult;\n } else {\n // 执行插件钩子:路由转换前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_TRANSFORM, {\n config,\n });\n\n result = await transformRoutes(config.routes, config.transformOptions);\n\n // 执行插件钩子:路由转换后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_TRANSFORM, {\n config,\n routes: result.routes,\n });\n\n // 缓存转换结果\n this.cache.set(cacheKey, result);\n }\n\n const reactRoutes = await transformRoutesToReactRoutes(\n result.routes,\n result,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent,\n );\n\n // 注册路由到预加载器\n if (result.routes) {\n this.preloader.registerRoutes(result.routes, result);\n // 开始预加载\n this.preloader.startPreload();\n }\n\n await this.resolveInitialLazyRoutes(reactRoutes);\n\n let routerInstance: ReturnType<typeof createBrowserRouter> | null = null;\n if (config.mode === 'browser') {\n routerInstance = createBrowserRouter(reactRoutes, config.options);\n } else if (config.mode === 'hash') {\n routerInstance = createHashRouter(reactRoutes, config.options);\n } else if (config.mode === 'memory') {\n routerInstance = createMemoryRouter(reactRoutes, config.options);\n }\n\n if (!routerInstance) {\n throw new RouterError(\n '路由模式不支持',\n RouterErrorCode.ROUTER_CONFIG_ERROR,\n undefined,\n undefined,\n { mode: config.mode }\n );\n }\n\n // 只能在 initialize 方法中赋值\n this.router = routerInstance;\n this.initialized = true;\n\n // 执行插件钩子:路由初始化后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_INIT, {\n config,\n routes: result.routes,\n });\n\n // 记录监控:路由初始化完成\n const initialPath = typeof window !== 'undefined'\n ? `${window.location.pathname}${window.location.search}${window.location.hash}`\n : this.router?.state?.location?.pathname ?? '/';\n\n this.monitoring.trackRouteAccess(\n {\n path: initialPath,\n meta: { name: 'router-init' },\n },\n undefined,\n true\n );\n\n logger.info('路由管理器初始化完成');\n }\n\n /**\n * 预解析当前 URL 命中的 lazy 路由,避免首屏长时间停留在 hydrate fallback。\n * 非首屏路由仍保持懒加载,保留代码分割收益。\n */\n private async resolveInitialLazyRoutes(routes: RouteObject[]): Promise<void> {\n if (typeof window === 'undefined') {\n return;\n }\n\n const matches = matchRoutes(routes, window.location.pathname) ?? [];\n if (matches.length === 0) {\n return;\n }\n\n await Promise.all(\n matches.map(async ({ route }) => {\n const lazy = route.lazy;\n if (typeof lazy !== 'function') {\n return;\n }\n\n try {\n const resolved = await lazy();\n Object.assign(route, resolved);\n delete (route as RouteObject & { lazy?: unknown }).lazy;\n } catch (error) {\n logger.warn('首屏路由懒加载预解析失败,回退到 Router 默认懒加载', error);\n }\n }),\n );\n }\n\n /**\n * 获取路由实例\n * \n * @returns 路由实例,如果未初始化则返回 null\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 检查是否已初始化\n * \n * @returns 如果已初始化返回 true,否则返回 false\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 销毁路由管理器\n */\n destroy(): void {\n // 执行插件钩子:销毁\n this.pluginManager.executeHooks(PluginLifecycleStage.DESTROY, {\n config: {} as RouterConfig,\n });\n\n // 停止预加载\n this.preloader.stopPreload();\n\n this.router = null;\n this.initialized = false;\n \n // 清空生命周期钩子和中间件\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.clear();\n \n const middlewareManager = getRouterMiddlewareManager();\n middlewareManager.clear();\n \n logger.info('路由管理器已销毁');\n }\n\n /**\n * 获取路由缓存实例\n */\n getCache() {\n return this.cache;\n }\n\n /**\n * 获取路由预加载器实例\n */\n getPreloader() {\n return this.preloader;\n }\n\n /**\n * 获取路由插件管理器实例\n */\n getPluginManager() {\n return this.pluginManager;\n }\n\n /**\n * 获取路由监控服务实例\n */\n getMonitoring() {\n return this.monitoring;\n }\n}\n\n/**\n * 获取路由管理器\n */\nexport function getRouterManager(): RouterManager {\n return RouterManager.getInstance();\n}\n"],"names":["logger","transformRoutes","transformRoutesToReactRoutes","createBrowserRouter","createHashRouter","createMemoryRouter","matchRoutes","RouterConfigValidator","getRouterLifecycleManager","getRouterMiddlewareManager","RouterError","RouterErrorCode","getRouteCache","getRoutePreloader","getRouterPluginManager","PluginLifecycleStage","getRouterMonitoring","getAdapterManager","createReactRouterAdapter","RouterManager","getInstance","instance","initialize","config","enabled","info","enableValidation","validate","debug","error","process","env","NODE_ENV","pluginManager","executeHooks","BEFORE_INIT","hooks","lifecycleManager","register","routes","ROUTER_CONFIG_ERROR","preloader","updateConfig","preload","clear","result","cacheKey","cachedResult","cache","get","BEFORE_TRANSFORM","transformOptions","AFTER_TRANSFORM","set","reactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","registerRoutes","startPreload","resolveInitialLazyRoutes","routerInstance","mode","options","undefined","router","initialized","AFTER_INIT","initialPath","window","location","pathname","search","hash","state","monitoring","trackRouteAccess","path","meta","name","matches","length","Promise","all","map","route","lazy","resolved","Object","assign","warn","getRouter","isInitialized","destroy","DESTROY","stopPreload","middlewareManager","getCache","getPreloader","getPluginManager","getMonitoring","adapterManager","factory","priority","getRouterManager"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/core/router/adapter/react-router/ReactRouterAdapter.ts"],"sourcesContent":["/**\n * React Router 适配器实现\n */\n\nimport type { IRouterAdapter, RouterAdapterConfig } from '../types';\nimport type { RouteLocation, NavigateOptions } from '../../types';\nimport type { AppInstance } from '../../../startup/AppInstance';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { transformRoutesToReactRoutes } from '../../utils/adapters/react-router/transform';\nimport { transformRoutes } from '../../utils/transform';\nimport { logger } from '../../../../utils';\n\n/**\n * React Router 适配器\n */\nexport class ReactRouterAdapter implements IRouterAdapter {\n readonly name = 'react-router';\n readonly version = '6.0.0';\n\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 初始化适配器\n */\n async initialize(config: RouterAdapterConfig): Promise<void> {\n\n // 转换路由配置\n const transformResult = await transformRoutes(config.routes);\n const reactRoutes = await transformRoutesToReactRoutes(\n transformResult.routes,\n transformResult,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent
|
|
1
|
+
{"version":3,"sources":["../../../../../src/core/router/adapter/react-router/ReactRouterAdapter.ts"],"sourcesContent":["/**\n * React Router 适配器实现\n */\n\nimport type { IRouterAdapter, RouterAdapterConfig } from '../types';\nimport type { RouteLocation, NavigateOptions } from '../../types';\nimport type { AppInstance } from '../../../startup/AppInstance';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { transformRoutesToReactRoutes } from '../../utils/adapters/react-router/transform';\nimport { transformRoutes } from '../../utils/transform';\nimport { logger } from '../../../../utils';\n\n/**\n * React Router 适配器\n */\nexport class ReactRouterAdapter implements IRouterAdapter {\n readonly name = 'react-router';\n readonly version = '6.0.0';\n\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 初始化适配器\n */\n async initialize(config: RouterAdapterConfig): Promise<void> {\n\n // 转换路由配置\n const transformResult = await transformRoutes(config.routes);\n const reactRoutes = await transformRoutesToReactRoutes(\n transformResult.routes,\n transformResult,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent,\n );\n\n // 创建路由实例\n const mode = config.mode || 'browser';\n if (mode === 'browser') {\n this.router = createBrowserRouter(reactRoutes, config.options as any);\n } else if (mode === 'hash') {\n this.router = createHashRouter(reactRoutes, config.options as any);\n } else if (mode === 'memory') {\n this.router = createMemoryRouter(reactRoutes, config.options as any);\n } else {\n throw new Error(`不支持的路由模式: ${mode}`);\n }\n\n logger.debug('React Router 适配器初始化完成');\n }\n\n /**\n * 挂载到应用实例\n */\n mount(_app: AppInstance): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n // React Router 适配器通过 RouterProvider 挂载\n // 实际的挂载逻辑在 renderApp 中处理\n logger.debug('React Router 适配器已挂载');\n }\n\n /**\n * 导航到指定路径\n */\n navigate(to: string, options?: NavigateOptions): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n if (options?.replace) {\n this.router.navigate(to, { replace: true, state: options.state });\n } else {\n this.router.navigate(to, { state: options?.state });\n }\n }\n\n /**\n * 获取当前路由信息\n */\n getCurrentRoute(): RouteLocation {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n const state = this.router.state;\n const location = state.location;\n\n // 解析查询参数\n const query: Record<string, unknown> = {};\n if (location.search) {\n const params = new URLSearchParams(location.search);\n params.forEach((value, key) => {\n query[key] = value;\n });\n }\n\n return {\n path: location.pathname + location.hash,\n query,\n params: location.state as Record<string, unknown> | undefined,\n };\n }\n\n /**\n * 获取路由实例(用于 RouterProvider)\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 销毁适配器\n */\n destroy(): void {\n this.router = null;\n logger.debug('React Router 适配器已销毁');\n }\n}\n\n/**\n * 创建 React Router 适配器工厂函数\n */\nexport function createReactRouterAdapter(): (_config: RouterAdapterConfig) => IRouterAdapter {\n return (_config: RouterAdapterConfig) => {\n return new ReactRouterAdapter();\n };\n}\n"],"names":["ReactRouterAdapter","createReactRouterAdapter","initialize","config","transformResult","transformRoutes","routes","reactRoutes","transformRoutesToReactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","mode","router","createBrowserRouter","options","createHashRouter","createMemoryRouter","Error","logger","debug","mount","_app","navigate","to","replace","state","getCurrentRoute","location","query","search","params","URLSearchParams","forEach","value","key","path","pathname","hash","getRouter","destroy","name","version","_config"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAaYA;eAAAA;;QA6GGC;eAAAA;;;gCArH0D;2BAC7B;4BACb;uBACT;;;;;;;;;;;;;;AAKhB,IAAA,AAAMD,qBAAN,MAAMA;IAMX;;GAEC,GACD,MAAME,WAAWC,MAA2B,EAAiB;QAE3D,SAAS;QACT,MAAMC,kBAAkB,MAAMC,IAAAA,2BAAe,EAACF,OAAOG,MAAM;QAC3D,MAAMC,cAAc,MAAMC,IAAAA,uCAA4B,EACpDJ,gBAAgBE,MAAM,EACtBF,iBACAD,OAAOM,0BAA0B,EACjCN,OAAOO,4BAA4B;QAGrC,SAAS;QACT,MAAMC,OAAOR,OAAOQ,IAAI,IAAI;QAC5B,IAAIA,SAAS,WAAW;YACtB,IAAI,CAACC,MAAM,GAAGC,IAAAA,mCAAmB,EAACN,aAAaJ,OAAOW,OAAO;QAC/D,OAAO,IAAIH,SAAS,QAAQ;YAC1B,IAAI,CAACC,MAAM,GAAGG,IAAAA,gCAAgB,EAACR,aAAaJ,OAAOW,OAAO;QAC5D,OAAO,IAAIH,SAAS,UAAU;YAC5B,IAAI,CAACC,MAAM,GAAGI,IAAAA,kCAAkB,EAACT,aAAaJ,OAAOW,OAAO;QAC9D,OAAO;YACL,MAAM,IAAIG,MAAM,CAAC,UAAU,EAAEN,MAAM;QACrC;QAEAO,aAAM,CAACC,KAAK,CAAC;IACf;IAEA;;GAEC,GACDC,MAAMC,IAAiB,EAAQ;QAC7B,IAAI,CAAC,IAAI,CAACT,MAAM,EAAE;YAChB,MAAM,IAAIK,MAAM;QAClB;QAEA,uCAAuC;QACvC,yBAAyB;QACzBC,aAAM,CAACC,KAAK,CAAC;IACf;IAEA;;GAEC,GACDG,SAASC,EAAU,EAAET,OAAyB,EAAQ;QACpD,IAAI,CAAC,IAAI,CAACF,MAAM,EAAE;YAChB,MAAM,IAAIK,MAAM;QAClB;QAEA,IAAIH,SAASU,SAAS;YACpB,IAAI,CAACZ,MAAM,CAACU,QAAQ,CAACC,IAAI;gBAAEC,SAAS;gBAAMC,OAAOX,QAAQW,KAAK;YAAC;QACjE,OAAO;YACL,IAAI,CAACb,MAAM,CAACU,QAAQ,CAACC,IAAI;gBAAEE,OAAOX,SAASW;YAAM;QACnD;IACF;IAEA;;GAEC,GACDC,kBAAiC;QAC/B,IAAI,CAAC,IAAI,CAACd,MAAM,EAAE;YAChB,MAAM,IAAIK,MAAM;QAClB;QAEA,MAAMQ,QAAQ,IAAI,CAACb,MAAM,CAACa,KAAK;QAC/B,MAAME,WAAWF,MAAME,QAAQ;QAE/B,SAAS;QACT,MAAMC,QAAiC,CAAC;QACxC,IAAID,SAASE,MAAM,EAAE;YACnB,MAAMC,SAAS,IAAIC,gBAAgBJ,SAASE,MAAM;YAClDC,OAAOE,OAAO,CAAC,CAACC,OAAOC;gBACrBN,KAAK,CAACM,IAAI,GAAGD;YACf;QACF;QAEA,OAAO;YACLE,MAAMR,SAASS,QAAQ,GAAGT,SAASU,IAAI;YACvCT;YACAE,QAAQH,SAASF,KAAK;QACxB;IACF;IAEA;;GAEC,GACDa,YAA2D;QACzD,OAAO,IAAI,CAAC1B,MAAM;IACpB;IAEA;;GAEC,GACD2B,UAAgB;QACd,IAAI,CAAC3B,MAAM,GAAG;QACdM,aAAM,CAACC,KAAK,CAAC;IACf;;QAtGA,uBAASqB,QAAO;QAChB,uBAASC,WAAU;QAEnB,uBAAQ7B,UAAwD;;AAoGlE;AAKO,SAASX;IACd,OAAO,CAACyC;QACN,OAAO,IAAI1C;IACb;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/core/router/adapter/react-router/ReactRouterAdapter.ts"],"sourcesContent":["/**\n * React Router 适配器实现\n */\n\nimport type { IRouterAdapter, RouterAdapterConfig } from '../types';\nimport type { RouteLocation, NavigateOptions } from '../../types';\nimport type { AppInstance } from '../../../startup/AppInstance';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { transformRoutesToReactRoutes } from '../../utils/adapters/react-router/transform';\nimport { transformRoutes } from '../../utils/transform';\nimport { logger } from '../../../../utils';\n\n/**\n * React Router 适配器\n */\nexport class ReactRouterAdapter implements IRouterAdapter {\n readonly name = 'react-router';\n readonly version = '6.0.0';\n\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 初始化适配器\n */\n async initialize(config: RouterAdapterConfig): Promise<void> {\n\n // 转换路由配置\n const transformResult = await transformRoutes(config.routes);\n const reactRoutes = await transformRoutesToReactRoutes(\n transformResult.routes,\n transformResult,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent
|
|
1
|
+
{"version":3,"sources":["../../../../../src/core/router/adapter/react-router/ReactRouterAdapter.ts"],"sourcesContent":["/**\n * React Router 适配器实现\n */\n\nimport type { IRouterAdapter, RouterAdapterConfig } from '../types';\nimport type { RouteLocation, NavigateOptions } from '../../types';\nimport type { AppInstance } from '../../../startup/AppInstance';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { transformRoutesToReactRoutes } from '../../utils/adapters/react-router/transform';\nimport { transformRoutes } from '../../utils/transform';\nimport { logger } from '../../../../utils';\n\n/**\n * React Router 适配器\n */\nexport class ReactRouterAdapter implements IRouterAdapter {\n readonly name = 'react-router';\n readonly version = '6.0.0';\n\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 初始化适配器\n */\n async initialize(config: RouterAdapterConfig): Promise<void> {\n\n // 转换路由配置\n const transformResult = await transformRoutes(config.routes);\n const reactRoutes = await transformRoutesToReactRoutes(\n transformResult.routes,\n transformResult,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent,\n );\n\n // 创建路由实例\n const mode = config.mode || 'browser';\n if (mode === 'browser') {\n this.router = createBrowserRouter(reactRoutes, config.options as any);\n } else if (mode === 'hash') {\n this.router = createHashRouter(reactRoutes, config.options as any);\n } else if (mode === 'memory') {\n this.router = createMemoryRouter(reactRoutes, config.options as any);\n } else {\n throw new Error(`不支持的路由模式: ${mode}`);\n }\n\n logger.debug('React Router 适配器初始化完成');\n }\n\n /**\n * 挂载到应用实例\n */\n mount(_app: AppInstance): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n // React Router 适配器通过 RouterProvider 挂载\n // 实际的挂载逻辑在 renderApp 中处理\n logger.debug('React Router 适配器已挂载');\n }\n\n /**\n * 导航到指定路径\n */\n navigate(to: string, options?: NavigateOptions): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n if (options?.replace) {\n this.router.navigate(to, { replace: true, state: options.state });\n } else {\n this.router.navigate(to, { state: options?.state });\n }\n }\n\n /**\n * 获取当前路由信息\n */\n getCurrentRoute(): RouteLocation {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n const state = this.router.state;\n const location = state.location;\n\n // 解析查询参数\n const query: Record<string, unknown> = {};\n if (location.search) {\n const params = new URLSearchParams(location.search);\n params.forEach((value, key) => {\n query[key] = value;\n });\n }\n\n return {\n path: location.pathname + location.hash,\n query,\n params: location.state as Record<string, unknown> | undefined,\n };\n }\n\n /**\n * 获取路由实例(用于 RouterProvider)\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 销毁适配器\n */\n destroy(): void {\n this.router = null;\n logger.debug('React Router 适配器已销毁');\n }\n}\n\n/**\n * 创建 React Router 适配器工厂函数\n */\nexport function createReactRouterAdapter(): (_config: RouterAdapterConfig) => IRouterAdapter {\n return (_config: RouterAdapterConfig) => {\n return new ReactRouterAdapter();\n };\n}\n"],"names":["createBrowserRouter","createHashRouter","createMemoryRouter","transformRoutesToReactRoutes","transformRoutes","logger","ReactRouterAdapter","initialize","config","transformResult","routes","reactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","mode","router","options","Error","debug","mount","_app","navigate","to","replace","state","getCurrentRoute","location","query","search","params","URLSearchParams","forEach","value","key","path","pathname","hash","getRouter","destroy","name","version","createReactRouterAdapter","_config"],"mappings":"AAAA;;CAEC;;;;;;;;;;;;;AAKD,SAASA,mBAAmB,EAAEC,gBAAgB,EAAEC,kBAAkB,QAAQ,mBAAmB;AAC7F,SAASC,4BAA4B,QAAQ,8CAA8C;AAC3F,SAASC,eAAe,QAAQ,wBAAwB;AACxD,SAASC,MAAM,QAAQ,oBAAoB;AAE3C;;CAEC,GACD,OAAO,MAAMC;IAMX;;GAEC,GACD,MAAMC,WAAWC,MAA2B,EAAiB;QAE3D,SAAS;QACT,MAAMC,kBAAkB,MAAML,gBAAgBI,OAAOE,MAAM;QAC3D,MAAMC,cAAc,MAAMR,6BACxBM,gBAAgBC,MAAM,EACtBD,iBACAD,OAAOI,0BAA0B,EACjCJ,OAAOK,4BAA4B;QAGrC,SAAS;QACT,MAAMC,OAAON,OAAOM,IAAI,IAAI;QAC5B,IAAIA,SAAS,WAAW;YACtB,IAAI,CAACC,MAAM,GAAGf,oBAAoBW,aAAaH,OAAOQ,OAAO;QAC/D,OAAO,IAAIF,SAAS,QAAQ;YAC1B,IAAI,CAACC,MAAM,GAAGd,iBAAiBU,aAAaH,OAAOQ,OAAO;QAC5D,OAAO,IAAIF,SAAS,UAAU;YAC5B,IAAI,CAACC,MAAM,GAAGb,mBAAmBS,aAAaH,OAAOQ,OAAO;QAC9D,OAAO;YACL,MAAM,IAAIC,MAAM,CAAC,UAAU,EAAEH,MAAM;QACrC;QAEAT,OAAOa,KAAK,CAAC;IACf;IAEA;;GAEC,GACDC,MAAMC,IAAiB,EAAQ;QAC7B,IAAI,CAAC,IAAI,CAACL,MAAM,EAAE;YAChB,MAAM,IAAIE,MAAM;QAClB;QAEA,uCAAuC;QACvC,yBAAyB;QACzBZ,OAAOa,KAAK,CAAC;IACf;IAEA;;GAEC,GACDG,SAASC,EAAU,EAAEN,OAAyB,EAAQ;QACpD,IAAI,CAAC,IAAI,CAACD,MAAM,EAAE;YAChB,MAAM,IAAIE,MAAM;QAClB;QAEA,IAAID,SAASO,SAAS;YACpB,IAAI,CAACR,MAAM,CAACM,QAAQ,CAACC,IAAI;gBAAEC,SAAS;gBAAMC,OAAOR,QAAQQ,KAAK;YAAC;QACjE,OAAO;YACL,IAAI,CAACT,MAAM,CAACM,QAAQ,CAACC,IAAI;gBAAEE,OAAOR,SAASQ;YAAM;QACnD;IACF;IAEA;;GAEC,GACDC,kBAAiC;QAC/B,IAAI,CAAC,IAAI,CAACV,MAAM,EAAE;YAChB,MAAM,IAAIE,MAAM;QAClB;QAEA,MAAMO,QAAQ,IAAI,CAACT,MAAM,CAACS,KAAK;QAC/B,MAAME,WAAWF,MAAME,QAAQ;QAE/B,SAAS;QACT,MAAMC,QAAiC,CAAC;QACxC,IAAID,SAASE,MAAM,EAAE;YACnB,MAAMC,SAAS,IAAIC,gBAAgBJ,SAASE,MAAM;YAClDC,OAAOE,OAAO,CAAC,CAACC,OAAOC;gBACrBN,KAAK,CAACM,IAAI,GAAGD;YACf;QACF;QAEA,OAAO;YACLE,MAAMR,SAASS,QAAQ,GAAGT,SAASU,IAAI;YACvCT;YACAE,QAAQH,SAASF,KAAK;QACxB;IACF;IAEA;;GAEC,GACDa,YAA2D;QACzD,OAAO,IAAI,CAACtB,MAAM;IACpB;IAEA;;GAEC,GACDuB,UAAgB;QACd,IAAI,CAACvB,MAAM,GAAG;QACdV,OAAOa,KAAK,CAAC;IACf;;QAtGA,uBAASqB,QAAO;QAChB,uBAASC,WAAU;QAEnB,uBAAQzB,UAAwD;;AAoGlE;AAEA;;CAEC,GACD,OAAO,SAAS0B;IACd,OAAO,CAACC;QACN,OAAO,IAAIpC;IACb;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/dev/RouterDevTools.tsx"],"sourcesContent":["/**\n * 路由调试工具(开发环境,无 UI 框架依赖)\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { getRouterManager } from '../RouterManager';\nimport { getRouterLifecycleManager } from '../lifecycle';\nimport { getRouterMiddlewareManager } from '../middleware';\nimport { RouterNavigation } from '../navigation';\nimport type { RouteLocation } from '../types';\n\nfunction pretty(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function RouterDevTools(): React.ReactElement | null {\n if (process.env.NODE_ENV !== 'development') {\n return null;\n }\n\n const [visible, setVisible] = useState(false);\n const [currentRoute, setCurrentRoute] = useState<RouteLocation | null>(null);\n const [routeState, setRouteState] = useState<Record<string, unknown>>({});\n const [lifecycleHooks, setLifecycleHooks] = useState<
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/dev/RouterDevTools.tsx"],"sourcesContent":["/**\n * 路由调试工具(开发环境,无 UI 框架依赖)\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { getRouterManager } from '../RouterManager';\nimport { getRouterLifecycleManager } from '../lifecycle';\nimport { getRouterMiddlewareManager } from '../middleware';\nimport { RouterNavigation } from '../navigation';\nimport type { RouteLocation } from '../types';\n\nfunction pretty(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function RouterDevTools(): React.ReactElement | null {\n if (process.env.NODE_ENV !== 'development') {\n return null;\n }\n\n const [visible, setVisible] = useState(false);\n const [currentRoute, setCurrentRoute] = useState<RouteLocation | null>(null);\n const [routeState, setRouteState] = useState<Record<string, unknown>>({});\n const [lifecycleHooks, setLifecycleHooks] = useState<\n Array<{ key: number; hasBeforeEach: boolean; hasAfterEach: boolean }>\n >([]);\n const [middlewares, setMiddlewares] = useState<\n Array<{ key: number; name: string; priority: number; enabled: boolean }>\n >([]);\n\n const updateRouteInfo = () => {\n try {\n const route = RouterNavigation.getCurrentRoute();\n setCurrentRoute(route);\n\n const router = getRouterManager().getRouter();\n if (router) {\n const state = router.state;\n setRouteState({\n pathname: state.location.pathname,\n search: state.location.search || '',\n hash: state.location.hash || '',\n state: state.location.state || {},\n });\n } else {\n setRouteState({});\n }\n\n const hooks = getRouterLifecycleManager().getAll();\n setLifecycleHooks(hooks.map((hook, index) => ({\n key: index,\n hasBeforeEach: !!hook.beforeEach,\n hasAfterEach: !!hook.afterEach,\n })));\n\n const middlewareList = getRouterMiddlewareManager().getAll();\n setMiddlewares(middlewareList.map((m, index) => ({\n key: index,\n name: m.name || `middleware-${index}`,\n priority: m.priority || 100,\n enabled: m.enabled !== false,\n })));\n } catch (error) {\n console.error('更新路由信息失败', error);\n }\n };\n\n useEffect(() => {\n if (!visible) {\n return;\n }\n updateRouteInfo();\n const timer = setInterval(updateRouteInfo, 1000);\n return () => clearInterval(timer);\n }, [visible]);\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setVisible(true)}\n style={{\n position: 'fixed',\n right: 20,\n bottom: 20,\n zIndex: 9999,\n border: 'none',\n background: '#2f80ed',\n color: '#fff',\n borderRadius: 999,\n padding: '8px 12px',\n cursor: 'pointer',\n }}\n >\n 路由调试\n </button>\n\n {visible && (\n <div\n style={{\n position: 'fixed',\n top: 0,\n right: 0,\n width: 'min(800px, 96vw)',\n height: '100vh',\n zIndex: 10000,\n background: '#fff',\n borderLeft: '1px solid #d9e2ec',\n boxShadow: '-8px 0 20px rgba(0, 0, 0, 0.08)',\n padding: 16,\n overflowY: 'auto',\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <h3 style={{ margin: 0 }}>路由调试工具</h3>\n <div style={{ display: 'flex', gap: 8 }}>\n <button onClick={updateRouteInfo}>刷新</button>\n <button onClick={() => setVisible(false)}>关闭</button>\n </div>\n </div>\n\n <section style={{ marginTop: 12 }}>\n <h4>当前路由</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(currentRoute || {})}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>路由状态</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(routeState)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>生命周期钩子</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(lifecycleHooks)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>中间件</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(middlewares)}\n </pre>\n </section>\n </div>\n )}\n </>\n );\n}\n"],"names":["RouterDevTools","pretty","value","JSON","stringify","String","process","env","NODE_ENV","visible","setVisible","useState","currentRoute","setCurrentRoute","routeState","setRouteState","lifecycleHooks","setLifecycleHooks","middlewares","setMiddlewares","updateRouteInfo","route","RouterNavigation","getCurrentRoute","router","getRouterManager","getRouter","state","pathname","location","search","hash","hooks","getRouterLifecycleManager","getAll","map","hook","index","key","hasBeforeEach","beforeEach","hasAfterEach","afterEach","middlewareList","getRouterMiddlewareManager","m","name","priority","enabled","error","console","useEffect","timer","setInterval","clearInterval","button","type","onClick","style","position","right","bottom","zIndex","border","background","color","borderRadius","padding","cursor","div","top","width","height","borderLeft","boxShadow","overflowY","display","justifyContent","alignItems","h3","margin","gap","section","marginTop","h4","pre"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/dev/RouterDevTools.tsx"],"sourcesContent":["/**\n * 路由调试工具(开发环境,无 UI 框架依赖)\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { getRouterManager } from '../RouterManager';\nimport { getRouterLifecycleManager } from '../lifecycle';\nimport { getRouterMiddlewareManager } from '../middleware';\nimport { RouterNavigation } from '../navigation';\nimport type { RouteLocation } from '../types';\n\nfunction pretty(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function RouterDevTools(): React.ReactElement | null {\n if (process.env.NODE_ENV !== 'development') {\n return null;\n }\n\n const [visible, setVisible] = useState(false);\n const [currentRoute, setCurrentRoute] = useState<RouteLocation | null>(null);\n const [routeState, setRouteState] = useState<Record<string, unknown>>({});\n const [lifecycleHooks, setLifecycleHooks] = useState<
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/dev/RouterDevTools.tsx"],"sourcesContent":["/**\n * 路由调试工具(开发环境,无 UI 框架依赖)\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { getRouterManager } from '../RouterManager';\nimport { getRouterLifecycleManager } from '../lifecycle';\nimport { getRouterMiddlewareManager } from '../middleware';\nimport { RouterNavigation } from '../navigation';\nimport type { RouteLocation } from '../types';\n\nfunction pretty(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function RouterDevTools(): React.ReactElement | null {\n if (process.env.NODE_ENV !== 'development') {\n return null;\n }\n\n const [visible, setVisible] = useState(false);\n const [currentRoute, setCurrentRoute] = useState<RouteLocation | null>(null);\n const [routeState, setRouteState] = useState<Record<string, unknown>>({});\n const [lifecycleHooks, setLifecycleHooks] = useState<\n Array<{ key: number; hasBeforeEach: boolean; hasAfterEach: boolean }>\n >([]);\n const [middlewares, setMiddlewares] = useState<\n Array<{ key: number; name: string; priority: number; enabled: boolean }>\n >([]);\n\n const updateRouteInfo = () => {\n try {\n const route = RouterNavigation.getCurrentRoute();\n setCurrentRoute(route);\n\n const router = getRouterManager().getRouter();\n if (router) {\n const state = router.state;\n setRouteState({\n pathname: state.location.pathname,\n search: state.location.search || '',\n hash: state.location.hash || '',\n state: state.location.state || {},\n });\n } else {\n setRouteState({});\n }\n\n const hooks = getRouterLifecycleManager().getAll();\n setLifecycleHooks(hooks.map((hook, index) => ({\n key: index,\n hasBeforeEach: !!hook.beforeEach,\n hasAfterEach: !!hook.afterEach,\n })));\n\n const middlewareList = getRouterMiddlewareManager().getAll();\n setMiddlewares(middlewareList.map((m, index) => ({\n key: index,\n name: m.name || `middleware-${index}`,\n priority: m.priority || 100,\n enabled: m.enabled !== false,\n })));\n } catch (error) {\n console.error('更新路由信息失败', error);\n }\n };\n\n useEffect(() => {\n if (!visible) {\n return;\n }\n updateRouteInfo();\n const timer = setInterval(updateRouteInfo, 1000);\n return () => clearInterval(timer);\n }, [visible]);\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setVisible(true)}\n style={{\n position: 'fixed',\n right: 20,\n bottom: 20,\n zIndex: 9999,\n border: 'none',\n background: '#2f80ed',\n color: '#fff',\n borderRadius: 999,\n padding: '8px 12px',\n cursor: 'pointer',\n }}\n >\n 路由调试\n </button>\n\n {visible && (\n <div\n style={{\n position: 'fixed',\n top: 0,\n right: 0,\n width: 'min(800px, 96vw)',\n height: '100vh',\n zIndex: 10000,\n background: '#fff',\n borderLeft: '1px solid #d9e2ec',\n boxShadow: '-8px 0 20px rgba(0, 0, 0, 0.08)',\n padding: 16,\n overflowY: 'auto',\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <h3 style={{ margin: 0 }}>路由调试工具</h3>\n <div style={{ display: 'flex', gap: 8 }}>\n <button onClick={updateRouteInfo}>刷新</button>\n <button onClick={() => setVisible(false)}>关闭</button>\n </div>\n </div>\n\n <section style={{ marginTop: 12 }}>\n <h4>当前路由</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(currentRoute || {})}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>路由状态</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(routeState)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>生命周期钩子</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(lifecycleHooks)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>中间件</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(middlewares)}\n </pre>\n </section>\n </div>\n )}\n </>\n );\n}\n"],"names":["React","useState","useEffect","getRouterManager","getRouterLifecycleManager","getRouterMiddlewareManager","RouterNavigation","pretty","value","JSON","stringify","String","RouterDevTools","process","env","NODE_ENV","visible","setVisible","currentRoute","setCurrentRoute","routeState","setRouteState","lifecycleHooks","setLifecycleHooks","middlewares","setMiddlewares","updateRouteInfo","route","getCurrentRoute","router","getRouter","state","pathname","location","search","hash","hooks","getAll","map","hook","index","key","hasBeforeEach","beforeEach","hasAfterEach","afterEach","middlewareList","m","name","priority","enabled","error","console","timer","setInterval","clearInterval","button","type","onClick","style","position","right","bottom","zIndex","border","background","color","borderRadius","padding","cursor","div","top","width","height","borderLeft","boxShadow","overflowY","display","justifyContent","alignItems","h3","margin","gap","section","marginTop","h4","pre"],"mappings":"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"}
|
|
@@ -109,16 +109,35 @@ let RouterMiddlewareManager = class RouterMiddlewareManager {
|
|
|
109
109
|
for (const middlewareConfig of enabledMiddlewares){
|
|
110
110
|
try {
|
|
111
111
|
const result = await middlewareConfig.middleware(context);
|
|
112
|
-
// 如果中间件返回 false
|
|
113
|
-
if (
|
|
114
|
-
_utils.logger.debug(`路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'}
|
|
115
|
-
return
|
|
112
|
+
// 如果中间件返回 false,阻止导航
|
|
113
|
+
if (result === false) {
|
|
114
|
+
_utils.logger.debug(`路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'} -> false`);
|
|
115
|
+
return {
|
|
116
116
|
allow: false,
|
|
117
117
|
reason: '中间件返回 false'
|
|
118
118
|
};
|
|
119
119
|
}
|
|
120
|
+
// 如果中间件返回对象且 allow: false,阻止导航
|
|
121
|
+
if (typeof result === 'object' && result !== null && result.allow === false) {
|
|
122
|
+
_utils.logger.debug(`路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'}`, result);
|
|
123
|
+
if (result.redirect && !RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result.redirect)) {
|
|
124
|
+
_utils.logger.warn(`路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name || 'anonymous'} -> ${result.redirect}`);
|
|
125
|
+
return {
|
|
126
|
+
allow: false,
|
|
127
|
+
reason: '中间件返回了不安全的重定向地址'
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
120
132
|
// 如果中间件返回字符串,重定向到该路径
|
|
121
133
|
if (typeof result === 'string') {
|
|
134
|
+
if (!RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result)) {
|
|
135
|
+
_utils.logger.warn(`路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name || 'anonymous'} -> ${result}`);
|
|
136
|
+
return {
|
|
137
|
+
allow: false,
|
|
138
|
+
reason: '中间件返回了不安全的重定向地址'
|
|
139
|
+
};
|
|
140
|
+
}
|
|
122
141
|
_utils.logger.debug(`路由中间件重定向: ${middlewareConfig.name || 'anonymous'} -> ${result}`);
|
|
123
142
|
return {
|
|
124
143
|
allow: false,
|
|
@@ -162,6 +181,7 @@ let RouterMiddlewareManager = class RouterMiddlewareManager {
|
|
|
162
181
|
_define_property(this, "middlewares", []);
|
|
163
182
|
}
|
|
164
183
|
};
|
|
184
|
+
_define_property(RouterMiddlewareManager, "SAFE_REDIRECT_PATH_REGEX", /^(\/|\.\/|\.\.\/|#)/);
|
|
165
185
|
/**
|
|
166
186
|
* 获取路由中间件管理器单例
|
|
167
187
|
*/ let middlewareManagerInstance = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/middleware/RouterMiddlewareManager.ts"],"sourcesContent":["/**\n * 路由中间件管理器\n * 负责管理路由中间件的注册、执行和生命周期\n */\n\nimport { logger } from '../../../utils';\nimport type {\n RouterMiddlewareConfig,\n RouterMiddlewareContext,\n RouterMiddlewareResult,\n} from './types';\n\n/**\n * 路由中间件管理器\n */\nexport class RouterMiddlewareManager {\n private middlewares: RouterMiddlewareConfig[] = [];\n\n /**\n * 注册中间件\n * \n * @param config - 中间件配置\n * @returns 取消注册函数\n */\n register(config: RouterMiddlewareConfig): () => void {\n // 验证中间件配置\n if (!config.middleware || typeof config.middleware !== 'function') {\n throw new Error('中间件必须是一个函数');\n }\n\n // 设置默认值\n const middlewareConfig: RouterMiddlewareConfig = {\n priority: 100,\n enabled: true,\n ...config,\n };\n\n // 添加到中间件列表\n this.middlewares.push(middlewareConfig);\n\n // 按优先级排序\n this.middlewares.sort((a, b) => (a.priority || 100) - (b.priority || 100));\n\n logger.debug(`路由中间件已注册: ${middlewareConfig.name || 'anonymous'}`);\n\n // 返回取消注册函数\n return () => {\n const index = this.middlewares.indexOf(middlewareConfig);\n if (index > -1) {\n this.middlewares.splice(index, 1);\n logger.debug(`路由中间件已取消注册: ${middlewareConfig.name || 'anonymous'}`);\n }\n };\n }\n\n /**\n * 批量注册中间件\n * \n * @param configs - 中间件配置数组\n */\n registerBatch(configs: RouterMiddlewareConfig[]): void {\n configs.forEach((config) => this.register(config));\n }\n\n /**\n * 取消注册中间件\n * \n * @param name - 中间件名称\n */\n unregister(name: string): void {\n const index = this.middlewares.findIndex((m) => m.name === name);\n if (index > -1) {\n this.middlewares.splice(index, 1);\n logger.debug(`路由中间件已取消注册: ${name}`);\n }\n }\n\n /**\n * 清空所有中间件\n */\n clear(): void {\n this.middlewares = [];\n logger.debug('所有路由中间件已清空');\n }\n\n /**\n * 执行中间件链\n * \n * @param context - 中间件上下文\n * @returns 中间件执行结果\n */\n async execute(context: RouterMiddlewareContext): Promise<RouterMiddlewareResult> {\n // 过滤启用的中间件\n const enabledMiddlewares = this.middlewares.filter((m) => {\n if (!m.enabled) {\n return false;\n }\n\n // 检查条件函数\n if (m.condition && !m.condition(context)) {\n return false;\n }\n\n return true;\n });\n\n // 按顺序执行中间件\n for (const middlewareConfig of enabledMiddlewares) {\n try {\n const result = await middlewareConfig.middleware(context);\n\n // 如果中间件返回 false
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/middleware/RouterMiddlewareManager.ts"],"sourcesContent":["/**\n * 路由中间件管理器\n * 负责管理路由中间件的注册、执行和生命周期\n */\n\nimport { logger } from '../../../utils';\nimport type {\n RouterMiddlewareConfig,\n RouterMiddlewareContext,\n RouterMiddlewareResult,\n} from './types';\n\n/**\n * 路由中间件管理器\n */\nexport class RouterMiddlewareManager {\n private middlewares: RouterMiddlewareConfig[] = [];\n private static readonly SAFE_REDIRECT_PATH_REGEX = /^(\\/|\\.\\/|\\.\\.\\/|#)/;\n\n /**\n * 注册中间件\n * \n * @param config - 中间件配置\n * @returns 取消注册函数\n */\n register(config: RouterMiddlewareConfig): () => void {\n // 验证中间件配置\n if (!config.middleware || typeof config.middleware !== 'function') {\n throw new Error('中间件必须是一个函数');\n }\n\n // 设置默认值\n const middlewareConfig: RouterMiddlewareConfig = {\n priority: 100,\n enabled: true,\n ...config,\n };\n\n // 添加到中间件列表\n this.middlewares.push(middlewareConfig);\n\n // 按优先级排序\n this.middlewares.sort((a, b) => (a.priority || 100) - (b.priority || 100));\n\n logger.debug(`路由中间件已注册: ${middlewareConfig.name || 'anonymous'}`);\n\n // 返回取消注册函数\n return () => {\n const index = this.middlewares.indexOf(middlewareConfig);\n if (index > -1) {\n this.middlewares.splice(index, 1);\n logger.debug(`路由中间件已取消注册: ${middlewareConfig.name || 'anonymous'}`);\n }\n };\n }\n\n /**\n * 批量注册中间件\n * \n * @param configs - 中间件配置数组\n */\n registerBatch(configs: RouterMiddlewareConfig[]): void {\n configs.forEach((config) => this.register(config));\n }\n\n /**\n * 取消注册中间件\n * \n * @param name - 中间件名称\n */\n unregister(name: string): void {\n const index = this.middlewares.findIndex((m) => m.name === name);\n if (index > -1) {\n this.middlewares.splice(index, 1);\n logger.debug(`路由中间件已取消注册: ${name}`);\n }\n }\n\n /**\n * 清空所有中间件\n */\n clear(): void {\n this.middlewares = [];\n logger.debug('所有路由中间件已清空');\n }\n\n /**\n * 执行中间件链\n * \n * @param context - 中间件上下文\n * @returns 中间件执行结果\n */\n async execute(context: RouterMiddlewareContext): Promise<RouterMiddlewareResult> {\n // 过滤启用的中间件\n const enabledMiddlewares = this.middlewares.filter((m) => {\n if (!m.enabled) {\n return false;\n }\n\n // 检查条件函数\n if (m.condition && !m.condition(context)) {\n return false;\n }\n\n return true;\n });\n\n // 按顺序执行中间件\n for (const middlewareConfig of enabledMiddlewares) {\n try {\n const result = await middlewareConfig.middleware(context);\n\n // 如果中间件返回 false,阻止导航\n if (result === false) {\n logger.debug(\n `路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'} -> false`\n );\n return {\n allow: false,\n reason: '中间件返回 false',\n };\n }\n\n // 如果中间件返回对象且 allow: false,阻止导航\n if (typeof result === 'object' && result !== null && result.allow === false) {\n logger.debug(\n `路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'}`,\n result\n );\n\n if (result.redirect && !RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result.redirect)) {\n logger.warn(\n `路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name || 'anonymous'} -> ${result.redirect}`\n );\n return {\n allow: false,\n reason: '中间件返回了不安全的重定向地址',\n };\n }\n\n return result;\n }\n\n // 如果中间件返回字符串,重定向到该路径\n if (typeof result === 'string') {\n if (!RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result)) {\n logger.warn(\n `路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name || 'anonymous'} -> ${result}`\n );\n return {\n allow: false,\n reason: '中间件返回了不安全的重定向地址',\n };\n }\n\n logger.debug(\n `路由中间件重定向: ${middlewareConfig.name || 'anonymous'} -> ${result}`\n );\n\n return {\n allow: false,\n redirect: result,\n };\n }\n } catch (error) {\n logger.error(\n `路由中间件执行失败: ${middlewareConfig.name || 'anonymous'}`,\n error\n );\n\n // 中间件执行失败时,默认允许继续导航\n // 但记录错误以便调试\n continue;\n }\n }\n\n // 所有中间件都通过,允许导航\n return { allow: true };\n }\n\n /**\n * 获取所有中间件\n * \n * @returns 中间件配置数组\n */\n getAll(): RouterMiddlewareConfig[] {\n return [...this.middlewares];\n }\n\n /**\n * 获取启用的中间件\n * \n * @returns 启用的中间件配置数组\n */\n getEnabled(): RouterMiddlewareConfig[] {\n return this.middlewares.filter((m) => m.enabled);\n }\n\n /**\n * 获取中间件数量\n * \n * @returns 中间件数量\n */\n getCount(): number {\n return this.middlewares.length;\n }\n}\n\n/**\n * 获取路由中间件管理器单例\n */\nlet middlewareManagerInstance: RouterMiddlewareManager | null = null;\n\nexport function getRouterMiddlewareManager(): RouterMiddlewareManager {\n if (!middlewareManagerInstance) {\n middlewareManagerInstance = new RouterMiddlewareManager();\n }\n return middlewareManagerInstance;\n}\n"],"names":["RouterMiddlewareManager","getRouterMiddlewareManager","register","config","middleware","Error","middlewareConfig","priority","enabled","middlewares","push","sort","a","b","logger","debug","name","index","indexOf","splice","registerBatch","configs","forEach","unregister","findIndex","m","clear","execute","context","enabledMiddlewares","filter","condition","result","allow","reason","redirect","SAFE_REDIRECT_PATH_REGEX","test","warn","error","getAll","getEnabled","getCount","length","middlewareManagerInstance"],"mappings":"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"}
|