@vlian/framework 1.2.25 → 1.2.37

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.
Files changed (213) hide show
  1. package/dist/analytics.umd.js +208 -2395
  2. package/dist/analytics.umd.js.map +1 -1
  3. package/dist/core/error/ErrorHandler.cjs.map +1 -1
  4. package/dist/core/error/ErrorHandler.d.ts +1 -1
  5. package/dist/core/error/ErrorHandler.js.map +1 -1
  6. package/dist/core/router/monitoring/RouterMonitoring.cjs +1 -1
  7. package/dist/core/router/monitoring/RouterMonitoring.cjs.map +1 -1
  8. package/dist/core/router/monitoring/RouterMonitoring.js +1 -1
  9. package/dist/core/router/monitoring/RouterMonitoring.js.map +1 -1
  10. package/dist/core/router/utils/adapters/react-router/transform.cjs +4 -0
  11. package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
  12. package/dist/core/router/utils/adapters/react-router/transform.js +4 -0
  13. package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
  14. package/dist/core/startup/initializeServices.cjs +1 -1
  15. package/dist/core/startup/initializeServices.cjs.map +1 -1
  16. package/dist/core/startup/initializeServices.d.ts +1 -1
  17. package/dist/core/startup/initializeServices.js +1 -1
  18. package/dist/core/startup/initializeServices.js.map +1 -1
  19. package/dist/core/startup/performanceTracker.cjs.map +1 -1
  20. package/dist/core/startup/performanceTracker.d.ts +1 -1
  21. package/dist/core/startup/performanceTracker.js.map +1 -1
  22. package/dist/core/startup/renderApp.cjs +1 -1
  23. package/dist/core/startup/renderApp.cjs.map +1 -1
  24. package/dist/core/startup/renderApp.d.ts +1 -1
  25. package/dist/core/startup/renderApp.js +1 -1
  26. package/dist/core/startup/renderApp.js.map +1 -1
  27. package/dist/core/startup/startApp.cjs +2 -2
  28. package/dist/core/startup/startApp.cjs.map +1 -1
  29. package/dist/core/startup/startApp.js +3 -3
  30. package/dist/core/startup/startApp.js.map +1 -1
  31. package/dist/core/types.d.ts +1 -1
  32. package/dist/core/types.js.map +1 -1
  33. package/dist/index.cjs +15 -2
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.ts +6 -4
  36. package/dist/index.js +5 -4
  37. package/dist/index.js.map +1 -1
  38. package/dist/index.umd.js +11648 -32616
  39. package/dist/index.umd.js.map +1 -1
  40. package/dist/kernel/constants.cjs +67 -0
  41. package/dist/kernel/constants.cjs.map +1 -0
  42. package/dist/kernel/constants.d.ts +5 -0
  43. package/dist/kernel/constants.js +43 -0
  44. package/dist/kernel/constants.js.map +1 -0
  45. package/dist/kernel/index.cjs +40 -0
  46. package/dist/kernel/index.cjs.map +1 -0
  47. package/dist/kernel/index.d.ts +3 -0
  48. package/dist/kernel/index.js +4 -0
  49. package/dist/kernel/index.js.map +1 -0
  50. package/dist/kernel/kernel.cjs +296 -0
  51. package/dist/kernel/kernel.cjs.map +1 -0
  52. package/dist/kernel/kernel.d.ts +40 -0
  53. package/dist/kernel/kernel.js +272 -0
  54. package/dist/kernel/kernel.js.map +1 -0
  55. package/dist/kernel/manager/cacheManager.cjs +46 -0
  56. package/dist/kernel/manager/cacheManager.cjs.map +1 -0
  57. package/dist/kernel/manager/cacheManager.d.ts +6 -0
  58. package/dist/kernel/manager/cacheManager.js +36 -0
  59. package/dist/kernel/manager/cacheManager.js.map +1 -0
  60. package/dist/kernel/manager/i18nManager.cjs +68 -0
  61. package/dist/kernel/manager/i18nManager.cjs.map +1 -0
  62. package/dist/kernel/manager/i18nManager.d.ts +8 -0
  63. package/dist/kernel/manager/i18nManager.js +58 -0
  64. package/dist/kernel/manager/i18nManager.js.map +1 -0
  65. package/dist/kernel/manager/index.cjs +30 -0
  66. package/dist/kernel/manager/index.cjs.map +1 -0
  67. package/dist/kernel/manager/index.d.ts +4 -0
  68. package/dist/kernel/manager/index.js +6 -0
  69. package/dist/kernel/manager/index.js.map +1 -0
  70. package/dist/kernel/manager/loggerManager.cjs +70 -0
  71. package/dist/kernel/manager/loggerManager.cjs.map +1 -0
  72. package/dist/kernel/manager/loggerManager.d.ts +14 -0
  73. package/dist/kernel/manager/loggerManager.js +60 -0
  74. package/dist/kernel/manager/loggerManager.js.map +1 -0
  75. package/dist/kernel/manager/persistence.cjs +93 -0
  76. package/dist/kernel/manager/persistence.cjs.map +1 -0
  77. package/dist/kernel/manager/persistence.d.ts +3 -0
  78. package/dist/kernel/manager/persistence.js +75 -0
  79. package/dist/kernel/manager/persistence.js.map +1 -0
  80. package/dist/kernel/manager/themeManager.cjs +85 -0
  81. package/dist/kernel/manager/themeManager.cjs.map +1 -0
  82. package/dist/kernel/manager/themeManager.d.ts +9 -0
  83. package/dist/kernel/manager/themeManager.js +75 -0
  84. package/dist/kernel/manager/themeManager.js.map +1 -0
  85. package/dist/kernel/types.cjs +6 -0
  86. package/dist/kernel/types.cjs.map +1 -0
  87. package/dist/kernel/types.d.ts +72 -0
  88. package/dist/kernel/types.js +3 -0
  89. package/dist/kernel/types.js.map +1 -0
  90. package/dist/request/adapter.d.ts +1 -0
  91. package/dist/request/core.d.ts +1 -0
  92. package/dist/request/index.d.ts +1 -42
  93. package/dist/request/plugin/csrfPlugin.d.ts +2 -2
  94. package/dist/request/plugin/queue.d.ts +2 -2
  95. package/dist/request/plugin.d.ts +1 -0
  96. package/dist/request/runtime.d.ts +1 -0
  97. package/dist/request/types.d.ts +1 -394
  98. package/dist/request/utils.d.ts +1 -0
  99. package/dist/state.umd.js +1 -1
  100. package/dist/utils/csrf.cjs +13 -152
  101. package/dist/utils/csrf.cjs.map +1 -1
  102. package/dist/utils/csrf.d.ts +1 -72
  103. package/dist/utils/csrf.js +1 -142
  104. package/dist/utils/csrf.js.map +1 -1
  105. package/dist/utils/errors/ErrorCodes.cjs +6 -76
  106. package/dist/utils/errors/ErrorCodes.cjs.map +1 -1
  107. package/dist/utils/errors/ErrorCodes.d.ts +1 -45
  108. package/dist/utils/errors/ErrorCodes.js +1 -84
  109. package/dist/utils/errors/ErrorCodes.js.map +1 -1
  110. package/dist/utils/errors.cjs +15 -344
  111. package/dist/utils/errors.cjs.map +1 -1
  112. package/dist/utils/errors.d.ts +1 -183
  113. package/dist/utils/errors.js +1 -352
  114. package/dist/utils/errors.js.map +1 -1
  115. package/dist/utils/logger.cjs +5 -374
  116. package/dist/utils/logger.cjs.map +1 -1
  117. package/dist/utils/logger.d.ts +2 -189
  118. package/dist/utils/logger.js +1 -379
  119. package/dist/utils/logger.js.map +1 -1
  120. package/dist/utils/logger.types.cjs +3 -12
  121. package/dist/utils/logger.types.cjs.map +1 -1
  122. package/dist/utils/logger.types.d.ts +2 -57
  123. package/dist/utils/logger.types.js +1 -10
  124. package/dist/utils/logger.types.js.map +1 -1
  125. package/dist/utils/monitoring.cjs +11 -302
  126. package/dist/utils/monitoring.cjs.map +1 -1
  127. package/dist/utils/monitoring.d.ts +1 -163
  128. package/dist/utils/monitoring.js +1 -294
  129. package/dist/utils/monitoring.js.map +1 -1
  130. package/dist/utils/performance.cjs +5 -352
  131. package/dist/utils/performance.cjs.map +1 -1
  132. package/dist/utils/performance.d.ts +2 -246
  133. package/dist/utils/performance.js +1 -354
  134. package/dist/utils/performance.js.map +1 -1
  135. package/dist/utils/resourceLoader.cjs +5 -303
  136. package/dist/utils/resourceLoader.cjs.map +1 -1
  137. package/dist/utils/resourceLoader.d.ts +2 -130
  138. package/dist/utils/resourceLoader.js +1 -305
  139. package/dist/utils/resourceLoader.js.map +1 -1
  140. package/dist/utils/runtimeSecurity.cjs +2 -140
  141. package/dist/utils/runtimeSecurity.cjs.map +1 -1
  142. package/dist/utils/runtimeSecurity.d.ts +2 -104
  143. package/dist/utils/runtimeSecurity.js +1 -141
  144. package/dist/utils/runtimeSecurity.js.map +1 -1
  145. package/dist/utils/security.cjs +3 -314
  146. package/dist/utils/security.cjs.map +1 -1
  147. package/dist/utils/security.d.ts +2 -80
  148. package/dist/utils/security.js +1 -311
  149. package/dist/utils/security.js.map +1 -1
  150. package/dist/utils/traceId.cjs +10 -111
  151. package/dist/utils/traceId.cjs.map +1 -1
  152. package/dist/utils/traceId.d.ts +1 -63
  153. package/dist/utils/traceId.js +1 -116
  154. package/dist/utils/traceId.js.map +1 -1
  155. package/dist/utils/validation.cjs +3 -173
  156. package/dist/utils/validation.cjs.map +1 -1
  157. package/dist/utils/validation.d.ts +2 -110
  158. package/dist/utils/validation.js +1 -175
  159. package/dist/utils/validation.js.map +1 -1
  160. package/package.json +15 -24
  161. package/dist/lazy/index.cjs +0 -104
  162. package/dist/lazy/index.cjs.map +0 -1
  163. package/dist/lazy/index.d.ts +0 -19
  164. package/dist/lazy/index.js +0 -24
  165. package/dist/lazy/index.js.map +0 -1
  166. package/dist/request/adapter/RequestAdapter.cjs +0 -78
  167. package/dist/request/adapter/RequestAdapter.cjs.map +0 -1
  168. package/dist/request/adapter/axiosAdapter.cjs +0 -164
  169. package/dist/request/adapter/axiosAdapter.cjs.map +0 -1
  170. package/dist/request/adapter/fetchAdapter.cjs +0 -134
  171. package/dist/request/adapter/fetchAdapter.cjs.map +0 -1
  172. package/dist/request/adapter/index.cjs +0 -80
  173. package/dist/request/adapter/index.cjs.map +0 -1
  174. package/dist/request/adapter/kyAdapter.cjs +0 -191
  175. package/dist/request/adapter/kyAdapter.cjs.map +0 -1
  176. package/dist/request/adapter/undiciAdapter.cjs +0 -213
  177. package/dist/request/adapter/undiciAdapter.cjs.map +0 -1
  178. package/dist/request/core/RequestClient.cjs +0 -558
  179. package/dist/request/core/RequestClient.cjs.map +0 -1
  180. package/dist/request/core/index.cjs +0 -15
  181. package/dist/request/core/index.cjs.map +0 -1
  182. package/dist/request/index.cjs +0 -149
  183. package/dist/request/index.cjs.map +0 -1
  184. package/dist/request/plugin/RequestPlugin.cjs +0 -218
  185. package/dist/request/plugin/RequestPlugin.cjs.map +0 -1
  186. package/dist/request/plugin/cache.cjs +0 -269
  187. package/dist/request/plugin/cache.cjs.map +0 -1
  188. package/dist/request/plugin/csrfPlugin.cjs +0 -40
  189. package/dist/request/plugin/csrfPlugin.cjs.map +0 -1
  190. package/dist/request/plugin/index.cjs +0 -53
  191. package/dist/request/plugin/index.cjs.map +0 -1
  192. package/dist/request/plugin/monitoring.cjs +0 -216
  193. package/dist/request/plugin/monitoring.cjs.map +0 -1
  194. package/dist/request/plugin/queue.cjs +0 -140
  195. package/dist/request/plugin/queue.cjs.map +0 -1
  196. package/dist/request/plugin/retry.cjs +0 -98
  197. package/dist/request/plugin/retry.cjs.map +0 -1
  198. package/dist/request/plugin/validation.cjs +0 -121
  199. package/dist/request/plugin/validation.cjs.map +0 -1
  200. package/dist/request/runtime/RequestContext.cjs +0 -77
  201. package/dist/request/runtime/RequestContext.cjs.map +0 -1
  202. package/dist/request/runtime/index.cjs +0 -32
  203. package/dist/request/runtime/index.cjs.map +0 -1
  204. package/dist/request/types.cjs +0 -112
  205. package/dist/request/types.cjs.map +0 -1
  206. package/dist/request/utils/RequestQueueManager.cjs +0 -168
  207. package/dist/request/utils/RequestQueueManager.cjs.map +0 -1
  208. package/dist/request/utils/dependencyCheck.cjs +0 -237
  209. package/dist/request/utils/dependencyCheck.cjs.map +0 -1
  210. package/dist/request/utils/index.cjs +0 -30
  211. package/dist/request/utils/index.cjs.map +0 -1
  212. package/dist/request.umd.js +0 -5392
  213. package/dist/request.umd.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/error/ErrorHandler.ts"],"sourcesContent":["/**\n * 统一错误处理器\n * \n * 优化:\n * 1. 统一错误处理策略:记录、上报、恢复、降级\n * 2. 错误分类:致命、可恢复、警告\n * 3. 错误恢复机制:自动重试、降级方案\n */\n\nimport { logger } from '../../utils';\nimport { errorUtils, ErrorSeverity, ErrorType, FrameworkError } from '../../utils/errors';\nimport type { MonitoringService } from '../../utils/monitoring';\n\n/**\n * 错误处理策略\n */\nexport enum ErrorHandlingStrategy {\n /**\n * 记录错误(日志)\n */\n LOG = 'LOG',\n /**\n * 上报错误(监控服务)\n */\n REPORT = 'REPORT',\n /**\n * 尝试恢复错误\n */\n RECOVER = 'RECOVER',\n /**\n * 降级处理\n */\n FALLBACK = 'FALLBACK',\n /**\n * 忽略错误\n */\n IGNORE = 'IGNORE',\n}\n\n/**\n * 错误恢复选项\n */\nexport interface ErrorRecoveryOptions {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n /**\n * 重试条件函数\n */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /**\n * 降级方案函数\n */\n fallback?: () => Promise<unknown> | unknown;\n}\n\n/**\n * 错误处理配置\n */\nexport interface ErrorHandlerConfig {\n /**\n * 监控服务实例(可选)\n */\n monitoring?: MonitoringService;\n /**\n * 默认错误处理策略\n * @default [ErrorHandlingStrategy.LOG, ErrorHandlingStrategy.REPORT]\n */\n defaultStrategies?: ErrorHandlingStrategy[];\n /**\n * 错误严重程度对应的处理策略\n */\n severityStrategies?: Partial<Record<ErrorSeverity, ErrorHandlingStrategy[]>>;\n /**\n * 错误类型对应的处理策略\n */\n typeStrategies?: Partial<Record<ErrorType, ErrorHandlingStrategy[]>>;\n /**\n * 错误恢复选项\n */\n recoveryOptions?: ErrorRecoveryOptions;\n /**\n * 是否在开发环境显示详细错误信息\n * @default true\n */\n showDetailedErrorsInDev?: boolean;\n}\n\n/**\n * 错误处理结果\n */\nexport interface ErrorHandleResult {\n /**\n * 是否已处理\n */\n handled: boolean;\n /**\n * 是否可恢复\n */\n recoverable: boolean;\n /**\n * 恢复后的结果(如果已恢复)\n */\n recoveredValue?: unknown;\n /**\n * 使用的处理策略\n */\n strategies: ErrorHandlingStrategy[];\n /**\n * 错误信息\n */\n error: FrameworkError;\n}\n\n/**\n * 统一错误处理器\n */\nexport class ErrorHandler {\n private config: Omit<Required<ErrorHandlerConfig>, 'monitoring'>;\n private monitoring?: MonitoringService;\n\n constructor(config: ErrorHandlerConfig = {}) {\n this.monitoring = config.monitoring;\n this.config = {\n defaultStrategies: config.defaultStrategies ?? [\n ErrorHandlingStrategy.LOG,\n ErrorHandlingStrategy.REPORT,\n ],\n severityStrategies: config.severityStrategies ?? {},\n typeStrategies: config.typeStrategies ?? {},\n recoveryOptions: config.recoveryOptions ?? {},\n showDetailedErrorsInDev: config.showDetailedErrorsInDev ?? true,\n };\n }\n\n /**\n * 设置监控服务\n */\n setMonitoring(monitoring: MonitoringService): void {\n this.monitoring = monitoring;\n }\n\n /**\n * 处理错误\n * \n * @param error - 错误对象\n * @param context - 错误上下文\n * @returns 错误处理结果\n */\n async handleError(\n error: unknown,\n context?: Record<string, unknown>\n ): Promise<ErrorHandleResult> {\n // 标准化错误对象\n const normalizedError = errorUtils.normalizeError(error);\n \n // 创建包含上下文信息的错误对象(由于 context 是只读的,需要创建新对象)\n const errorWithContext: FrameworkError = context\n ? new FrameworkError(\n normalizedError.message,\n normalizedError.type,\n normalizedError.severity,\n {\n code: normalizedError.code,\n originalError: normalizedError.originalError,\n context: {\n ...normalizedError.context,\n ...context,\n },\n recoverable: normalizedError.recoverable,\n }\n )\n : normalizedError;\n\n // 确定处理策略\n const strategies = this.determineStrategies(errorWithContext);\n \n // 执行处理策略\n const handled = await this.executeStrategies(errorWithContext, strategies);\n\n // 尝试恢复错误\n let recoveredValue: unknown | undefined;\n let recoverable = false;\n if (handled && errorWithContext.recoverable && this.config.recoveryOptions) {\n const recoveryResult = await this.attemptRecovery(errorWithContext);\n recoverable = recoveryResult.recoverable;\n recoveredValue = recoveryResult.value;\n }\n\n return {\n handled,\n recoverable,\n recoveredValue,\n strategies,\n error: errorWithContext,\n };\n }\n\n /**\n * 确定错误处理策略\n */\n private determineStrategies(error: FrameworkError): ErrorHandlingStrategy[] {\n // 1. 检查错误类型对应的策略\n if (this.config.typeStrategies[error.type]) {\n return this.config.typeStrategies[error.type]!;\n }\n\n // 2. 检查错误严重程度对应的策略\n if (this.config.severityStrategies[error.severity]) {\n return this.config.severityStrategies[error.severity]!;\n }\n\n // 3. 使用默认策略\n return this.config.defaultStrategies;\n }\n\n /**\n * 执行处理策略\n */\n private async executeStrategies(\n error: FrameworkError,\n strategies: ErrorHandlingStrategy[]\n ): Promise<boolean> {\n let handled = false;\n\n for (const strategy of strategies) {\n try {\n switch (strategy) {\n case ErrorHandlingStrategy.LOG:\n this.logError(error);\n handled = true;\n break;\n\n case ErrorHandlingStrategy.REPORT:\n await this.reportError(error);\n handled = true;\n break;\n\n case ErrorHandlingStrategy.RECOVER:\n // 恢复策略在 handleError 中统一处理\n handled = true;\n break;\n\n case ErrorHandlingStrategy.FALLBACK:\n // 降级策略在 attemptRecovery 中处理\n handled = true;\n break;\n\n case ErrorHandlingStrategy.IGNORE:\n // 忽略错误,不做任何处理\n handled = true;\n break;\n }\n } catch (strategyError) {\n logger.warn(`错误处理策略 ${strategy} 执行失败:`, strategyError);\n }\n }\n\n return handled;\n }\n\n /**\n * 记录错误\n */\n private logError(error: FrameworkError): void {\n const errorInfo = errorUtils.extractErrorInfo(error);\n \n // 根据错误严重程度选择日志级别\n switch (error.severity) {\n case ErrorSeverity.CRITICAL:\n case ErrorSeverity.HIGH:\n logger.error('错误:', errorInfo);\n break;\n case ErrorSeverity.MEDIUM:\n logger.warn('警告:', errorInfo);\n break;\n case ErrorSeverity.LOW:\n logger.info('信息:', errorInfo);\n break;\n }\n\n // 开发环境显示详细错误信息\n if (this.config.showDetailedErrorsInDev && process.env.NODE_ENV === 'development') {\n const detailedError = errorUtils.formatErrorForDev(error);\n console.error(detailedError);\n }\n }\n\n /**\n * 上报错误\n */\n private async reportError(error: FrameworkError): Promise<void> {\n if (!this.monitoring) {\n logger.debug('监控服务未配置,跳过错误上报');\n return;\n }\n\n try {\n this.monitoring.captureError(error, {\n severity: error.severity,\n type: error.type,\n code: error.code,\n context: error.context,\n });\n } catch (reportError) {\n logger.warn('错误上报失败:', reportError);\n }\n }\n\n /**\n * 尝试恢复错误\n */\n private async attemptRecovery(\n error: FrameworkError\n ): Promise<{ recoverable: boolean; value?: unknown }> {\n const options = this.config.recoveryOptions;\n if (!options) {\n return { recoverable: false };\n }\n\n const maxRetries = options.maxRetries ?? 3;\n const retryDelay = options.retryDelay ?? 1000;\n const exponentialBackoff = options.exponentialBackoff ?? true;\n const shouldRetry = options.shouldRetry ?? (() => true);\n\n // 如果有降级方案,先尝试降级\n if (options.fallback) {\n try {\n const fallbackValue = await Promise.resolve(options.fallback());\n logger.info('错误已通过降级方案恢复');\n return { recoverable: true, value: fallbackValue };\n } catch (fallbackError) {\n logger.warn('降级方案执行失败:', fallbackError);\n }\n }\n\n // 尝试重试(如果错误可恢复且满足重试条件)\n if (error.recoverable && shouldRetry(error, 0)) {\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n if (!shouldRetry(error, attempt)) {\n break;\n }\n\n const delay = exponentialBackoff\n ? retryDelay * Math.pow(2, attempt)\n : retryDelay;\n\n logger.debug(`错误恢复重试 ${attempt + 1}/${maxRetries},${delay}ms 后重试...`);\n\n await new Promise(resolve => setTimeout(resolve, delay));\n\n // 这里应该调用原始操作的重试逻辑\n // 由于错误处理器不知道原始操作,这里只返回可恢复状态\n // 实际的重试应该在调用方实现\n }\n }\n\n return { recoverable: error.recoverable };\n }\n\n /**\n * 创建错误处理器的便捷方法\n */\n static create(config?: ErrorHandlerConfig): ErrorHandler {\n return new ErrorHandler(config);\n }\n}\n\n/**\n * 默认错误处理器实例(单例)\n */\nlet defaultErrorHandler: ErrorHandler | null = null;\n\n/**\n * 获取默认错误处理器\n */\nexport function getDefaultErrorHandler(): ErrorHandler {\n if (!defaultErrorHandler) {\n defaultErrorHandler = new ErrorHandler();\n }\n return defaultErrorHandler;\n}\n\n/**\n * 设置默认错误处理器\n */\nexport function setDefaultErrorHandler(handler: ErrorHandler): void {\n defaultErrorHandler = handler;\n}\n"],"names":["logger","errorUtils","ErrorSeverity","FrameworkError","ErrorHandlingStrategy","ErrorHandler","setMonitoring","monitoring","handleError","error","context","normalizedError","normalizeError","errorWithContext","message","type","severity","code","originalError","recoverable","strategies","determineStrategies","handled","executeStrategies","recoveredValue","config","recoveryOptions","recoveryResult","attemptRecovery","value","typeStrategies","severityStrategies","defaultStrategies","strategy","logError","reportError","strategyError","warn","errorInfo","extractErrorInfo","CRITICAL","HIGH","MEDIUM","LOW","info","showDetailedErrorsInDev","process","env","NODE_ENV","detailedError","formatErrorForDev","console","debug","captureError","options","maxRetries","retryDelay","exponentialBackoff","shouldRetry","fallback","fallbackValue","Promise","resolve","fallbackError","attempt","delay","Math","pow","setTimeout","create","defaultErrorHandler","getDefaultErrorHandler","setDefaultErrorHandler","handler"],"mappings":";;;;;;;;;;;;;AAAA;;;;;;;CAOC,GAED,SAASA,MAAM,QAAQ,cAAc;AACrC,SAASC,UAAU,EAAEC,aAAa,EAAaC,cAAc,QAAQ,qBAAqB;AAG1F;;CAEC,GACD,OAAO,IAAA,AAAKC,+CAAAA;IACV;;GAEC;IAED;;GAEC;IAED;;GAEC;IAED;;GAEC;IAED;;GAEC;WAnBSA;MAqBX;AAyFD;;CAEC,GACD,OAAO,MAAMC;IAkBX;;GAEC,GACDC,cAAcC,UAA6B,EAAQ;QACjD,IAAI,CAACA,UAAU,GAAGA;IACpB;IAEA;;;;;;GAMC,GACD,MAAMC,YACJC,KAAc,EACdC,OAAiC,EACL;QAC5B,UAAU;QACV,MAAMC,kBAAkBV,WAAWW,cAAc,CAACH;QAElD,0CAA0C;QAC1C,MAAMI,mBAAmCH,UACrC,IAAIP,eACFQ,gBAAgBG,OAAO,EACvBH,gBAAgBI,IAAI,EACpBJ,gBAAgBK,QAAQ,EACxB;YACEC,MAAMN,gBAAgBM,IAAI;YAC1BC,eAAeP,gBAAgBO,aAAa;YAC5CR,SAAS;gBACP,GAAGC,gBAAgBD,OAAO;gBAC1B,GAAGA,OAAO;YACZ;YACAS,aAAaR,gBAAgBQ,WAAW;QAC1C,KAEFR;QAEJ,SAAS;QACT,MAAMS,aAAa,IAAI,CAACC,mBAAmB,CAACR;QAE5C,SAAS;QACT,MAAMS,UAAU,MAAM,IAAI,CAACC,iBAAiB,CAACV,kBAAkBO;QAE/D,SAAS;QACT,IAAII;QACJ,IAAIL,cAAc;QAClB,IAAIG,WAAWT,iBAAiBM,WAAW,IAAI,IAAI,CAACM,MAAM,CAACC,eAAe,EAAE;YAC1E,MAAMC,iBAAiB,MAAM,IAAI,CAACC,eAAe,CAACf;YAClDM,cAAcQ,eAAeR,WAAW;YACxCK,iBAAiBG,eAAeE,KAAK;QACvC;QAEA,OAAO;YACLP;YACAH;YACAK;YACAJ;YACAX,OAAOI;QACT;IACF;IAEA;;GAEC,GACD,AAAQQ,oBAAoBZ,KAAqB,EAA2B;QAC1E,iBAAiB;QACjB,IAAI,IAAI,CAACgB,MAAM,CAACK,cAAc,CAACrB,MAAMM,IAAI,CAAC,EAAE;YAC1C,OAAO,IAAI,CAACU,MAAM,CAACK,cAAc,CAACrB,MAAMM,IAAI,CAAC;QAC/C;QAEA,mBAAmB;QACnB,IAAI,IAAI,CAACU,MAAM,CAACM,kBAAkB,CAACtB,MAAMO,QAAQ,CAAC,EAAE;YAClD,OAAO,IAAI,CAACS,MAAM,CAACM,kBAAkB,CAACtB,MAAMO,QAAQ,CAAC;QACvD;QAEA,YAAY;QACZ,OAAO,IAAI,CAACS,MAAM,CAACO,iBAAiB;IACtC;IAEA;;GAEC,GACD,MAAcT,kBACZd,KAAqB,EACrBW,UAAmC,EACjB;QAClB,IAAIE,UAAU;QAEd,KAAK,MAAMW,YAAYb,WAAY;YACjC,IAAI;gBACF,OAAQa;oBACN;wBACE,IAAI,CAACC,QAAQ,CAACzB;wBACda,UAAU;wBACV;oBAEF;wBACE,MAAM,IAAI,CAACa,WAAW,CAAC1B;wBACvBa,UAAU;wBACV;oBAEF;wBACE,0BAA0B;wBAC1BA,UAAU;wBACV;oBAEF;wBACE,4BAA4B;wBAC5BA,UAAU;wBACV;oBAEF;wBACE,cAAc;wBACdA,UAAU;wBACV;gBACJ;YACF,EAAE,OAAOc,eAAe;gBACtBpC,OAAOqC,IAAI,CAAC,CAAC,OAAO,EAAEJ,SAAS,MAAM,CAAC,EAAEG;YAC1C;QACF;QAEA,OAAOd;IACT;IAEA;;GAEC,GACD,AAAQY,SAASzB,KAAqB,EAAQ;QAC5C,MAAM6B,YAAYrC,WAAWsC,gBAAgB,CAAC9B;QAE9C,iBAAiB;QACjB,OAAQA,MAAMO,QAAQ;YACpB,KAAKd,cAAcsC,QAAQ;YAC3B,KAAKtC,cAAcuC,IAAI;gBACrBzC,OAAOS,KAAK,CAAC,OAAO6B;gBACpB;YACF,KAAKpC,cAAcwC,MAAM;gBACvB1C,OAAOqC,IAAI,CAAC,OAAOC;gBACnB;YACF,KAAKpC,cAAcyC,GAAG;gBACpB3C,OAAO4C,IAAI,CAAC,OAAON;gBACnB;QACJ;QAEA,eAAe;QACf,IAAI,IAAI,CAACb,MAAM,CAACoB,uBAAuB,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;YACjF,MAAMC,gBAAgBhD,WAAWiD,iBAAiB,CAACzC;YACnD0C,QAAQ1C,KAAK,CAACwC;QAChB;IACF;IAEA;;GAEC,GACD,MAAcd,YAAY1B,KAAqB,EAAiB;QAC9D,IAAI,CAAC,IAAI,CAACF,UAAU,EAAE;YACpBP,OAAOoD,KAAK,CAAC;YACb;QACF;QAEA,IAAI;YACF,IAAI,CAAC7C,UAAU,CAAC8C,YAAY,CAAC5C,OAAO;gBAClCO,UAAUP,MAAMO,QAAQ;gBACxBD,MAAMN,MAAMM,IAAI;gBAChBE,MAAMR,MAAMQ,IAAI;gBAChBP,SAASD,MAAMC,OAAO;YACxB;QACF,EAAE,OAAOyB,aAAa;YACpBnC,OAAOqC,IAAI,CAAC,WAAWF;QACzB;IACF;IAEA;;GAEC,GACD,MAAcP,gBACZnB,KAAqB,EAC+B;QACpD,MAAM6C,UAAU,IAAI,CAAC7B,MAAM,CAACC,eAAe;QAC3C,IAAI,CAAC4B,SAAS;YACZ,OAAO;gBAAEnC,aAAa;YAAM;QAC9B;QAEA,MAAMoC,aAAaD,QAAQC,UAAU,IAAI;QACzC,MAAMC,aAAaF,QAAQE,UAAU,IAAI;QACzC,MAAMC,qBAAqBH,QAAQG,kBAAkB,IAAI;QACzD,MAAMC,cAAcJ,QAAQI,WAAW,IAAK,CAAA,IAAM,IAAG;QAErD,gBAAgB;QAChB,IAAIJ,QAAQK,QAAQ,EAAE;YACpB,IAAI;gBACF,MAAMC,gBAAgB,MAAMC,QAAQC,OAAO,CAACR,QAAQK,QAAQ;gBAC5D3D,OAAO4C,IAAI,CAAC;gBACZ,OAAO;oBAAEzB,aAAa;oBAAMU,OAAO+B;gBAAc;YACnD,EAAE,OAAOG,eAAe;gBACtB/D,OAAOqC,IAAI,CAAC,aAAa0B;YAC3B;QACF;QAEA,uBAAuB;QACvB,IAAItD,MAAMU,WAAW,IAAIuC,YAAYjD,OAAO,IAAI;YAC9C,IAAK,IAAIuD,UAAU,GAAGA,UAAUT,YAAYS,UAAW;gBACrD,IAAI,CAACN,YAAYjD,OAAOuD,UAAU;oBAChC;gBACF;gBAEA,MAAMC,QAAQR,qBACVD,aAAaU,KAAKC,GAAG,CAAC,GAAGH,WACzBR;gBAEJxD,OAAOoD,KAAK,CAAC,CAAC,OAAO,EAAEY,UAAU,EAAE,CAAC,EAAET,WAAW,CAAC,EAAEU,MAAM,SAAS,CAAC;gBAEpE,MAAM,IAAIJ,QAAQC,CAAAA,UAAWM,WAAWN,SAASG;YAEjD,kBAAkB;YAClB,4BAA4B;YAC5B,gBAAgB;YAClB;QACF;QAEA,OAAO;YAAE9C,aAAaV,MAAMU,WAAW;QAAC;IAC1C;IAEA;;GAEC,GACD,OAAOkD,OAAO5C,MAA2B,EAAgB;QACvD,OAAO,IAAIpB,aAAaoB;IAC1B;IApPA,YAAYA,SAA6B,CAAC,CAAC,CAAE;QAH7C,uBAAQA,UAAR,KAAA;QACA,uBAAQlB,cAAR,KAAA;QAGE,IAAI,CAACA,UAAU,GAAGkB,OAAOlB,UAAU;QACnC,IAAI,CAACkB,MAAM,GAAG;YACZO,mBAAmBP,OAAOO,iBAAiB,IAAI;;;aAG9C;YACDD,oBAAoBN,OAAOM,kBAAkB,IAAI,CAAC;YAClDD,gBAAgBL,OAAOK,cAAc,IAAI,CAAC;YAC1CJ,iBAAiBD,OAAOC,eAAe,IAAI,CAAC;YAC5CmB,yBAAyBpB,OAAOoB,uBAAuB,IAAI;QAC7D;IACF;AAyOF;AAEA;;CAEC,GACD,IAAIyB,sBAA2C;AAE/C;;CAEC,GACD,OAAO,SAASC;IACd,IAAI,CAACD,qBAAqB;QACxBA,sBAAsB,IAAIjE;IAC5B;IACA,OAAOiE;AACT;AAEA;;CAEC,GACD,OAAO,SAASE,uBAAuBC,OAAqB;IAC1DH,sBAAsBG;AACxB"}
1
+ {"version":3,"sources":["../../../src/core/error/ErrorHandler.ts"],"sourcesContent":["/**\n * 统一错误处理器\n * \n * 优化:\n * 1. 统一错误处理策略:记录、上报、恢复、降级\n * 2. 错误分类:致命、可恢复、警告\n * 3. 错误恢复机制:自动重试、降级方案\n */\n\nimport { logger } from '../../utils';\nimport { errorUtils, ErrorSeverity, ErrorType, FrameworkError } from '../../utils/errors';\nimport type { MonitoringService } from '@vlian/monitoring';\n\n/**\n * 错误处理策略\n */\nexport enum ErrorHandlingStrategy {\n /**\n * 记录错误(日志)\n */\n LOG = 'LOG',\n /**\n * 上报错误(监控服务)\n */\n REPORT = 'REPORT',\n /**\n * 尝试恢复错误\n */\n RECOVER = 'RECOVER',\n /**\n * 降级处理\n */\n FALLBACK = 'FALLBACK',\n /**\n * 忽略错误\n */\n IGNORE = 'IGNORE',\n}\n\n/**\n * 错误恢复选项\n */\nexport interface ErrorRecoveryOptions {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n /**\n * 重试条件函数\n */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /**\n * 降级方案函数\n */\n fallback?: () => Promise<unknown> | unknown;\n}\n\n/**\n * 错误处理配置\n */\nexport interface ErrorHandlerConfig {\n /**\n * 监控服务实例(可选)\n */\n monitoring?: MonitoringService;\n /**\n * 默认错误处理策略\n * @default [ErrorHandlingStrategy.LOG, ErrorHandlingStrategy.REPORT]\n */\n defaultStrategies?: ErrorHandlingStrategy[];\n /**\n * 错误严重程度对应的处理策略\n */\n severityStrategies?: Partial<Record<ErrorSeverity, ErrorHandlingStrategy[]>>;\n /**\n * 错误类型对应的处理策略\n */\n typeStrategies?: Partial<Record<ErrorType, ErrorHandlingStrategy[]>>;\n /**\n * 错误恢复选项\n */\n recoveryOptions?: ErrorRecoveryOptions;\n /**\n * 是否在开发环境显示详细错误信息\n * @default true\n */\n showDetailedErrorsInDev?: boolean;\n}\n\n/**\n * 错误处理结果\n */\nexport interface ErrorHandleResult {\n /**\n * 是否已处理\n */\n handled: boolean;\n /**\n * 是否可恢复\n */\n recoverable: boolean;\n /**\n * 恢复后的结果(如果已恢复)\n */\n recoveredValue?: unknown;\n /**\n * 使用的处理策略\n */\n strategies: ErrorHandlingStrategy[];\n /**\n * 错误信息\n */\n error: FrameworkError;\n}\n\n/**\n * 统一错误处理器\n */\nexport class ErrorHandler {\n private config: Omit<Required<ErrorHandlerConfig>, 'monitoring'>;\n private monitoring?: MonitoringService;\n\n constructor(config: ErrorHandlerConfig = {}) {\n this.monitoring = config.monitoring;\n this.config = {\n defaultStrategies: config.defaultStrategies ?? [\n ErrorHandlingStrategy.LOG,\n ErrorHandlingStrategy.REPORT,\n ],\n severityStrategies: config.severityStrategies ?? {},\n typeStrategies: config.typeStrategies ?? {},\n recoveryOptions: config.recoveryOptions ?? {},\n showDetailedErrorsInDev: config.showDetailedErrorsInDev ?? true,\n };\n }\n\n /**\n * 设置监控服务\n */\n setMonitoring(monitoring: MonitoringService): void {\n this.monitoring = monitoring;\n }\n\n /**\n * 处理错误\n * \n * @param error - 错误对象\n * @param context - 错误上下文\n * @returns 错误处理结果\n */\n async handleError(\n error: unknown,\n context?: Record<string, unknown>\n ): Promise<ErrorHandleResult> {\n // 标准化错误对象\n const normalizedError = errorUtils.normalizeError(error);\n \n // 创建包含上下文信息的错误对象(由于 context 是只读的,需要创建新对象)\n const errorWithContext: FrameworkError = context\n ? new FrameworkError(\n normalizedError.message,\n normalizedError.type,\n normalizedError.severity,\n {\n code: normalizedError.code,\n originalError: normalizedError.originalError,\n context: {\n ...normalizedError.context,\n ...context,\n },\n recoverable: normalizedError.recoverable,\n }\n )\n : normalizedError;\n\n // 确定处理策略\n const strategies = this.determineStrategies(errorWithContext);\n \n // 执行处理策略\n const handled = await this.executeStrategies(errorWithContext, strategies);\n\n // 尝试恢复错误\n let recoveredValue: unknown | undefined;\n let recoverable = false;\n if (handled && errorWithContext.recoverable && this.config.recoveryOptions) {\n const recoveryResult = await this.attemptRecovery(errorWithContext);\n recoverable = recoveryResult.recoverable;\n recoveredValue = recoveryResult.value;\n }\n\n return {\n handled,\n recoverable,\n recoveredValue,\n strategies,\n error: errorWithContext,\n };\n }\n\n /**\n * 确定错误处理策略\n */\n private determineStrategies(error: FrameworkError): ErrorHandlingStrategy[] {\n // 1. 检查错误类型对应的策略\n if (this.config.typeStrategies[error.type]) {\n return this.config.typeStrategies[error.type]!;\n }\n\n // 2. 检查错误严重程度对应的策略\n if (this.config.severityStrategies[error.severity]) {\n return this.config.severityStrategies[error.severity]!;\n }\n\n // 3. 使用默认策略\n return this.config.defaultStrategies;\n }\n\n /**\n * 执行处理策略\n */\n private async executeStrategies(\n error: FrameworkError,\n strategies: ErrorHandlingStrategy[]\n ): Promise<boolean> {\n let handled = false;\n\n for (const strategy of strategies) {\n try {\n switch (strategy) {\n case ErrorHandlingStrategy.LOG:\n this.logError(error);\n handled = true;\n break;\n\n case ErrorHandlingStrategy.REPORT:\n await this.reportError(error);\n handled = true;\n break;\n\n case ErrorHandlingStrategy.RECOVER:\n // 恢复策略在 handleError 中统一处理\n handled = true;\n break;\n\n case ErrorHandlingStrategy.FALLBACK:\n // 降级策略在 attemptRecovery 中处理\n handled = true;\n break;\n\n case ErrorHandlingStrategy.IGNORE:\n // 忽略错误,不做任何处理\n handled = true;\n break;\n }\n } catch (strategyError) {\n logger.warn(`错误处理策略 ${strategy} 执行失败:`, strategyError);\n }\n }\n\n return handled;\n }\n\n /**\n * 记录错误\n */\n private logError(error: FrameworkError): void {\n const errorInfo = errorUtils.extractErrorInfo(error);\n \n // 根据错误严重程度选择日志级别\n switch (error.severity) {\n case ErrorSeverity.CRITICAL:\n case ErrorSeverity.HIGH:\n logger.error('错误:', errorInfo);\n break;\n case ErrorSeverity.MEDIUM:\n logger.warn('警告:', errorInfo);\n break;\n case ErrorSeverity.LOW:\n logger.info('信息:', errorInfo);\n break;\n }\n\n // 开发环境显示详细错误信息\n if (this.config.showDetailedErrorsInDev && process.env.NODE_ENV === 'development') {\n const detailedError = errorUtils.formatErrorForDev(error);\n console.error(detailedError);\n }\n }\n\n /**\n * 上报错误\n */\n private async reportError(error: FrameworkError): Promise<void> {\n if (!this.monitoring) {\n logger.debug('监控服务未配置,跳过错误上报');\n return;\n }\n\n try {\n this.monitoring.captureError(error, {\n severity: error.severity,\n type: error.type,\n code: error.code,\n context: error.context,\n });\n } catch (reportError) {\n logger.warn('错误上报失败:', reportError);\n }\n }\n\n /**\n * 尝试恢复错误\n */\n private async attemptRecovery(\n error: FrameworkError\n ): Promise<{ recoverable: boolean; value?: unknown }> {\n const options = this.config.recoveryOptions;\n if (!options) {\n return { recoverable: false };\n }\n\n const maxRetries = options.maxRetries ?? 3;\n const retryDelay = options.retryDelay ?? 1000;\n const exponentialBackoff = options.exponentialBackoff ?? true;\n const shouldRetry = options.shouldRetry ?? (() => true);\n\n // 如果有降级方案,先尝试降级\n if (options.fallback) {\n try {\n const fallbackValue = await Promise.resolve(options.fallback());\n logger.info('错误已通过降级方案恢复');\n return { recoverable: true, value: fallbackValue };\n } catch (fallbackError) {\n logger.warn('降级方案执行失败:', fallbackError);\n }\n }\n\n // 尝试重试(如果错误可恢复且满足重试条件)\n if (error.recoverable && shouldRetry(error, 0)) {\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n if (!shouldRetry(error, attempt)) {\n break;\n }\n\n const delay = exponentialBackoff\n ? retryDelay * Math.pow(2, attempt)\n : retryDelay;\n\n logger.debug(`错误恢复重试 ${attempt + 1}/${maxRetries},${delay}ms 后重试...`);\n\n await new Promise(resolve => setTimeout(resolve, delay));\n\n // 这里应该调用原始操作的重试逻辑\n // 由于错误处理器不知道原始操作,这里只返回可恢复状态\n // 实际的重试应该在调用方实现\n }\n }\n\n return { recoverable: error.recoverable };\n }\n\n /**\n * 创建错误处理器的便捷方法\n */\n static create(config?: ErrorHandlerConfig): ErrorHandler {\n return new ErrorHandler(config);\n }\n}\n\n/**\n * 默认错误处理器实例(单例)\n */\nlet defaultErrorHandler: ErrorHandler | null = null;\n\n/**\n * 获取默认错误处理器\n */\nexport function getDefaultErrorHandler(): ErrorHandler {\n if (!defaultErrorHandler) {\n defaultErrorHandler = new ErrorHandler();\n }\n return defaultErrorHandler;\n}\n\n/**\n * 设置默认错误处理器\n */\nexport function setDefaultErrorHandler(handler: ErrorHandler): void {\n defaultErrorHandler = handler;\n}\n"],"names":["logger","errorUtils","ErrorSeverity","FrameworkError","ErrorHandlingStrategy","ErrorHandler","setMonitoring","monitoring","handleError","error","context","normalizedError","normalizeError","errorWithContext","message","type","severity","code","originalError","recoverable","strategies","determineStrategies","handled","executeStrategies","recoveredValue","config","recoveryOptions","recoveryResult","attemptRecovery","value","typeStrategies","severityStrategies","defaultStrategies","strategy","logError","reportError","strategyError","warn","errorInfo","extractErrorInfo","CRITICAL","HIGH","MEDIUM","LOW","info","showDetailedErrorsInDev","process","env","NODE_ENV","detailedError","formatErrorForDev","console","debug","captureError","options","maxRetries","retryDelay","exponentialBackoff","shouldRetry","fallback","fallbackValue","Promise","resolve","fallbackError","attempt","delay","Math","pow","setTimeout","create","defaultErrorHandler","getDefaultErrorHandler","setDefaultErrorHandler","handler"],"mappings":"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"}
@@ -19,7 +19,7 @@ _export(exports, {
19
19
  return getRouterMonitoring;
20
20
  }
21
21
  });
22
- const _monitoring = require("../../../utils/monitoring");
22
+ const _monitoring = require("@vlian/monitoring");
23
23
  const _logger = require("../../../utils/logger");
24
24
  function _define_property(obj, key, value) {
25
25
  if (key in obj) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/router/monitoring/RouterMonitoring.ts"],"sourcesContent":["/**\n * 路由监控服务\n * 提供路由访问统计、性能监控、错误监控等功能\n */\n\nimport { getMonitoring } from '../../../utils/monitoring';\nimport { logger } from '../../../utils/logger';\nimport type { RouteLocation } from '../types';\nimport type { RouterError } from '../errors';\n\n/**\n * 路由访问记录\n */\ninterface RouteAccessRecord {\n /**\n * 路由路径\n */\n path: string;\n\n /**\n * 路由名称\n */\n name?: string;\n\n /**\n * 访问时间\n */\n timestamp: number;\n\n /**\n * 访问持续时间(毫秒)\n */\n duration?: number;\n\n /**\n * 来源路由\n */\n from?: string;\n\n /**\n * 是否成功\n */\n success: boolean;\n\n /**\n * 错误信息(如果有)\n */\n error?: string;\n}\n\n/**\n * 路由性能指标\n */\ninterface RoutePerformanceMetrics {\n /**\n * 路由匹配时间(毫秒)\n */\n matchTime?: number;\n\n /**\n * 组件加载时间(毫秒)\n */\n loadTime?: number;\n\n /**\n * 路由渲染时间(毫秒)\n */\n renderTime?: number;\n\n /**\n * 总时间(毫秒)\n */\n totalTime?: number;\n}\n\n/**\n * 路由监控配置\n */\nexport interface RouterMonitoringConfig {\n /**\n * 是否启用路由监控\n * @default true\n */\n enabled?: boolean;\n\n /**\n * 是否记录路由访问\n * @default true\n */\n trackAccess?: boolean;\n\n /**\n * 是否记录性能指标\n * @default true\n */\n trackPerformance?: boolean;\n\n /**\n * 是否记录错误\n * @default true\n */\n trackErrors?: boolean;\n\n /**\n * 最大记录数量\n * @default 1000\n */\n maxRecords?: number;\n\n /**\n * 采样率 (0-1)\n * @default 1.0\n */\n sampleRate?: number;\n}\n\n/**\n * 路由监控服务\n */\nexport class RouterMonitoring {\n private accessRecords: RouteAccessRecord[] = [];\n private performanceMetrics: Map<string, RoutePerformanceMetrics[]> = new Map();\n private config: Required<RouterMonitoringConfig>;\n private monitoringService = getMonitoring();\n private currentRouteStartTime: number = 0;\n private currentRoute?: RouteLocation;\n\n constructor(config: RouterMonitoringConfig = {}) {\n this.config = {\n enabled: config.enabled ?? true,\n trackAccess: config.trackAccess ?? true,\n trackPerformance: config.trackPerformance ?? true,\n trackErrors: config.trackErrors ?? true,\n maxRecords: config.maxRecords ?? 1000,\n sampleRate: config.sampleRate ?? 1.0,\n };\n }\n\n /**\n * 记录路由访问\n */\n trackRouteAccess(\n to: RouteLocation,\n from?: RouteLocation,\n success: boolean = true,\n error?: Error\n ): void {\n if (!this.config.enabled || !this.config.trackAccess) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n const record: RouteAccessRecord = {\n path: to.path,\n name: to.meta?.name as string | undefined,\n timestamp: Date.now(),\n from: from?.path,\n success,\n error: error?.message,\n };\n\n // 如果有当前路由,计算持续时间\n if (this.currentRoute && this.currentRouteStartTime > 0) {\n record.duration = Date.now() - this.currentRouteStartTime;\n }\n\n this.accessRecords.push(record);\n\n // 限制记录数量\n if (this.accessRecords.length > this.config.maxRecords) {\n this.accessRecords.shift();\n }\n\n // 上报到监控服务\n this.monitoringService.trackEvent('route_access', {\n path: to.path,\n name: to.meta?.name,\n success,\n error: error?.message,\n });\n\n // 更新当前路由\n this.currentRoute = to;\n this.currentRouteStartTime = Date.now();\n\n logger.debug('路由访问已记录', record);\n }\n\n /**\n * 记录路由性能指标\n */\n trackRoutePerformance(\n routeName: string,\n metrics: RoutePerformanceMetrics\n ): void {\n if (!this.config.enabled || !this.config.trackPerformance) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n const routeMetrics = this.performanceMetrics.get(routeName) || [];\n routeMetrics.push(metrics);\n\n // 限制记录数量\n if (routeMetrics.length > 100) {\n routeMetrics.shift();\n }\n\n this.performanceMetrics.set(routeName, routeMetrics);\n\n // 上报到监控服务\n this.monitoringService.reportPerformance({\n [`route_${routeName}_match`]: metrics.matchTime || 0,\n [`route_${routeName}_load`]: metrics.loadTime || 0,\n [`route_${routeName}_render`]: metrics.renderTime || 0,\n [`route_${routeName}_total`]: metrics.totalTime || 0,\n });\n\n logger.debug(`路由性能指标已记录: ${routeName}`, metrics);\n }\n\n /**\n * 记录路由错误\n */\n trackRouteError(error: RouterError | Error, context?: Record<string, unknown>): void {\n if (!this.config.enabled || !this.config.trackErrors) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n // 上报到监控服务\n this.monitoringService.captureError(error, {\n type: 'router',\n ...context,\n });\n\n logger.error('路由错误已记录', error, context);\n }\n\n /**\n * 获取路由访问统计\n */\n getAccessStats(): {\n total: number;\n success: number;\n failed: number;\n byPath: Record<string, number>;\n byName: Record<string, number>;\n averageDuration: number;\n } {\n const stats = {\n total: this.accessRecords.length,\n success: 0,\n failed: 0,\n byPath: {} as Record<string, number>,\n byName: {} as Record<string, number>,\n averageDuration: 0,\n };\n\n let totalDuration = 0;\n let durationCount = 0;\n\n for (const record of this.accessRecords) {\n if (record.success) {\n stats.success++;\n } else {\n stats.failed++;\n }\n\n stats.byPath[record.path] = (stats.byPath[record.path] || 0) + 1;\n\n if (record.name) {\n stats.byName[record.name] = (stats.byName[record.name] || 0) + 1;\n }\n\n if (record.duration) {\n totalDuration += record.duration;\n durationCount++;\n }\n }\n\n stats.averageDuration = durationCount > 0 ? totalDuration / durationCount : 0;\n\n return stats;\n }\n\n /**\n * 获取路由性能统计\n */\n getPerformanceStats(): Record<\n string,\n {\n count: number;\n averageMatchTime: number;\n averageLoadTime: number;\n averageRenderTime: number;\n averageTotalTime: number;\n }\n > {\n const stats: Record<\n string,\n {\n count: number;\n averageMatchTime: number;\n averageLoadTime: number;\n averageRenderTime: number;\n averageTotalTime: number;\n }\n > = {};\n\n for (const [routeName, metrics] of this.performanceMetrics.entries()) {\n let totalMatchTime = 0;\n let totalLoadTime = 0;\n let totalRenderTime = 0;\n let totalTotalTime = 0;\n let count = 0;\n\n for (const metric of metrics) {\n if (metric.matchTime) {\n totalMatchTime += metric.matchTime;\n }\n if (metric.loadTime) {\n totalLoadTime += metric.loadTime;\n }\n if (metric.renderTime) {\n totalRenderTime += metric.renderTime;\n }\n if (metric.totalTime) {\n totalTotalTime += metric.totalTime;\n }\n count++;\n }\n\n stats[routeName] = {\n count,\n averageMatchTime: count > 0 ? totalMatchTime / count : 0,\n averageLoadTime: count > 0 ? totalLoadTime / count : 0,\n averageRenderTime: count > 0 ? totalRenderTime / count : 0,\n averageTotalTime: count > 0 ? totalTotalTime / count : 0,\n };\n }\n\n return stats;\n }\n\n /**\n * 清空所有记录\n */\n clear(): void {\n this.accessRecords = [];\n this.performanceMetrics.clear();\n logger.debug('路由监控记录已清空');\n }\n\n /**\n * 获取监控报告\n */\n getReport() {\n return {\n access: this.getAccessStats(),\n performance: this.getPerformanceStats(),\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * 获取路由监控服务单例\n */\nlet routerMonitoringInstance: RouterMonitoring | null = null;\n\nexport function getRouterMonitoring(\n config?: RouterMonitoringConfig\n): RouterMonitoring {\n if (!routerMonitoringInstance) {\n routerMonitoringInstance = new RouterMonitoring(config);\n }\n return routerMonitoringInstance;\n}\n"],"names":["RouterMonitoring","getRouterMonitoring","trackRouteAccess","to","from","success","error","config","enabled","trackAccess","Math","random","sampleRate","record","path","name","meta","timestamp","Date","now","message","currentRoute","currentRouteStartTime","duration","accessRecords","push","length","maxRecords","shift","monitoringService","trackEvent","logger","debug","trackRoutePerformance","routeName","metrics","trackPerformance","routeMetrics","performanceMetrics","get","set","reportPerformance","matchTime","loadTime","renderTime","totalTime","trackRouteError","context","trackErrors","captureError","type","getAccessStats","stats","total","failed","byPath","byName","averageDuration","totalDuration","durationCount","getPerformanceStats","entries","totalMatchTime","totalLoadTime","totalRenderTime","totalTotalTime","count","metric","averageMatchTime","averageLoadTime","averageRenderTime","averageTotalTime","clear","getReport","access","performance","Map","getMonitoring","routerMonitoringInstance"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/core/router/monitoring/RouterMonitoring.ts"],"sourcesContent":["/**\n * 路由监控服务\n * 提供路由访问统计、性能监控、错误监控等功能\n */\n\nimport { getMonitoring } from '@vlian/monitoring';\nimport { logger } from '../../../utils/logger';\nimport type { RouteLocation } from '../types';\nimport type { RouterError } from '../errors';\n\n/**\n * 路由访问记录\n */\ninterface RouteAccessRecord {\n /**\n * 路由路径\n */\n path: string;\n\n /**\n * 路由名称\n */\n name?: string;\n\n /**\n * 访问时间\n */\n timestamp: number;\n\n /**\n * 访问持续时间(毫秒)\n */\n duration?: number;\n\n /**\n * 来源路由\n */\n from?: string;\n\n /**\n * 是否成功\n */\n success: boolean;\n\n /**\n * 错误信息(如果有)\n */\n error?: string;\n}\n\n/**\n * 路由性能指标\n */\ninterface RoutePerformanceMetrics {\n /**\n * 路由匹配时间(毫秒)\n */\n matchTime?: number;\n\n /**\n * 组件加载时间(毫秒)\n */\n loadTime?: number;\n\n /**\n * 路由渲染时间(毫秒)\n */\n renderTime?: number;\n\n /**\n * 总时间(毫秒)\n */\n totalTime?: number;\n}\n\n/**\n * 路由监控配置\n */\nexport interface RouterMonitoringConfig {\n /**\n * 是否启用路由监控\n * @default true\n */\n enabled?: boolean;\n\n /**\n * 是否记录路由访问\n * @default true\n */\n trackAccess?: boolean;\n\n /**\n * 是否记录性能指标\n * @default true\n */\n trackPerformance?: boolean;\n\n /**\n * 是否记录错误\n * @default true\n */\n trackErrors?: boolean;\n\n /**\n * 最大记录数量\n * @default 1000\n */\n maxRecords?: number;\n\n /**\n * 采样率 (0-1)\n * @default 1.0\n */\n sampleRate?: number;\n}\n\n/**\n * 路由监控服务\n */\nexport class RouterMonitoring {\n private accessRecords: RouteAccessRecord[] = [];\n private performanceMetrics: Map<string, RoutePerformanceMetrics[]> = new Map();\n private config: Required<RouterMonitoringConfig>;\n private monitoringService = getMonitoring();\n private currentRouteStartTime: number = 0;\n private currentRoute?: RouteLocation;\n\n constructor(config: RouterMonitoringConfig = {}) {\n this.config = {\n enabled: config.enabled ?? true,\n trackAccess: config.trackAccess ?? true,\n trackPerformance: config.trackPerformance ?? true,\n trackErrors: config.trackErrors ?? true,\n maxRecords: config.maxRecords ?? 1000,\n sampleRate: config.sampleRate ?? 1.0,\n };\n }\n\n /**\n * 记录路由访问\n */\n trackRouteAccess(\n to: RouteLocation,\n from?: RouteLocation,\n success: boolean = true,\n error?: Error\n ): void {\n if (!this.config.enabled || !this.config.trackAccess) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n const record: RouteAccessRecord = {\n path: to.path,\n name: to.meta?.name as string | undefined,\n timestamp: Date.now(),\n from: from?.path,\n success,\n error: error?.message,\n };\n\n // 如果有当前路由,计算持续时间\n if (this.currentRoute && this.currentRouteStartTime > 0) {\n record.duration = Date.now() - this.currentRouteStartTime;\n }\n\n this.accessRecords.push(record);\n\n // 限制记录数量\n if (this.accessRecords.length > this.config.maxRecords) {\n this.accessRecords.shift();\n }\n\n // 上报到监控服务\n this.monitoringService.trackEvent('route_access', {\n path: to.path,\n name: to.meta?.name,\n success,\n error: error?.message,\n });\n\n // 更新当前路由\n this.currentRoute = to;\n this.currentRouteStartTime = Date.now();\n\n logger.debug('路由访问已记录', record);\n }\n\n /**\n * 记录路由性能指标\n */\n trackRoutePerformance(\n routeName: string,\n metrics: RoutePerformanceMetrics\n ): void {\n if (!this.config.enabled || !this.config.trackPerformance) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n const routeMetrics = this.performanceMetrics.get(routeName) || [];\n routeMetrics.push(metrics);\n\n // 限制记录数量\n if (routeMetrics.length > 100) {\n routeMetrics.shift();\n }\n\n this.performanceMetrics.set(routeName, routeMetrics);\n\n // 上报到监控服务\n this.monitoringService.reportPerformance({\n [`route_${routeName}_match`]: metrics.matchTime || 0,\n [`route_${routeName}_load`]: metrics.loadTime || 0,\n [`route_${routeName}_render`]: metrics.renderTime || 0,\n [`route_${routeName}_total`]: metrics.totalTime || 0,\n });\n\n logger.debug(`路由性能指标已记录: ${routeName}`, metrics);\n }\n\n /**\n * 记录路由错误\n */\n trackRouteError(error: RouterError | Error, context?: Record<string, unknown>): void {\n if (!this.config.enabled || !this.config.trackErrors) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n // 上报到监控服务\n this.monitoringService.captureError(error, {\n type: 'router',\n ...context,\n });\n\n logger.error('路由错误已记录', error, context);\n }\n\n /**\n * 获取路由访问统计\n */\n getAccessStats(): {\n total: number;\n success: number;\n failed: number;\n byPath: Record<string, number>;\n byName: Record<string, number>;\n averageDuration: number;\n } {\n const stats = {\n total: this.accessRecords.length,\n success: 0,\n failed: 0,\n byPath: {} as Record<string, number>,\n byName: {} as Record<string, number>,\n averageDuration: 0,\n };\n\n let totalDuration = 0;\n let durationCount = 0;\n\n for (const record of this.accessRecords) {\n if (record.success) {\n stats.success++;\n } else {\n stats.failed++;\n }\n\n stats.byPath[record.path] = (stats.byPath[record.path] || 0) + 1;\n\n if (record.name) {\n stats.byName[record.name] = (stats.byName[record.name] || 0) + 1;\n }\n\n if (record.duration) {\n totalDuration += record.duration;\n durationCount++;\n }\n }\n\n stats.averageDuration = durationCount > 0 ? totalDuration / durationCount : 0;\n\n return stats;\n }\n\n /**\n * 获取路由性能统计\n */\n getPerformanceStats(): Record<\n string,\n {\n count: number;\n averageMatchTime: number;\n averageLoadTime: number;\n averageRenderTime: number;\n averageTotalTime: number;\n }\n > {\n const stats: Record<\n string,\n {\n count: number;\n averageMatchTime: number;\n averageLoadTime: number;\n averageRenderTime: number;\n averageTotalTime: number;\n }\n > = {};\n\n for (const [routeName, metrics] of this.performanceMetrics.entries()) {\n let totalMatchTime = 0;\n let totalLoadTime = 0;\n let totalRenderTime = 0;\n let totalTotalTime = 0;\n let count = 0;\n\n for (const metric of metrics) {\n if (metric.matchTime) {\n totalMatchTime += metric.matchTime;\n }\n if (metric.loadTime) {\n totalLoadTime += metric.loadTime;\n }\n if (metric.renderTime) {\n totalRenderTime += metric.renderTime;\n }\n if (metric.totalTime) {\n totalTotalTime += metric.totalTime;\n }\n count++;\n }\n\n stats[routeName] = {\n count,\n averageMatchTime: count > 0 ? totalMatchTime / count : 0,\n averageLoadTime: count > 0 ? totalLoadTime / count : 0,\n averageRenderTime: count > 0 ? totalRenderTime / count : 0,\n averageTotalTime: count > 0 ? totalTotalTime / count : 0,\n };\n }\n\n return stats;\n }\n\n /**\n * 清空所有记录\n */\n clear(): void {\n this.accessRecords = [];\n this.performanceMetrics.clear();\n logger.debug('路由监控记录已清空');\n }\n\n /**\n * 获取监控报告\n */\n getReport() {\n return {\n access: this.getAccessStats(),\n performance: this.getPerformanceStats(),\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * 获取路由监控服务单例\n */\nlet routerMonitoringInstance: RouterMonitoring | null = null;\n\nexport function getRouterMonitoring(\n config?: RouterMonitoringConfig\n): RouterMonitoring {\n if (!routerMonitoringInstance) {\n routerMonitoringInstance = new RouterMonitoring(config);\n }\n return routerMonitoringInstance;\n}\n"],"names":["RouterMonitoring","getRouterMonitoring","trackRouteAccess","to","from","success","error","config","enabled","trackAccess","Math","random","sampleRate","record","path","name","meta","timestamp","Date","now","message","currentRoute","currentRouteStartTime","duration","accessRecords","push","length","maxRecords","shift","monitoringService","trackEvent","logger","debug","trackRoutePerformance","routeName","metrics","trackPerformance","routeMetrics","performanceMetrics","get","set","reportPerformance","matchTime","loadTime","renderTime","totalTime","trackRouteError","context","trackErrors","captureError","type","getAccessStats","stats","total","failed","byPath","byName","averageDuration","totalDuration","durationCount","getPerformanceStats","entries","totalMatchTime","totalLoadTime","totalRenderTime","totalTotalTime","count","metric","averageMatchTime","averageLoadTime","averageRenderTime","averageTotalTime","clear","getReport","access","performance","Map","getMonitoring","routerMonitoringInstance"],"mappings":"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"}
@@ -14,7 +14,7 @@ function _define_property(obj, key, value) {
14
14
  /**
15
15
  * 路由监控服务
16
16
  * 提供路由访问统计、性能监控、错误监控等功能
17
- */ import { getMonitoring } from "../../../utils/monitoring";
17
+ */ import { getMonitoring } from "@vlian/monitoring";
18
18
  import { logger } from "../../../utils/logger";
19
19
  /**
20
20
  * 路由监控服务
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/router/monitoring/RouterMonitoring.ts"],"sourcesContent":["/**\n * 路由监控服务\n * 提供路由访问统计、性能监控、错误监控等功能\n */\n\nimport { getMonitoring } from '../../../utils/monitoring';\nimport { logger } from '../../../utils/logger';\nimport type { RouteLocation } from '../types';\nimport type { RouterError } from '../errors';\n\n/**\n * 路由访问记录\n */\ninterface RouteAccessRecord {\n /**\n * 路由路径\n */\n path: string;\n\n /**\n * 路由名称\n */\n name?: string;\n\n /**\n * 访问时间\n */\n timestamp: number;\n\n /**\n * 访问持续时间(毫秒)\n */\n duration?: number;\n\n /**\n * 来源路由\n */\n from?: string;\n\n /**\n * 是否成功\n */\n success: boolean;\n\n /**\n * 错误信息(如果有)\n */\n error?: string;\n}\n\n/**\n * 路由性能指标\n */\ninterface RoutePerformanceMetrics {\n /**\n * 路由匹配时间(毫秒)\n */\n matchTime?: number;\n\n /**\n * 组件加载时间(毫秒)\n */\n loadTime?: number;\n\n /**\n * 路由渲染时间(毫秒)\n */\n renderTime?: number;\n\n /**\n * 总时间(毫秒)\n */\n totalTime?: number;\n}\n\n/**\n * 路由监控配置\n */\nexport interface RouterMonitoringConfig {\n /**\n * 是否启用路由监控\n * @default true\n */\n enabled?: boolean;\n\n /**\n * 是否记录路由访问\n * @default true\n */\n trackAccess?: boolean;\n\n /**\n * 是否记录性能指标\n * @default true\n */\n trackPerformance?: boolean;\n\n /**\n * 是否记录错误\n * @default true\n */\n trackErrors?: boolean;\n\n /**\n * 最大记录数量\n * @default 1000\n */\n maxRecords?: number;\n\n /**\n * 采样率 (0-1)\n * @default 1.0\n */\n sampleRate?: number;\n}\n\n/**\n * 路由监控服务\n */\nexport class RouterMonitoring {\n private accessRecords: RouteAccessRecord[] = [];\n private performanceMetrics: Map<string, RoutePerformanceMetrics[]> = new Map();\n private config: Required<RouterMonitoringConfig>;\n private monitoringService = getMonitoring();\n private currentRouteStartTime: number = 0;\n private currentRoute?: RouteLocation;\n\n constructor(config: RouterMonitoringConfig = {}) {\n this.config = {\n enabled: config.enabled ?? true,\n trackAccess: config.trackAccess ?? true,\n trackPerformance: config.trackPerformance ?? true,\n trackErrors: config.trackErrors ?? true,\n maxRecords: config.maxRecords ?? 1000,\n sampleRate: config.sampleRate ?? 1.0,\n };\n }\n\n /**\n * 记录路由访问\n */\n trackRouteAccess(\n to: RouteLocation,\n from?: RouteLocation,\n success: boolean = true,\n error?: Error\n ): void {\n if (!this.config.enabled || !this.config.trackAccess) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n const record: RouteAccessRecord = {\n path: to.path,\n name: to.meta?.name as string | undefined,\n timestamp: Date.now(),\n from: from?.path,\n success,\n error: error?.message,\n };\n\n // 如果有当前路由,计算持续时间\n if (this.currentRoute && this.currentRouteStartTime > 0) {\n record.duration = Date.now() - this.currentRouteStartTime;\n }\n\n this.accessRecords.push(record);\n\n // 限制记录数量\n if (this.accessRecords.length > this.config.maxRecords) {\n this.accessRecords.shift();\n }\n\n // 上报到监控服务\n this.monitoringService.trackEvent('route_access', {\n path: to.path,\n name: to.meta?.name,\n success,\n error: error?.message,\n });\n\n // 更新当前路由\n this.currentRoute = to;\n this.currentRouteStartTime = Date.now();\n\n logger.debug('路由访问已记录', record);\n }\n\n /**\n * 记录路由性能指标\n */\n trackRoutePerformance(\n routeName: string,\n metrics: RoutePerformanceMetrics\n ): void {\n if (!this.config.enabled || !this.config.trackPerformance) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n const routeMetrics = this.performanceMetrics.get(routeName) || [];\n routeMetrics.push(metrics);\n\n // 限制记录数量\n if (routeMetrics.length > 100) {\n routeMetrics.shift();\n }\n\n this.performanceMetrics.set(routeName, routeMetrics);\n\n // 上报到监控服务\n this.monitoringService.reportPerformance({\n [`route_${routeName}_match`]: metrics.matchTime || 0,\n [`route_${routeName}_load`]: metrics.loadTime || 0,\n [`route_${routeName}_render`]: metrics.renderTime || 0,\n [`route_${routeName}_total`]: metrics.totalTime || 0,\n });\n\n logger.debug(`路由性能指标已记录: ${routeName}`, metrics);\n }\n\n /**\n * 记录路由错误\n */\n trackRouteError(error: RouterError | Error, context?: Record<string, unknown>): void {\n if (!this.config.enabled || !this.config.trackErrors) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n // 上报到监控服务\n this.monitoringService.captureError(error, {\n type: 'router',\n ...context,\n });\n\n logger.error('路由错误已记录', error, context);\n }\n\n /**\n * 获取路由访问统计\n */\n getAccessStats(): {\n total: number;\n success: number;\n failed: number;\n byPath: Record<string, number>;\n byName: Record<string, number>;\n averageDuration: number;\n } {\n const stats = {\n total: this.accessRecords.length,\n success: 0,\n failed: 0,\n byPath: {} as Record<string, number>,\n byName: {} as Record<string, number>,\n averageDuration: 0,\n };\n\n let totalDuration = 0;\n let durationCount = 0;\n\n for (const record of this.accessRecords) {\n if (record.success) {\n stats.success++;\n } else {\n stats.failed++;\n }\n\n stats.byPath[record.path] = (stats.byPath[record.path] || 0) + 1;\n\n if (record.name) {\n stats.byName[record.name] = (stats.byName[record.name] || 0) + 1;\n }\n\n if (record.duration) {\n totalDuration += record.duration;\n durationCount++;\n }\n }\n\n stats.averageDuration = durationCount > 0 ? totalDuration / durationCount : 0;\n\n return stats;\n }\n\n /**\n * 获取路由性能统计\n */\n getPerformanceStats(): Record<\n string,\n {\n count: number;\n averageMatchTime: number;\n averageLoadTime: number;\n averageRenderTime: number;\n averageTotalTime: number;\n }\n > {\n const stats: Record<\n string,\n {\n count: number;\n averageMatchTime: number;\n averageLoadTime: number;\n averageRenderTime: number;\n averageTotalTime: number;\n }\n > = {};\n\n for (const [routeName, metrics] of this.performanceMetrics.entries()) {\n let totalMatchTime = 0;\n let totalLoadTime = 0;\n let totalRenderTime = 0;\n let totalTotalTime = 0;\n let count = 0;\n\n for (const metric of metrics) {\n if (metric.matchTime) {\n totalMatchTime += metric.matchTime;\n }\n if (metric.loadTime) {\n totalLoadTime += metric.loadTime;\n }\n if (metric.renderTime) {\n totalRenderTime += metric.renderTime;\n }\n if (metric.totalTime) {\n totalTotalTime += metric.totalTime;\n }\n count++;\n }\n\n stats[routeName] = {\n count,\n averageMatchTime: count > 0 ? totalMatchTime / count : 0,\n averageLoadTime: count > 0 ? totalLoadTime / count : 0,\n averageRenderTime: count > 0 ? totalRenderTime / count : 0,\n averageTotalTime: count > 0 ? totalTotalTime / count : 0,\n };\n }\n\n return stats;\n }\n\n /**\n * 清空所有记录\n */\n clear(): void {\n this.accessRecords = [];\n this.performanceMetrics.clear();\n logger.debug('路由监控记录已清空');\n }\n\n /**\n * 获取监控报告\n */\n getReport() {\n return {\n access: this.getAccessStats(),\n performance: this.getPerformanceStats(),\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * 获取路由监控服务单例\n */\nlet routerMonitoringInstance: RouterMonitoring | null = null;\n\nexport function getRouterMonitoring(\n config?: RouterMonitoringConfig\n): RouterMonitoring {\n if (!routerMonitoringInstance) {\n routerMonitoringInstance = new RouterMonitoring(config);\n }\n return routerMonitoringInstance;\n}\n"],"names":["getMonitoring","logger","RouterMonitoring","trackRouteAccess","to","from","success","error","config","enabled","trackAccess","Math","random","sampleRate","record","path","name","meta","timestamp","Date","now","message","currentRoute","currentRouteStartTime","duration","accessRecords","push","length","maxRecords","shift","monitoringService","trackEvent","debug","trackRoutePerformance","routeName","metrics","trackPerformance","routeMetrics","performanceMetrics","get","set","reportPerformance","matchTime","loadTime","renderTime","totalTime","trackRouteError","context","trackErrors","captureError","type","getAccessStats","stats","total","failed","byPath","byName","averageDuration","totalDuration","durationCount","getPerformanceStats","entries","totalMatchTime","totalLoadTime","totalRenderTime","totalTotalTime","count","metric","averageMatchTime","averageLoadTime","averageRenderTime","averageTotalTime","clear","getReport","access","performance","Map","routerMonitoringInstance","getRouterMonitoring"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/core/router/monitoring/RouterMonitoring.ts"],"sourcesContent":["/**\n * 路由监控服务\n * 提供路由访问统计、性能监控、错误监控等功能\n */\n\nimport { getMonitoring } from '@vlian/monitoring';\nimport { logger } from '../../../utils/logger';\nimport type { RouteLocation } from '../types';\nimport type { RouterError } from '../errors';\n\n/**\n * 路由访问记录\n */\ninterface RouteAccessRecord {\n /**\n * 路由路径\n */\n path: string;\n\n /**\n * 路由名称\n */\n name?: string;\n\n /**\n * 访问时间\n */\n timestamp: number;\n\n /**\n * 访问持续时间(毫秒)\n */\n duration?: number;\n\n /**\n * 来源路由\n */\n from?: string;\n\n /**\n * 是否成功\n */\n success: boolean;\n\n /**\n * 错误信息(如果有)\n */\n error?: string;\n}\n\n/**\n * 路由性能指标\n */\ninterface RoutePerformanceMetrics {\n /**\n * 路由匹配时间(毫秒)\n */\n matchTime?: number;\n\n /**\n * 组件加载时间(毫秒)\n */\n loadTime?: number;\n\n /**\n * 路由渲染时间(毫秒)\n */\n renderTime?: number;\n\n /**\n * 总时间(毫秒)\n */\n totalTime?: number;\n}\n\n/**\n * 路由监控配置\n */\nexport interface RouterMonitoringConfig {\n /**\n * 是否启用路由监控\n * @default true\n */\n enabled?: boolean;\n\n /**\n * 是否记录路由访问\n * @default true\n */\n trackAccess?: boolean;\n\n /**\n * 是否记录性能指标\n * @default true\n */\n trackPerformance?: boolean;\n\n /**\n * 是否记录错误\n * @default true\n */\n trackErrors?: boolean;\n\n /**\n * 最大记录数量\n * @default 1000\n */\n maxRecords?: number;\n\n /**\n * 采样率 (0-1)\n * @default 1.0\n */\n sampleRate?: number;\n}\n\n/**\n * 路由监控服务\n */\nexport class RouterMonitoring {\n private accessRecords: RouteAccessRecord[] = [];\n private performanceMetrics: Map<string, RoutePerformanceMetrics[]> = new Map();\n private config: Required<RouterMonitoringConfig>;\n private monitoringService = getMonitoring();\n private currentRouteStartTime: number = 0;\n private currentRoute?: RouteLocation;\n\n constructor(config: RouterMonitoringConfig = {}) {\n this.config = {\n enabled: config.enabled ?? true,\n trackAccess: config.trackAccess ?? true,\n trackPerformance: config.trackPerformance ?? true,\n trackErrors: config.trackErrors ?? true,\n maxRecords: config.maxRecords ?? 1000,\n sampleRate: config.sampleRate ?? 1.0,\n };\n }\n\n /**\n * 记录路由访问\n */\n trackRouteAccess(\n to: RouteLocation,\n from?: RouteLocation,\n success: boolean = true,\n error?: Error\n ): void {\n if (!this.config.enabled || !this.config.trackAccess) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n const record: RouteAccessRecord = {\n path: to.path,\n name: to.meta?.name as string | undefined,\n timestamp: Date.now(),\n from: from?.path,\n success,\n error: error?.message,\n };\n\n // 如果有当前路由,计算持续时间\n if (this.currentRoute && this.currentRouteStartTime > 0) {\n record.duration = Date.now() - this.currentRouteStartTime;\n }\n\n this.accessRecords.push(record);\n\n // 限制记录数量\n if (this.accessRecords.length > this.config.maxRecords) {\n this.accessRecords.shift();\n }\n\n // 上报到监控服务\n this.monitoringService.trackEvent('route_access', {\n path: to.path,\n name: to.meta?.name,\n success,\n error: error?.message,\n });\n\n // 更新当前路由\n this.currentRoute = to;\n this.currentRouteStartTime = Date.now();\n\n logger.debug('路由访问已记录', record);\n }\n\n /**\n * 记录路由性能指标\n */\n trackRoutePerformance(\n routeName: string,\n metrics: RoutePerformanceMetrics\n ): void {\n if (!this.config.enabled || !this.config.trackPerformance) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n const routeMetrics = this.performanceMetrics.get(routeName) || [];\n routeMetrics.push(metrics);\n\n // 限制记录数量\n if (routeMetrics.length > 100) {\n routeMetrics.shift();\n }\n\n this.performanceMetrics.set(routeName, routeMetrics);\n\n // 上报到监控服务\n this.monitoringService.reportPerformance({\n [`route_${routeName}_match`]: metrics.matchTime || 0,\n [`route_${routeName}_load`]: metrics.loadTime || 0,\n [`route_${routeName}_render`]: metrics.renderTime || 0,\n [`route_${routeName}_total`]: metrics.totalTime || 0,\n });\n\n logger.debug(`路由性能指标已记录: ${routeName}`, metrics);\n }\n\n /**\n * 记录路由错误\n */\n trackRouteError(error: RouterError | Error, context?: Record<string, unknown>): void {\n if (!this.config.enabled || !this.config.trackErrors) {\n return;\n }\n\n // 采样检查\n if (Math.random() > this.config.sampleRate) {\n return;\n }\n\n // 上报到监控服务\n this.monitoringService.captureError(error, {\n type: 'router',\n ...context,\n });\n\n logger.error('路由错误已记录', error, context);\n }\n\n /**\n * 获取路由访问统计\n */\n getAccessStats(): {\n total: number;\n success: number;\n failed: number;\n byPath: Record<string, number>;\n byName: Record<string, number>;\n averageDuration: number;\n } {\n const stats = {\n total: this.accessRecords.length,\n success: 0,\n failed: 0,\n byPath: {} as Record<string, number>,\n byName: {} as Record<string, number>,\n averageDuration: 0,\n };\n\n let totalDuration = 0;\n let durationCount = 0;\n\n for (const record of this.accessRecords) {\n if (record.success) {\n stats.success++;\n } else {\n stats.failed++;\n }\n\n stats.byPath[record.path] = (stats.byPath[record.path] || 0) + 1;\n\n if (record.name) {\n stats.byName[record.name] = (stats.byName[record.name] || 0) + 1;\n }\n\n if (record.duration) {\n totalDuration += record.duration;\n durationCount++;\n }\n }\n\n stats.averageDuration = durationCount > 0 ? totalDuration / durationCount : 0;\n\n return stats;\n }\n\n /**\n * 获取路由性能统计\n */\n getPerformanceStats(): Record<\n string,\n {\n count: number;\n averageMatchTime: number;\n averageLoadTime: number;\n averageRenderTime: number;\n averageTotalTime: number;\n }\n > {\n const stats: Record<\n string,\n {\n count: number;\n averageMatchTime: number;\n averageLoadTime: number;\n averageRenderTime: number;\n averageTotalTime: number;\n }\n > = {};\n\n for (const [routeName, metrics] of this.performanceMetrics.entries()) {\n let totalMatchTime = 0;\n let totalLoadTime = 0;\n let totalRenderTime = 0;\n let totalTotalTime = 0;\n let count = 0;\n\n for (const metric of metrics) {\n if (metric.matchTime) {\n totalMatchTime += metric.matchTime;\n }\n if (metric.loadTime) {\n totalLoadTime += metric.loadTime;\n }\n if (metric.renderTime) {\n totalRenderTime += metric.renderTime;\n }\n if (metric.totalTime) {\n totalTotalTime += metric.totalTime;\n }\n count++;\n }\n\n stats[routeName] = {\n count,\n averageMatchTime: count > 0 ? totalMatchTime / count : 0,\n averageLoadTime: count > 0 ? totalLoadTime / count : 0,\n averageRenderTime: count > 0 ? totalRenderTime / count : 0,\n averageTotalTime: count > 0 ? totalTotalTime / count : 0,\n };\n }\n\n return stats;\n }\n\n /**\n * 清空所有记录\n */\n clear(): void {\n this.accessRecords = [];\n this.performanceMetrics.clear();\n logger.debug('路由监控记录已清空');\n }\n\n /**\n * 获取监控报告\n */\n getReport() {\n return {\n access: this.getAccessStats(),\n performance: this.getPerformanceStats(),\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * 获取路由监控服务单例\n */\nlet routerMonitoringInstance: RouterMonitoring | null = null;\n\nexport function getRouterMonitoring(\n config?: RouterMonitoringConfig\n): RouterMonitoring {\n if (!routerMonitoringInstance) {\n routerMonitoringInstance = new RouterMonitoring(config);\n }\n return routerMonitoringInstance;\n}\n"],"names":["getMonitoring","logger","RouterMonitoring","trackRouteAccess","to","from","success","error","config","enabled","trackAccess","Math","random","sampleRate","record","path","name","meta","timestamp","Date","now","message","currentRoute","currentRouteStartTime","duration","accessRecords","push","length","maxRecords","shift","monitoringService","trackEvent","debug","trackRoutePerformance","routeName","metrics","trackPerformance","routeMetrics","performanceMetrics","get","set","reportPerformance","matchTime","loadTime","renderTime","totalTime","trackRouteError","context","trackErrors","captureError","type","getAccessStats","stats","total","failed","byPath","byName","averageDuration","totalDuration","durationCount","getPerformanceStats","entries","totalMatchTime","totalLoadTime","totalRenderTime","totalTotalTime","count","metric","averageMatchTime","averageLoadTime","averageRenderTime","averageTotalTime","clear","getReport","access","performance","Map","routerMonitoringInstance","getRouterMonitoring"],"mappings":"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"}
@@ -198,9 +198,11 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
198
198
  const ErrorBoundary = await getErrorComponent();
199
199
  const LoadingComponent = await getLoadingComponent();
200
200
  const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;
201
+ const Component = page;
201
202
  return {
202
203
  ErrorBoundary: ErrorBoundary?.default,
203
204
  HydrateFallback,
205
+ Component,
204
206
  ...await getConfig(true)
205
207
  };
206
208
  }
@@ -231,9 +233,11 @@ const transformRoutesToReactRoutes = async (routes, transformResult, defaultRout
231
233
  const ErrorBoundary = await getErrorComponent();
232
234
  const LoadingComponent = await getLoadingComponent();
233
235
  const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;
236
+ const Component = page;
234
237
  return {
235
238
  ErrorBoundary: ErrorBoundary?.default,
236
239
  HydrateFallback,
240
+ Component,
237
241
  ...await getConfig(true)
238
242
  };
239
243
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/transform.tsx"],"sourcesContent":["import type { RouteConfig } from '../../../types';\nimport {\n type RouteObject,\n Navigate\n} from 'react-router-dom';\nimport type { TransformRoutesResult } from '../../transform';\nimport { RouteErrorBoundary } from './RouteErrorBoundary';\nimport type { ComponentImport } from '../../../types';\nimport { logger } from '../../../../../utils';\n\nfunction DefaultRouteHydrateFallback() {\n return (\n <div style={{ padding: 16, textAlign: 'center', color: '#5f6c7b' }}>\n Loading...\n </div>\n );\n}\n\nexport const transformRoutesToReactRoutes = async (\n routes: RouteConfig[], \n transformResult: TransformRoutesResult,\n defaultRouteErrorComponent?: ComponentImport,\n defaultRouteLoadingComponent?: ComponentImport,\n enableHydrateFallback: boolean = false,\n): Promise<RouteObject[]> => {\n\n /**\n * 批量处理路由\n * @param routes 路由组\n */\n function transformRouteToReactRoutes(routes: RouteConfig[]) {\n return routes.flatMap((route: RouteConfig) => transformRouteToReactRoute(route))\n }\n\n /**\n * 处理单个路由\n * @param route 路由\n */\n function transformRouteToReactRoute(route: RouteConfig): RouteObject {\n const {\n isGroup = false,\n enableRedirection = false,\n name,\n path,\n handle,\n children,\n page,\n layout,\n error,\n errors,\n loading,\n } = route;\n const routeError = error ?? errors;\n\n // 获取错误组件\n async function getErrorComponent() {\n // 如果 error/errors 是函数,直接使用\n if (typeof routeError === 'function') {\n return routeError();\n }\n\n const errorsMap = transformResult.errors;\n\n // 判断 error/errors 是否为 string 且不是空字符串\n if (typeof routeError === 'string' && routeError !== '') {\n // 使用 routeError 作为 key 获取 transformResult.errors 的值\n const errorResolver = errorsMap.get(routeError);\n\n // 如果获取不到,返回 null\n if (!errorResolver) {\n return null;\n }\n\n // 如果获取到,返回对应的值(调用动态导入函数)\n if (typeof errorResolver === 'function') {\n return errorResolver();\n }\n\n return null;\n }\n\n // 如果 errors 为空,使用配置的默认错误组件或内置的 RouteErrorBoundary 组件\n if (defaultRouteErrorComponent) {\n // 如果配置了默认错误组件,使用配置的组件\n return defaultRouteErrorComponent();\n }\n\n // 如果没有配置默认错误组件,使用内置的 RouteErrorBoundary 组件\n // 直接导入而非懒加载,因为:\n // 1. RouteErrorBoundary 是框架核心组件,体积小\n // 2. 错误边界需要快速响应,直接导入速度更快\n // 3. 作为基础设施组件,应该保证可用性\n return { default: RouteErrorBoundary };\n }\n\n // 获取转换配置\n function convertConfig(m: any) {\n if (!m) {\n return null;\n }\n const { action, loader, shouldRevalidate, default: Component } = m;\n\n // 如果 Component 不存在,记录警告\n if (!Component) {\n logger.warn(`路由组件未找到 default 导出: ${name}`, m);\n }\n\n return {\n action, // always use action\n loader, // always use loader\n shouldRevalidate,\n Component\n };\n }\n\n // 获取加载组件\n async function getLoadingComponent() {\n if (typeof loading === 'function') {\n return loading();\n }\n\n if (typeof loading === 'string' && loading !== '') {\n const loadingResolver = transformResult.loadings.get(loading);\n if (typeof loadingResolver === 'function') {\n return loadingResolver();\n }\n }\n\n if (defaultRouteLoadingComponent) {\n return defaultRouteLoadingComponent();\n }\n\n return null;\n }\n\n // 获取配置\n async function getConfig(index: boolean = false) {\n // 如果有layout和不是index,返回布局配置\n if (layout && !index) {\n // 如果 layout 是函数,直接使用\n if (typeof layout === 'function') {\n const config = await layout();\n return convertConfig(config);\n }\n\n // 如果 layout 是字符串,从 Map 中获取\n if (typeof layout === 'string') {\n const layoutResolver = transformResult.layouts.get(layout);\n if (!layoutResolver) {\n throw new Error(`未找到名为 ${layout} 的布局组件`);\n }\n const config = await layoutResolver();\n return convertConfig(config);\n }\n }\n\n let pageName = name;\n\n // 如果是notFound则转成404\n if (pageName === 'notFound') {\n pageName = '404'\n }\n\n if (page && (!children?.length || index)) {\n // 如果 page 是函数,直接使用\n if (typeof page === 'function') {\n const config = await page();\n return convertConfig(config);\n }\n\n // 如果 page 是字符串,从 Map 中获取\n if (typeof page === 'string') {\n const viewResolver = transformResult.pages.get(page);\n if (!viewResolver) {\n throw new Error(`未找到名为 ${page} 的页面组件`);\n }\n const config = await viewResolver();\n return convertConfig(config);\n }\n }\n\n return null;\n }\n\n // 获取处理信息,即额外的配置信息\n function getHandle(index: boolean = false) {\n if ((layout || isGroup) && !index) {\n return null\n }\n return {\n ...handle,\n name,\n path\n }\n }\n\n\n const reactRoute: RouteObject = {\n children: [],\n id: name,\n handle: getHandle(),\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const config = await getConfig();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n\n // 如果配置为空,确保至少返回一个空对象,避免展开 undefined\n if (!config) {\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n };\n }\n\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...config\n };\n },\n path\n };\n\n if (enableHydrateFallback) {\n reactRoute.hydrateFallbackElement = <DefaultRouteHydrateFallback />;\n }\n\n // 处理子路由\n if (children?.length) {\n reactRoute.children = children.flatMap(child => transformRouteToReactRoute(child)).sort((a, b) => {\n const orderA = a.handle?.order ?? 99;\n const orderB = b.handle?.order ?? 99;\n return orderA - orderB;\n });\n\n if (page && !isGroup) {\n reactRoute.children.unshift({\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...(await getConfig(true))\n };\n }\n });\n }\n\n if (enableRedirection && isGroup) {\n const [firstChild] = reactRoute.children;\n if (firstChild?.path) {\n reactRoute.children.unshift({\n index: true,\n handle: getHandle(true),\n element: <Navigate to={firstChild.path as string} replace />\n });\n }\n }\n\n }\n // 若存在 layout 且没有子路由,但同时声明了 page,则自动生成 index 子路由以渲染页面\n // 场景:/test 使用自定义 layout,且没有 children 时仍应渲染 page\n if ((!children || children.length === 0) && layout && page && !isGroup) {\n reactRoute.children = [{\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...(await getConfig(true))\n };\n }\n }];\n }\n\n return reactRoute;\n }\n\n return transformRouteToReactRoutes(routes);\n}\n"],"names":["transformRoutesToReactRoutes","DefaultRouteHydrateFallback","div","style","padding","textAlign","color","routes","transformResult","defaultRouteErrorComponent","defaultRouteLoadingComponent","enableHydrateFallback","transformRouteToReactRoutes","flatMap","route","transformRouteToReactRoute","isGroup","enableRedirection","name","path","handle","children","page","layout","error","errors","loading","routeError","getErrorComponent","errorsMap","errorResolver","get","default","RouteErrorBoundary","convertConfig","m","action","loader","shouldRevalidate","Component","logger","warn","getLoadingComponent","loadingResolver","loadings","getConfig","index","config","layoutResolver","layouts","Error","pageName","length","viewResolver","pages","getHandle","reactRoute","id","lazy","ErrorBoundary","LoadingComponent","HydrateFallback","hydrateFallbackElement","child","sort","a","b","orderA","order","orderB","unshift","firstChild","element","Navigate","to","replace"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/transform.tsx"],"sourcesContent":["import type { RouteConfig } from '../../../types';\nimport {\n type RouteObject,\n Navigate\n} from 'react-router-dom';\nimport type { TransformRoutesResult } from '../../transform';\nimport { RouteErrorBoundary } from './RouteErrorBoundary';\nimport type { ComponentImport } from '../../../types';\nimport { logger } from '../../../../../utils';\n\nfunction DefaultRouteHydrateFallback() {\n return (\n <div style={{ padding: 16, textAlign: 'center', color: '#5f6c7b' }}>\n Loading...\n </div>\n );\n}\n\nexport const transformRoutesToReactRoutes = async (\n routes: RouteConfig[],\n transformResult: TransformRoutesResult,\n defaultRouteErrorComponent?: ComponentImport,\n defaultRouteLoadingComponent?: ComponentImport,\n enableHydrateFallback: boolean = false,\n): Promise<RouteObject[]> => {\n\n /**\n * 批量处理路由\n * @param routes 路由组\n */\n function transformRouteToReactRoutes(routes: RouteConfig[]) {\n return routes.flatMap((route: RouteConfig) => transformRouteToReactRoute(route))\n }\n\n /**\n * 处理单个路由\n * @param route 路由\n */\n function transformRouteToReactRoute(route: RouteConfig): RouteObject {\n const {\n isGroup = false,\n enableRedirection = false,\n name,\n path,\n handle,\n children,\n page,\n layout,\n error,\n errors,\n loading,\n } = route;\n const routeError = error ?? errors;\n\n // 获取错误组件\n async function getErrorComponent() {\n // 如果 error/errors 是函数,直接使用\n if (typeof routeError === 'function') {\n return routeError();\n }\n\n const errorsMap = transformResult.errors;\n\n // 判断 error/errors 是否为 string 且不是空字符串\n if (typeof routeError === 'string' && routeError !== '') {\n // 使用 routeError 作为 key 获取 transformResult.errors 的值\n const errorResolver = errorsMap.get(routeError);\n\n // 如果获取不到,返回 null\n if (!errorResolver) {\n return null;\n }\n\n // 如果获取到,返回对应的值(调用动态导入函数)\n if (typeof errorResolver === 'function') {\n return errorResolver();\n }\n\n return null;\n }\n\n // 如果 errors 为空,使用配置的默认错误组件或内置的 RouteErrorBoundary 组件\n if (defaultRouteErrorComponent) {\n // 如果配置了默认错误组件,使用配置的组件\n return defaultRouteErrorComponent();\n }\n\n // 如果没有配置默认错误组件,使用内置的 RouteErrorBoundary 组件\n // 直接导入而非懒加载,因为:\n // 1. RouteErrorBoundary 是框架核心组件,体积小\n // 2. 错误边界需要快速响应,直接导入速度更快\n // 3. 作为基础设施组件,应该保证可用性\n return { default: RouteErrorBoundary };\n }\n\n // 获取转换配置\n function convertConfig(m: any) {\n if (!m) {\n return null;\n }\n const { action, loader, shouldRevalidate, default: Component } = m;\n\n // 如果 Component 不存在,记录警告\n if (!Component) {\n logger.warn(`路由组件未找到 default 导出: ${name}`, m);\n }\n\n return {\n action, // always use action\n loader, // always use loader\n shouldRevalidate,\n Component\n };\n }\n\n // 获取加载组件\n async function getLoadingComponent() {\n if (typeof loading === 'function') {\n return loading();\n }\n\n if (typeof loading === 'string' && loading !== '') {\n const loadingResolver = transformResult.loadings.get(loading);\n if (typeof loadingResolver === 'function') {\n return loadingResolver();\n }\n }\n\n if (defaultRouteLoadingComponent) {\n return defaultRouteLoadingComponent();\n }\n\n return null;\n }\n\n // 获取配置\n async function getConfig(index: boolean = false) {\n // 如果有layout和不是index,返回布局配置\n if (layout && !index) {\n // 如果 layout 是函数,直接使用\n if (typeof layout === 'function') {\n const config = await layout();\n return convertConfig(config);\n }\n\n // 如果 layout 是字符串,从 Map 中获取\n if (typeof layout === 'string') {\n const layoutResolver = transformResult.layouts.get(layout);\n if (!layoutResolver) {\n throw new Error(`未找到名为 ${layout} 的布局组件`);\n }\n const config = await layoutResolver();\n return convertConfig(config);\n }\n }\n\n let pageName = name;\n\n // 如果是notFound则转成404\n if (pageName === 'notFound') {\n pageName = '404'\n }\n\n if (page && (!children?.length || index)) {\n // 如果 page 是函数,直接使用\n if (typeof page === 'function') {\n const config = await page();\n return convertConfig(config);\n }\n\n // 如果 page 是字符串,从 Map 中获取\n if (typeof page === 'string') {\n const viewResolver = transformResult.pages.get(page);\n if (!viewResolver) {\n throw new Error(`未找到名为 ${page} 的页面组件`);\n }\n const config = await viewResolver();\n return convertConfig(config);\n }\n }\n\n return null;\n }\n\n // 获取处理信息,即额外的配置信息\n function getHandle(index: boolean = false) {\n if ((layout || isGroup) && !index) {\n return null\n }\n return {\n ...handle,\n name,\n path\n }\n }\n\n\n const reactRoute: RouteObject = {\n children: [],\n id: name,\n handle: getHandle(),\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const config = await getConfig();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n\n // 如果配置为空,确保至少返回一个空对象,避免展开 undefined\n if (!config) {\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n };\n }\n\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...config\n };\n },\n path\n };\n\n if (enableHydrateFallback) {\n reactRoute.hydrateFallbackElement = <DefaultRouteHydrateFallback />;\n }\n\n // 处理子路由\n if (children?.length) {\n reactRoute.children = children.flatMap(child => transformRouteToReactRoute(child)).sort((a, b) => {\n const orderA = a.handle?.order ?? 99;\n const orderB = b.handle?.order ?? 99;\n return orderA - orderB;\n });\n\n if (page && !isGroup) {\n reactRoute.children.unshift({\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n const Component = page;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n Component,\n ...(await getConfig(true))\n };\n }\n });\n }\n\n if (enableRedirection && isGroup) {\n const [firstChild] = reactRoute.children;\n if (firstChild?.path) {\n reactRoute.children.unshift({\n index: true,\n handle: getHandle(true),\n element: <Navigate to={firstChild.path as string} replace />\n });\n }\n }\n\n }\n // 若存在 layout 且没有子路由,但同时声明了 page,则自动生成 index 子路由以渲染页面\n // 场景:/test 使用自定义 layout,且没有 children 时仍应渲染 page\n if ((!children || children.length === 0) && layout && page && !isGroup) {\n reactRoute.children = [{\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n const Component = page;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n Component,\n ...(await getConfig(true))\n };\n }\n }];\n }\n\n return reactRoute;\n }\n\n return transformRouteToReactRoutes(routes);\n}\n"],"names":["transformRoutesToReactRoutes","DefaultRouteHydrateFallback","div","style","padding","textAlign","color","routes","transformResult","defaultRouteErrorComponent","defaultRouteLoadingComponent","enableHydrateFallback","transformRouteToReactRoutes","flatMap","route","transformRouteToReactRoute","isGroup","enableRedirection","name","path","handle","children","page","layout","error","errors","loading","routeError","getErrorComponent","errorsMap","errorResolver","get","default","RouteErrorBoundary","convertConfig","m","action","loader","shouldRevalidate","Component","logger","warn","getLoadingComponent","loadingResolver","loadings","getConfig","index","config","layoutResolver","layouts","Error","pageName","length","viewResolver","pages","getHandle","reactRoute","id","lazy","ErrorBoundary","LoadingComponent","HydrateFallback","hydrateFallbackElement","child","sort","a","b","orderA","order","orderB","unshift","firstChild","element","Navigate","to","replace"],"mappings":"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"}
@@ -188,9 +188,11 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
188
188
  const ErrorBoundary = await getErrorComponent();
189
189
  const LoadingComponent = await getLoadingComponent();
190
190
  const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;
191
+ const Component = page;
191
192
  return {
192
193
  ErrorBoundary: ErrorBoundary?.default,
193
194
  HydrateFallback,
195
+ Component,
194
196
  ...await getConfig(true)
195
197
  };
196
198
  }
@@ -221,9 +223,11 @@ export const transformRoutesToReactRoutes = async (routes, transformResult, defa
221
223
  const ErrorBoundary = await getErrorComponent();
222
224
  const LoadingComponent = await getLoadingComponent();
223
225
  const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;
226
+ const Component = page;
224
227
  return {
225
228
  ErrorBoundary: ErrorBoundary?.default,
226
229
  HydrateFallback,
230
+ Component,
227
231
  ...await getConfig(true)
228
232
  };
229
233
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/transform.tsx"],"sourcesContent":["import type { RouteConfig } from '../../../types';\nimport {\n type RouteObject,\n Navigate\n} from 'react-router-dom';\nimport type { TransformRoutesResult } from '../../transform';\nimport { RouteErrorBoundary } from './RouteErrorBoundary';\nimport type { ComponentImport } from '../../../types';\nimport { logger } from '../../../../../utils';\n\nfunction DefaultRouteHydrateFallback() {\n return (\n <div style={{ padding: 16, textAlign: 'center', color: '#5f6c7b' }}>\n Loading...\n </div>\n );\n}\n\nexport const transformRoutesToReactRoutes = async (\n routes: RouteConfig[], \n transformResult: TransformRoutesResult,\n defaultRouteErrorComponent?: ComponentImport,\n defaultRouteLoadingComponent?: ComponentImport,\n enableHydrateFallback: boolean = false,\n): Promise<RouteObject[]> => {\n\n /**\n * 批量处理路由\n * @param routes 路由组\n */\n function transformRouteToReactRoutes(routes: RouteConfig[]) {\n return routes.flatMap((route: RouteConfig) => transformRouteToReactRoute(route))\n }\n\n /**\n * 处理单个路由\n * @param route 路由\n */\n function transformRouteToReactRoute(route: RouteConfig): RouteObject {\n const {\n isGroup = false,\n enableRedirection = false,\n name,\n path,\n handle,\n children,\n page,\n layout,\n error,\n errors,\n loading,\n } = route;\n const routeError = error ?? errors;\n\n // 获取错误组件\n async function getErrorComponent() {\n // 如果 error/errors 是函数,直接使用\n if (typeof routeError === 'function') {\n return routeError();\n }\n\n const errorsMap = transformResult.errors;\n\n // 判断 error/errors 是否为 string 且不是空字符串\n if (typeof routeError === 'string' && routeError !== '') {\n // 使用 routeError 作为 key 获取 transformResult.errors 的值\n const errorResolver = errorsMap.get(routeError);\n\n // 如果获取不到,返回 null\n if (!errorResolver) {\n return null;\n }\n\n // 如果获取到,返回对应的值(调用动态导入函数)\n if (typeof errorResolver === 'function') {\n return errorResolver();\n }\n\n return null;\n }\n\n // 如果 errors 为空,使用配置的默认错误组件或内置的 RouteErrorBoundary 组件\n if (defaultRouteErrorComponent) {\n // 如果配置了默认错误组件,使用配置的组件\n return defaultRouteErrorComponent();\n }\n\n // 如果没有配置默认错误组件,使用内置的 RouteErrorBoundary 组件\n // 直接导入而非懒加载,因为:\n // 1. RouteErrorBoundary 是框架核心组件,体积小\n // 2. 错误边界需要快速响应,直接导入速度更快\n // 3. 作为基础设施组件,应该保证可用性\n return { default: RouteErrorBoundary };\n }\n\n // 获取转换配置\n function convertConfig(m: any) {\n if (!m) {\n return null;\n }\n const { action, loader, shouldRevalidate, default: Component } = m;\n\n // 如果 Component 不存在,记录警告\n if (!Component) {\n logger.warn(`路由组件未找到 default 导出: ${name}`, m);\n }\n\n return {\n action, // always use action\n loader, // always use loader\n shouldRevalidate,\n Component\n };\n }\n\n // 获取加载组件\n async function getLoadingComponent() {\n if (typeof loading === 'function') {\n return loading();\n }\n\n if (typeof loading === 'string' && loading !== '') {\n const loadingResolver = transformResult.loadings.get(loading);\n if (typeof loadingResolver === 'function') {\n return loadingResolver();\n }\n }\n\n if (defaultRouteLoadingComponent) {\n return defaultRouteLoadingComponent();\n }\n\n return null;\n }\n\n // 获取配置\n async function getConfig(index: boolean = false) {\n // 如果有layout和不是index,返回布局配置\n if (layout && !index) {\n // 如果 layout 是函数,直接使用\n if (typeof layout === 'function') {\n const config = await layout();\n return convertConfig(config);\n }\n\n // 如果 layout 是字符串,从 Map 中获取\n if (typeof layout === 'string') {\n const layoutResolver = transformResult.layouts.get(layout);\n if (!layoutResolver) {\n throw new Error(`未找到名为 ${layout} 的布局组件`);\n }\n const config = await layoutResolver();\n return convertConfig(config);\n }\n }\n\n let pageName = name;\n\n // 如果是notFound则转成404\n if (pageName === 'notFound') {\n pageName = '404'\n }\n\n if (page && (!children?.length || index)) {\n // 如果 page 是函数,直接使用\n if (typeof page === 'function') {\n const config = await page();\n return convertConfig(config);\n }\n\n // 如果 page 是字符串,从 Map 中获取\n if (typeof page === 'string') {\n const viewResolver = transformResult.pages.get(page);\n if (!viewResolver) {\n throw new Error(`未找到名为 ${page} 的页面组件`);\n }\n const config = await viewResolver();\n return convertConfig(config);\n }\n }\n\n return null;\n }\n\n // 获取处理信息,即额外的配置信息\n function getHandle(index: boolean = false) {\n if ((layout || isGroup) && !index) {\n return null\n }\n return {\n ...handle,\n name,\n path\n }\n }\n\n\n const reactRoute: RouteObject = {\n children: [],\n id: name,\n handle: getHandle(),\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const config = await getConfig();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n\n // 如果配置为空,确保至少返回一个空对象,避免展开 undefined\n if (!config) {\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n };\n }\n\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...config\n };\n },\n path\n };\n\n if (enableHydrateFallback) {\n reactRoute.hydrateFallbackElement = <DefaultRouteHydrateFallback />;\n }\n\n // 处理子路由\n if (children?.length) {\n reactRoute.children = children.flatMap(child => transformRouteToReactRoute(child)).sort((a, b) => {\n const orderA = a.handle?.order ?? 99;\n const orderB = b.handle?.order ?? 99;\n return orderA - orderB;\n });\n\n if (page && !isGroup) {\n reactRoute.children.unshift({\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...(await getConfig(true))\n };\n }\n });\n }\n\n if (enableRedirection && isGroup) {\n const [firstChild] = reactRoute.children;\n if (firstChild?.path) {\n reactRoute.children.unshift({\n index: true,\n handle: getHandle(true),\n element: <Navigate to={firstChild.path as string} replace />\n });\n }\n }\n\n }\n // 若存在 layout 且没有子路由,但同时声明了 page,则自动生成 index 子路由以渲染页面\n // 场景:/test 使用自定义 layout,且没有 children 时仍应渲染 page\n if ((!children || children.length === 0) && layout && page && !isGroup) {\n reactRoute.children = [{\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...(await getConfig(true))\n };\n }\n }];\n }\n\n return reactRoute;\n }\n\n return transformRouteToReactRoutes(routes);\n}\n"],"names":["Navigate","RouteErrorBoundary","logger","DefaultRouteHydrateFallback","div","style","padding","textAlign","color","transformRoutesToReactRoutes","routes","transformResult","defaultRouteErrorComponent","defaultRouteLoadingComponent","enableHydrateFallback","transformRouteToReactRoutes","flatMap","route","transformRouteToReactRoute","isGroup","enableRedirection","name","path","handle","children","page","layout","error","errors","loading","routeError","getErrorComponent","errorsMap","errorResolver","get","default","convertConfig","m","action","loader","shouldRevalidate","Component","warn","getLoadingComponent","loadingResolver","loadings","getConfig","index","config","layoutResolver","layouts","Error","pageName","length","viewResolver","pages","getHandle","reactRoute","id","lazy","ErrorBoundary","LoadingComponent","HydrateFallback","hydrateFallbackElement","child","sort","a","b","orderA","order","orderB","unshift","firstChild","element","to","replace"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/transform.tsx"],"sourcesContent":["import type { RouteConfig } from '../../../types';\nimport {\n type RouteObject,\n Navigate\n} from 'react-router-dom';\nimport type { TransformRoutesResult } from '../../transform';\nimport { RouteErrorBoundary } from './RouteErrorBoundary';\nimport type { ComponentImport } from '../../../types';\nimport { logger } from '../../../../../utils';\n\nfunction DefaultRouteHydrateFallback() {\n return (\n <div style={{ padding: 16, textAlign: 'center', color: '#5f6c7b' }}>\n Loading...\n </div>\n );\n}\n\nexport const transformRoutesToReactRoutes = async (\n routes: RouteConfig[],\n transformResult: TransformRoutesResult,\n defaultRouteErrorComponent?: ComponentImport,\n defaultRouteLoadingComponent?: ComponentImport,\n enableHydrateFallback: boolean = false,\n): Promise<RouteObject[]> => {\n\n /**\n * 批量处理路由\n * @param routes 路由组\n */\n function transformRouteToReactRoutes(routes: RouteConfig[]) {\n return routes.flatMap((route: RouteConfig) => transformRouteToReactRoute(route))\n }\n\n /**\n * 处理单个路由\n * @param route 路由\n */\n function transformRouteToReactRoute(route: RouteConfig): RouteObject {\n const {\n isGroup = false,\n enableRedirection = false,\n name,\n path,\n handle,\n children,\n page,\n layout,\n error,\n errors,\n loading,\n } = route;\n const routeError = error ?? errors;\n\n // 获取错误组件\n async function getErrorComponent() {\n // 如果 error/errors 是函数,直接使用\n if (typeof routeError === 'function') {\n return routeError();\n }\n\n const errorsMap = transformResult.errors;\n\n // 判断 error/errors 是否为 string 且不是空字符串\n if (typeof routeError === 'string' && routeError !== '') {\n // 使用 routeError 作为 key 获取 transformResult.errors 的值\n const errorResolver = errorsMap.get(routeError);\n\n // 如果获取不到,返回 null\n if (!errorResolver) {\n return null;\n }\n\n // 如果获取到,返回对应的值(调用动态导入函数)\n if (typeof errorResolver === 'function') {\n return errorResolver();\n }\n\n return null;\n }\n\n // 如果 errors 为空,使用配置的默认错误组件或内置的 RouteErrorBoundary 组件\n if (defaultRouteErrorComponent) {\n // 如果配置了默认错误组件,使用配置的组件\n return defaultRouteErrorComponent();\n }\n\n // 如果没有配置默认错误组件,使用内置的 RouteErrorBoundary 组件\n // 直接导入而非懒加载,因为:\n // 1. RouteErrorBoundary 是框架核心组件,体积小\n // 2. 错误边界需要快速响应,直接导入速度更快\n // 3. 作为基础设施组件,应该保证可用性\n return { default: RouteErrorBoundary };\n }\n\n // 获取转换配置\n function convertConfig(m: any) {\n if (!m) {\n return null;\n }\n const { action, loader, shouldRevalidate, default: Component } = m;\n\n // 如果 Component 不存在,记录警告\n if (!Component) {\n logger.warn(`路由组件未找到 default 导出: ${name}`, m);\n }\n\n return {\n action, // always use action\n loader, // always use loader\n shouldRevalidate,\n Component\n };\n }\n\n // 获取加载组件\n async function getLoadingComponent() {\n if (typeof loading === 'function') {\n return loading();\n }\n\n if (typeof loading === 'string' && loading !== '') {\n const loadingResolver = transformResult.loadings.get(loading);\n if (typeof loadingResolver === 'function') {\n return loadingResolver();\n }\n }\n\n if (defaultRouteLoadingComponent) {\n return defaultRouteLoadingComponent();\n }\n\n return null;\n }\n\n // 获取配置\n async function getConfig(index: boolean = false) {\n // 如果有layout和不是index,返回布局配置\n if (layout && !index) {\n // 如果 layout 是函数,直接使用\n if (typeof layout === 'function') {\n const config = await layout();\n return convertConfig(config);\n }\n\n // 如果 layout 是字符串,从 Map 中获取\n if (typeof layout === 'string') {\n const layoutResolver = transformResult.layouts.get(layout);\n if (!layoutResolver) {\n throw new Error(`未找到名为 ${layout} 的布局组件`);\n }\n const config = await layoutResolver();\n return convertConfig(config);\n }\n }\n\n let pageName = name;\n\n // 如果是notFound则转成404\n if (pageName === 'notFound') {\n pageName = '404'\n }\n\n if (page && (!children?.length || index)) {\n // 如果 page 是函数,直接使用\n if (typeof page === 'function') {\n const config = await page();\n return convertConfig(config);\n }\n\n // 如果 page 是字符串,从 Map 中获取\n if (typeof page === 'string') {\n const viewResolver = transformResult.pages.get(page);\n if (!viewResolver) {\n throw new Error(`未找到名为 ${page} 的页面组件`);\n }\n const config = await viewResolver();\n return convertConfig(config);\n }\n }\n\n return null;\n }\n\n // 获取处理信息,即额外的配置信息\n function getHandle(index: boolean = false) {\n if ((layout || isGroup) && !index) {\n return null\n }\n return {\n ...handle,\n name,\n path\n }\n }\n\n\n const reactRoute: RouteObject = {\n children: [],\n id: name,\n handle: getHandle(),\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const config = await getConfig();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n\n // 如果配置为空,确保至少返回一个空对象,避免展开 undefined\n if (!config) {\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n };\n }\n\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n ...config\n };\n },\n path\n };\n\n if (enableHydrateFallback) {\n reactRoute.hydrateFallbackElement = <DefaultRouteHydrateFallback />;\n }\n\n // 处理子路由\n if (children?.length) {\n reactRoute.children = children.flatMap(child => transformRouteToReactRoute(child)).sort((a, b) => {\n const orderA = a.handle?.order ?? 99;\n const orderB = b.handle?.order ?? 99;\n return orderA - orderB;\n });\n\n if (page && !isGroup) {\n reactRoute.children.unshift({\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n const Component = page;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n Component,\n ...(await getConfig(true))\n };\n }\n });\n }\n\n if (enableRedirection && isGroup) {\n const [firstChild] = reactRoute.children;\n if (firstChild?.path) {\n reactRoute.children.unshift({\n index: true,\n handle: getHandle(true),\n element: <Navigate to={firstChild.path as string} replace />\n });\n }\n }\n\n }\n // 若存在 layout 且没有子路由,但同时声明了 page,则自动生成 index 子路由以渲染页面\n // 场景:/test 使用自定义 layout,且没有 children 时仍应渲染 page\n if ((!children || children.length === 0) && layout && page && !isGroup) {\n reactRoute.children = [{\n handle: getHandle(true),\n index: true,\n lazy: async () => {\n const ErrorBoundary = await getErrorComponent();\n const LoadingComponent = await getLoadingComponent();\n const HydrateFallback = LoadingComponent?.default ?? DefaultRouteHydrateFallback;\n const Component = page;\n return {\n ErrorBoundary: ErrorBoundary?.default,\n HydrateFallback,\n Component,\n ...(await getConfig(true))\n };\n }\n }];\n }\n\n return reactRoute;\n }\n\n return transformRouteToReactRoutes(routes);\n}\n"],"names":["Navigate","RouteErrorBoundary","logger","DefaultRouteHydrateFallback","div","style","padding","textAlign","color","transformRoutesToReactRoutes","routes","transformResult","defaultRouteErrorComponent","defaultRouteLoadingComponent","enableHydrateFallback","transformRouteToReactRoutes","flatMap","route","transformRouteToReactRoute","isGroup","enableRedirection","name","path","handle","children","page","layout","error","errors","loading","routeError","getErrorComponent","errorsMap","errorResolver","get","default","convertConfig","m","action","loader","shouldRevalidate","Component","warn","getLoadingComponent","loadingResolver","loadings","getConfig","index","config","layoutResolver","layouts","Error","pageName","length","viewResolver","pages","getHandle","reactRoute","id","lazy","ErrorBoundary","LoadingComponent","HydrateFallback","hydrateFallbackElement","child","sort","a","b","orderA","order","orderB","unshift","firstChild","element","to","replace"],"mappings":"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"}
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "initializeServices", {
12
12
  }
13
13
  });
14
14
  const _utils = require("../../utils");
15
- const _monitoring = require("../../utils/monitoring");
15
+ const _monitoring = require("@vlian/monitoring");
16
16
  const _performance = require("../../utils/performance");
17
17
  const _library = require("../../library");
18
18
  const _state = require("../../state");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/startup/initializeServices.ts"],"sourcesContent":["/**\n * 服务初始化模块\n * 负责初始化框架所需的各种服务\n */\n\nimport { logger } from '../../utils';\nimport { initMonitoring } from '../../utils/monitoring';\nimport type { MonitoringService } from '../../utils/monitoring';\nimport { PerformanceMonitor } from '../../utils/performance';\nimport { storage } from '../../library';\nimport { StateManager } from '../../state';\nimport type { StartOptions } from '../types';\nimport { AppEventBus } from '../event/AppEventBus';\nimport type { AppEventBusConfig } from '../event/types';\n\n/**\n * 重试配置\n */\nexport interface RetryConfig {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n}\n\n/**\n * 服务初始化结果\n */\nexport interface ServicesInitResult {\n /**\n * 监控服务实例\n */\n monitoring: MonitoringService;\n\n /**\n * 性能监控实例\n */\n performanceMonitor: PerformanceMonitor;\n\n /**\n * 状态管理器实例\n */\n stateManager: StateManager;\n\n /**\n * 事件总线实例\n */\n eventBus: AppEventBus;\n\n /**\n * 延迟初始化非关键服务的函数\n * 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化\n */\n initializeNonCriticalServices?: () => Promise<void>;\n}\n\n/**\n * 带重试的异步函数执行器\n */\nasync function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig = {},\n serviceName: string\n): Promise<T> {\n const maxRetries = config.maxRetries ?? 3;\n const retryDelay = config.retryDelay ?? 1000;\n const exponentialBackoff = config.exponentialBackoff ?? true;\n\n let lastError: unknown;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n \n if (attempt < maxRetries) {\n const delay = exponentialBackoff \n ? retryDelay * Math.pow(2, attempt)\n : retryDelay;\n \n logger.warn(\n `${serviceName} 初始化失败(尝试 ${attempt + 1}/${maxRetries + 1}),${delay}ms 后重试...`,\n error\n );\n \n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n \n logger.error(`${serviceName} 初始化失败,已重试 ${maxRetries} 次`);\n throw lastError;\n}\n\n/**\n * 初始化所有服务\n * \n * 优化:\n * 1. 区分关键服务和非关键服务\n * 2. 关键服务并行初始化,缩短首屏时间\n * 3. 非关键服务延迟到应用渲染后初始化,使用 requestIdleCallback 在空闲时初始化\n * 4. 实现服务初始化失败重试机制,提高启动成功率\n * \n * @param options - 启动配置选项\n * @returns 服务初始化结果\n */\nexport async function initializeServices(\n options: StartOptions = {}\n): Promise<ServicesInitResult> {\n const startTime = performance.now();\n \n // 重试配置\n const retryConfig: RetryConfig = {\n maxRetries: options.serviceRetry?.maxRetries ?? 3,\n retryDelay: options.serviceRetry?.retryDelay ?? 1000,\n exponentialBackoff: options.serviceRetry?.exponentialBackoff ?? true,\n };\n\n // ========== 关键服务:必须在应用渲染前初始化 ==========\n // 这些服务是应用运行的基础,必须并行初始化完成\n\n // 1. 监控服务(必须最先初始化,因为其他服务可能依赖它)\n const monitoringPromise = withRetry(\n () => Promise.resolve(initMonitoring({\n ...options.errorMonitor,\n onError: (error) => {\n logger.error('监控服务捕获到错误:', error);\n options.errorMonitor?.onError?.(error);\n },\n })),\n retryConfig,\n '监控服务'\n );\n\n // 2. 存储服务(关键服务,应用可能需要立即使用存储)\n const storagePromise = withRetry(\n () => Promise.resolve().then(() => {\n storage.initialize(options.storageOptions);\n return storage;\n }),\n retryConfig,\n '存储服务'\n );\n\n // 3. 状态管理器(关键服务,应用状态管理的基础)\n const stateManagerPromise = withRetry(\n () => Promise.resolve().then(() => {\n if (options.stateManager !== undefined) {\n return new StateManager(options.stateManager);\n } else {\n // 默认初始化状态管理器\n return new StateManager({\n enableRegistry: true,\n defaultScope: 'app',\n });\n }\n }),\n retryConfig,\n '状态管理器'\n );\n\n // 4. 事件总线(关键服务,用于应用内部通信)\n const eventBusPromise = withRetry(\n () => Promise.resolve().then(() => {\n const eventBusConfig: AppEventBusConfig = {\n enableTracking: options.eventBus?.enableTracking ?? (process.env.NODE_ENV === 'development'),\n maxHistorySize: options.eventBus?.maxHistorySize ?? 100,\n enableValidation: options.eventBus?.enableValidation ?? false,\n enablePerformanceMonitoring: options.eventBus?.enablePerformanceMonitoring ?? (process.env.NODE_ENV === 'development'),\n namespacePrefix: options.eventBus?.namespacePrefix,\n instanceId: options.eventBus?.instanceId,\n enableSecurityMode: options.eventBus?.enableSecurityMode ?? false,\n allowedSources: options.eventBus?.allowedSources,\n };\n return new AppEventBus(eventBusConfig);\n }),\n retryConfig,\n '事件总线'\n );\n\n // 并行执行关键服务初始化\n const [monitoring, , stateManager, eventBus] = await Promise.all([\n monitoringPromise,\n storagePromise,\n stateManagerPromise,\n eventBusPromise,\n ]);\n\n logger.info('关键服务初始化完成');\n\n // 初始化性能监控(依赖监控服务,必须在监控服务初始化后)\n const performanceMonitor = new PerformanceMonitor({\n ...options.performanceMonitor,\n onReport: (metrics) => {\n monitoring.reportPerformance(metrics);\n options.performanceMonitor?.onReport?.(metrics);\n },\n });\n\n // 在页面卸载时清理性能监控\n if (typeof window !== 'undefined') {\n const cleanupHandler = () => {\n performanceMonitor.disconnect();\n window.removeEventListener('beforeunload', cleanupHandler);\n };\n window.addEventListener('beforeunload', cleanupHandler);\n }\n\n const criticalServicesDuration = performance.now() - startTime;\n logger.debug(`关键服务初始化完成,耗时: ${criticalServicesDuration.toFixed(2)}ms`);\n\n // ========== 非关键服务:延迟到应用渲染后初始化 ==========\n // 这些服务不影响首屏渲染,可以在空闲时初始化\n\n /**\n * 延迟初始化非关键服务\n * 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化\n */\n const initializeNonCriticalServices = async (): Promise<void> => {\n const nonCriticalStartTime = performance.now();\n \n // 使用 requestIdleCallback 在浏览器空闲时初始化非关键服务\n // 如果不支持 requestIdleCallback,则使用 setTimeout 延迟执行\n const scheduleInit = (callback: () => void) => {\n if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {\n window.requestIdleCallback(callback, { timeout: 5000 });\n } else {\n setTimeout(callback, 100);\n }\n };\n\n return new Promise<void>((resolve) => {\n scheduleInit(async () => {\n try {\n // 1. 分析服务(可选,非关键)\n if (options.analytics) {\n try {\n await withRetry(\n () => import('../../utils/analytics').then(({ initAnalytics }) => {\n initAnalytics(options.analytics!);\n return true;\n }),\n retryConfig,\n '分析服务'\n );\n logger.debug('分析服务初始化完成');\n } catch (error) {\n logger.warn('分析服务初始化失败(不影响应用运行):', error);\n }\n }\n\n // 2. 运行时安全服务(可选,非关键)\n if (options.runtimeSecurity) {\n try {\n await withRetry(\n () => import('../../utils/runtimeSecurity').then(({ RuntimeSecurity }) => {\n RuntimeSecurity.initialize(options.runtimeSecurity!);\n return true;\n }),\n retryConfig,\n '运行时安全服务'\n );\n logger.debug('运行时安全服务初始化完成');\n } catch (error) {\n logger.warn('运行时安全服务初始化失败(不影响应用运行):', error);\n }\n }\n\n const nonCriticalDuration = performance.now() - nonCriticalStartTime;\n logger.debug(`非关键服务初始化完成,耗时: ${nonCriticalDuration.toFixed(2)}ms`);\n } catch (error) {\n logger.warn('非关键服务初始化过程中出现错误:', error);\n } finally {\n resolve();\n }\n });\n });\n };\n\n // 记录关键服务初始化性能指标\n if (monitoring.reportPerformance) {\n monitoring.reportPerformance({\n serviceInitDuration: criticalServicesDuration,\n } as any);\n }\n\n return {\n monitoring,\n performanceMonitor,\n stateManager,\n eventBus,\n initializeNonCriticalServices,\n };\n}\n"],"names":["initializeServices","withRetry","fn","config","serviceName","maxRetries","retryDelay","exponentialBackoff","lastError","attempt","error","delay","Math","pow","logger","warn","Promise","resolve","setTimeout","options","startTime","performance","now","retryConfig","serviceRetry","monitoringPromise","initMonitoring","errorMonitor","onError","storagePromise","then","storage","initialize","storageOptions","stateManagerPromise","stateManager","undefined","StateManager","enableRegistry","defaultScope","eventBusPromise","eventBusConfig","enableTracking","eventBus","process","env","NODE_ENV","maxHistorySize","enableValidation","enablePerformanceMonitoring","namespacePrefix","instanceId","enableSecurityMode","allowedSources","AppEventBus","monitoring","all","info","performanceMonitor","PerformanceMonitor","onReport","metrics","reportPerformance","window","cleanupHandler","disconnect","removeEventListener","addEventListener","criticalServicesDuration","debug","toFixed","initializeNonCriticalServices","nonCriticalStartTime","scheduleInit","callback","requestIdleCallback","timeout","analytics","initAnalytics","runtimeSecurity","RuntimeSecurity","nonCriticalDuration","serviceInitDuration"],"mappings":"AAAA;;;CAGC;;;;+BAmHqBA;;;eAAAA;;;uBAjHC;4BACQ;6BAEI;yBACX;uBACK;6BAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuD5B;;CAEC,GACD,eAAeC,UACbC,EAAoB,EACpBC,SAAsB,CAAC,CAAC,EACxBC,WAAmB;IAEnB,MAAMC,aAAaF,OAAOE,UAAU,IAAI;IACxC,MAAMC,aAAaH,OAAOG,UAAU,IAAI;IACxC,MAAMC,qBAAqBJ,OAAOI,kBAAkB,IAAI;IAExD,IAAIC;IAEJ,IAAK,IAAIC,UAAU,GAAGA,WAAWJ,YAAYI,UAAW;QACtD,IAAI;YACF,OAAO,MAAMP;QACf,EAAE,OAAOQ,OAAO;YACdF,YAAYE;YAEZ,IAAID,UAAUJ,YAAY;gBACxB,MAAMM,QAAQJ,qBACVD,aAAaM,KAAKC,GAAG,CAAC,GAAGJ,WACzBH;gBAEJQ,aAAM,CAACC,IAAI,CACT,GAAGX,YAAY,UAAU,EAAEK,UAAU,EAAE,CAAC,EAAEJ,aAAa,EAAE,EAAE,EAAEM,MAAM,SAAS,CAAC,EAC7ED;gBAGF,MAAM,IAAIM,QAAQC,CAAAA,UAAWC,WAAWD,SAASN;YACnD;QACF;IACF;IAEAG,aAAM,CAACJ,KAAK,CAAC,GAAGN,YAAY,WAAW,EAAEC,WAAW,EAAE,CAAC;IACvD,MAAMG;AACR;AAcO,eAAeR,mBACpBmB,UAAwB,CAAC,CAAC;IAE1B,MAAMC,YAAYC,YAAYC,GAAG;IAEjC,OAAO;IACP,MAAMC,cAA2B;QAC/BlB,YAAYc,QAAQK,YAAY,EAAEnB,cAAc;QAChDC,YAAYa,QAAQK,YAAY,EAAElB,cAAc;QAChDC,oBAAoBY,QAAQK,YAAY,EAAEjB,sBAAsB;IAClE;IAEA,yCAAyC;IACzC,yBAAyB;IAEzB,+BAA+B;IAC/B,MAAMkB,oBAAoBxB,UACxB,IAAMe,QAAQC,OAAO,CAACS,IAAAA,0BAAc,EAAC;YACnC,GAAGP,QAAQQ,YAAY;YACvBC,SAAS,CAAClB;gBACRI,aAAM,CAACJ,KAAK,CAAC,cAAcA;gBAC3BS,QAAQQ,YAAY,EAAEC,UAAUlB;YAClC;QACF,KACAa,aACA;IAGF,6BAA6B;IAC7B,MAAMM,iBAAiB5B,UACrB,IAAMe,QAAQC,OAAO,GAAGa,IAAI,CAAC;YAC3BC,gBAAO,CAACC,UAAU,CAACb,QAAQc,cAAc;YACzC,OAAOF,gBAAO;QAChB,IACAR,aACA;IAGF,2BAA2B;IAC3B,MAAMW,sBAAsBjC,UAC1B,IAAMe,QAAQC,OAAO,GAAGa,IAAI,CAAC;YAC3B,IAAIX,QAAQgB,YAAY,KAAKC,WAAW;gBACtC,OAAO,IAAIC,mBAAY,CAAClB,QAAQgB,YAAY;YAC9C,OAAO;gBACL,aAAa;gBACb,OAAO,IAAIE,mBAAY,CAAC;oBACtBC,gBAAgB;oBAChBC,cAAc;gBAChB;YACF;QACF,IACAhB,aACA;IAGF,yBAAyB;IACzB,MAAMiB,kBAAkBvC,UACtB,IAAMe,QAAQC,OAAO,GAAGa,IAAI,CAAC;YAC3B,MAAMW,iBAAoC;gBACxCC,gBAAgBvB,QAAQwB,QAAQ,EAAED,kBAAmBE,QAAQC,GAAG,CAACC,QAAQ,KAAK;gBAC9EC,gBAAgB5B,QAAQwB,QAAQ,EAAEI,kBAAkB;gBACpDC,kBAAkB7B,QAAQwB,QAAQ,EAAEK,oBAAoB;gBACxDC,6BAA6B9B,QAAQwB,QAAQ,EAAEM,+BAAgCL,QAAQC,GAAG,CAACC,QAAQ,KAAK;gBACxGI,iBAAiB/B,QAAQwB,QAAQ,EAAEO;gBACnCC,YAAYhC,QAAQwB,QAAQ,EAAEQ;gBAC9BC,oBAAoBjC,QAAQwB,QAAQ,EAAES,sBAAsB;gBAC5DC,gBAAgBlC,QAAQwB,QAAQ,EAAEU;YACpC;YACA,OAAO,IAAIC,wBAAW,CAACb;QACzB,IACAlB,aACA;IAGF,cAAc;IACd,MAAM,CAACgC,cAAcpB,cAAcQ,SAAS,GAAG,MAAM3B,QAAQwC,GAAG,CAAC;QAC/D/B;QACAI;QACAK;QACAM;KACD;IAED1B,aAAM,CAAC2C,IAAI,CAAC;IAEZ,8BAA8B;IAC9B,MAAMC,qBAAqB,IAAIC,+BAAkB,CAAC;QAChD,GAAGxC,QAAQuC,kBAAkB;QAC7BE,UAAU,CAACC;YACTN,WAAWO,iBAAiB,CAACD;YAC7B1C,QAAQuC,kBAAkB,EAAEE,WAAWC;QACzC;IACF;IAEA,eAAe;IACf,IAAI,OAAOE,WAAW,aAAa;QACjC,MAAMC,iBAAiB;YACrBN,mBAAmBO,UAAU;YAC7BF,OAAOG,mBAAmB,CAAC,gBAAgBF;QAC7C;QACAD,OAAOI,gBAAgB,CAAC,gBAAgBH;IAC1C;IAEA,MAAMI,2BAA2B/C,YAAYC,GAAG,KAAKF;IACrDN,aAAM,CAACuD,KAAK,CAAC,CAAC,cAAc,EAAED,yBAAyBE,OAAO,CAAC,GAAG,EAAE,CAAC;IAErE,0CAA0C;IAC1C,wBAAwB;IAExB;;;GAGC,GACD,MAAMC,gCAAgC;QACpC,MAAMC,uBAAuBnD,YAAYC,GAAG;QAE5C,yCAAyC;QACzC,gDAAgD;QAChD,MAAMmD,eAAe,CAACC;YACpB,IAAI,OAAOX,WAAW,eAAe,yBAAyBA,QAAQ;gBACpEA,OAAOY,mBAAmB,CAACD,UAAU;oBAAEE,SAAS;gBAAK;YACvD,OAAO;gBACL1D,WAAWwD,UAAU;YACvB;QACF;QAEA,OAAO,IAAI1D,QAAc,CAACC;YACxBwD,aAAa;gBACX,IAAI;oBACF,kBAAkB;oBAClB,IAAItD,QAAQ0D,SAAS,EAAE;wBACrB,IAAI;4BACF,MAAM5E,UACJ,IAAM,mEAAA,QAAO,2BAAyB6B,IAAI,CAAC,CAAC,EAAEgD,aAAa,EAAE;oCAC3DA,cAAc3D,QAAQ0D,SAAS;oCAC/B,OAAO;gCACT,IACAtD,aACA;4BAEFT,aAAM,CAACuD,KAAK,CAAC;wBACf,EAAE,OAAO3D,OAAO;4BACdI,aAAM,CAACC,IAAI,CAAC,uBAAuBL;wBACrC;oBACF;oBAEA,qBAAqB;oBACrB,IAAIS,QAAQ4D,eAAe,EAAE;wBAC3B,IAAI;4BACF,MAAM9E,UACJ,IAAM,mEAAA,QAAO,iCAA+B6B,IAAI,CAAC,CAAC,EAAEkD,eAAe,EAAE;oCACnEA,gBAAgBhD,UAAU,CAACb,QAAQ4D,eAAe;oCAClD,OAAO;gCACT,IACAxD,aACA;4BAEFT,aAAM,CAACuD,KAAK,CAAC;wBACf,EAAE,OAAO3D,OAAO;4BACdI,aAAM,CAACC,IAAI,CAAC,0BAA0BL;wBACxC;oBACF;oBAEA,MAAMuE,sBAAsB5D,YAAYC,GAAG,KAAKkD;oBAChD1D,aAAM,CAACuD,KAAK,CAAC,CAAC,eAAe,EAAEY,oBAAoBX,OAAO,CAAC,GAAG,EAAE,CAAC;gBACnE,EAAE,OAAO5D,OAAO;oBACdI,aAAM,CAACC,IAAI,CAAC,oBAAoBL;gBAClC,SAAU;oBACRO;gBACF;YACF;QACF;IACF;IAEA,gBAAgB;IAChB,IAAIsC,WAAWO,iBAAiB,EAAE;QAChCP,WAAWO,iBAAiB,CAAC;YAC3BoB,qBAAqBd;QACvB;IACF;IAEA,OAAO;QACLb;QACAG;QACAvB;QACAQ;QACA4B;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/core/startup/initializeServices.ts"],"sourcesContent":["/**\n * 服务初始化模块\n * 负责初始化框架所需的各种服务\n */\n\nimport { logger } from '../../utils';\nimport { initMonitoring } from '@vlian/monitoring';\nimport type { MonitoringService } from '@vlian/monitoring';\nimport { PerformanceMonitor } from '../../utils/performance';\nimport { storage } from '../../library';\nimport { StateManager } from '../../state';\nimport type { StartOptions } from '../types';\nimport { AppEventBus } from '../event/AppEventBus';\nimport type { AppEventBusConfig } from '../event/types';\n\n/**\n * 重试配置\n */\nexport interface RetryConfig {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n}\n\n/**\n * 服务初始化结果\n */\nexport interface ServicesInitResult {\n /**\n * 监控服务实例\n */\n monitoring: MonitoringService;\n\n /**\n * 性能监控实例\n */\n performanceMonitor: PerformanceMonitor;\n\n /**\n * 状态管理器实例\n */\n stateManager: StateManager;\n\n /**\n * 事件总线实例\n */\n eventBus: AppEventBus;\n\n /**\n * 延迟初始化非关键服务的函数\n * 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化\n */\n initializeNonCriticalServices?: () => Promise<void>;\n}\n\n/**\n * 带重试的异步函数执行器\n */\nasync function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig = {},\n serviceName: string\n): Promise<T> {\n const maxRetries = config.maxRetries ?? 3;\n const retryDelay = config.retryDelay ?? 1000;\n const exponentialBackoff = config.exponentialBackoff ?? true;\n\n let lastError: unknown;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n \n if (attempt < maxRetries) {\n const delay = exponentialBackoff \n ? retryDelay * Math.pow(2, attempt)\n : retryDelay;\n \n logger.warn(\n `${serviceName} 初始化失败(尝试 ${attempt + 1}/${maxRetries + 1}),${delay}ms 后重试...`,\n error\n );\n \n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n \n logger.error(`${serviceName} 初始化失败,已重试 ${maxRetries} 次`);\n throw lastError;\n}\n\n/**\n * 初始化所有服务\n * \n * 优化:\n * 1. 区分关键服务和非关键服务\n * 2. 关键服务并行初始化,缩短首屏时间\n * 3. 非关键服务延迟到应用渲染后初始化,使用 requestIdleCallback 在空闲时初始化\n * 4. 实现服务初始化失败重试机制,提高启动成功率\n * \n * @param options - 启动配置选项\n * @returns 服务初始化结果\n */\nexport async function initializeServices(\n options: StartOptions = {}\n): Promise<ServicesInitResult> {\n const startTime = performance.now();\n \n // 重试配置\n const retryConfig: RetryConfig = {\n maxRetries: options.serviceRetry?.maxRetries ?? 3,\n retryDelay: options.serviceRetry?.retryDelay ?? 1000,\n exponentialBackoff: options.serviceRetry?.exponentialBackoff ?? true,\n };\n\n // ========== 关键服务:必须在应用渲染前初始化 ==========\n // 这些服务是应用运行的基础,必须并行初始化完成\n\n // 1. 监控服务(必须最先初始化,因为其他服务可能依赖它)\n const monitoringPromise = withRetry(\n () => Promise.resolve(initMonitoring({\n ...options.errorMonitor,\n onError: (error) => {\n logger.error('监控服务捕获到错误:', error);\n options.errorMonitor?.onError?.(error);\n },\n })),\n retryConfig,\n '监控服务'\n );\n\n // 2. 存储服务(关键服务,应用可能需要立即使用存储)\n const storagePromise = withRetry(\n () => Promise.resolve().then(() => {\n storage.initialize(options.storageOptions);\n return storage;\n }),\n retryConfig,\n '存储服务'\n );\n\n // 3. 状态管理器(关键服务,应用状态管理的基础)\n const stateManagerPromise = withRetry(\n () => Promise.resolve().then(() => {\n if (options.stateManager !== undefined) {\n return new StateManager(options.stateManager);\n } else {\n // 默认初始化状态管理器\n return new StateManager({\n enableRegistry: true,\n defaultScope: 'app',\n });\n }\n }),\n retryConfig,\n '状态管理器'\n );\n\n // 4. 事件总线(关键服务,用于应用内部通信)\n const eventBusPromise = withRetry(\n () => Promise.resolve().then(() => {\n const eventBusConfig: AppEventBusConfig = {\n enableTracking: options.eventBus?.enableTracking ?? (process.env.NODE_ENV === 'development'),\n maxHistorySize: options.eventBus?.maxHistorySize ?? 100,\n enableValidation: options.eventBus?.enableValidation ?? false,\n enablePerformanceMonitoring: options.eventBus?.enablePerformanceMonitoring ?? (process.env.NODE_ENV === 'development'),\n namespacePrefix: options.eventBus?.namespacePrefix,\n instanceId: options.eventBus?.instanceId,\n enableSecurityMode: options.eventBus?.enableSecurityMode ?? false,\n allowedSources: options.eventBus?.allowedSources,\n };\n return new AppEventBus(eventBusConfig);\n }),\n retryConfig,\n '事件总线'\n );\n\n // 并行执行关键服务初始化\n const [monitoring, , stateManager, eventBus] = await Promise.all([\n monitoringPromise,\n storagePromise,\n stateManagerPromise,\n eventBusPromise,\n ]);\n\n logger.info('关键服务初始化完成');\n\n // 初始化性能监控(依赖监控服务,必须在监控服务初始化后)\n const performanceMonitor = new PerformanceMonitor({\n ...options.performanceMonitor,\n onReport: (metrics) => {\n monitoring.reportPerformance(metrics);\n options.performanceMonitor?.onReport?.(metrics);\n },\n });\n\n // 在页面卸载时清理性能监控\n if (typeof window !== 'undefined') {\n const cleanupHandler = () => {\n performanceMonitor.disconnect();\n window.removeEventListener('beforeunload', cleanupHandler);\n };\n window.addEventListener('beforeunload', cleanupHandler);\n }\n\n const criticalServicesDuration = performance.now() - startTime;\n logger.debug(`关键服务初始化完成,耗时: ${criticalServicesDuration.toFixed(2)}ms`);\n\n // ========== 非关键服务:延迟到应用渲染后初始化 ==========\n // 这些服务不影响首屏渲染,可以在空闲时初始化\n\n /**\n * 延迟初始化非关键服务\n * 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化\n */\n const initializeNonCriticalServices = async (): Promise<void> => {\n const nonCriticalStartTime = performance.now();\n \n // 使用 requestIdleCallback 在浏览器空闲时初始化非关键服务\n // 如果不支持 requestIdleCallback,则使用 setTimeout 延迟执行\n const scheduleInit = (callback: () => void) => {\n if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {\n window.requestIdleCallback(callback, { timeout: 5000 });\n } else {\n setTimeout(callback, 100);\n }\n };\n\n return new Promise<void>((resolve) => {\n scheduleInit(async () => {\n try {\n // 1. 分析服务(可选,非关键)\n if (options.analytics) {\n try {\n await withRetry(\n () => import('../../utils/analytics').then(({ initAnalytics }) => {\n initAnalytics(options.analytics!);\n return true;\n }),\n retryConfig,\n '分析服务'\n );\n logger.debug('分析服务初始化完成');\n } catch (error) {\n logger.warn('分析服务初始化失败(不影响应用运行):', error);\n }\n }\n\n // 2. 运行时安全服务(可选,非关键)\n if (options.runtimeSecurity) {\n try {\n await withRetry(\n () => import('../../utils/runtimeSecurity').then(({ RuntimeSecurity }) => {\n RuntimeSecurity.initialize(options.runtimeSecurity!);\n return true;\n }),\n retryConfig,\n '运行时安全服务'\n );\n logger.debug('运行时安全服务初始化完成');\n } catch (error) {\n logger.warn('运行时安全服务初始化失败(不影响应用运行):', error);\n }\n }\n\n const nonCriticalDuration = performance.now() - nonCriticalStartTime;\n logger.debug(`非关键服务初始化完成,耗时: ${nonCriticalDuration.toFixed(2)}ms`);\n } catch (error) {\n logger.warn('非关键服务初始化过程中出现错误:', error);\n } finally {\n resolve();\n }\n });\n });\n };\n\n // 记录关键服务初始化性能指标\n if (monitoring.reportPerformance) {\n monitoring.reportPerformance({\n serviceInitDuration: criticalServicesDuration,\n } as any);\n }\n\n return {\n monitoring,\n performanceMonitor,\n stateManager,\n eventBus,\n initializeNonCriticalServices,\n };\n}\n"],"names":["initializeServices","withRetry","fn","config","serviceName","maxRetries","retryDelay","exponentialBackoff","lastError","attempt","error","delay","Math","pow","logger","warn","Promise","resolve","setTimeout","options","startTime","performance","now","retryConfig","serviceRetry","monitoringPromise","initMonitoring","errorMonitor","onError","storagePromise","then","storage","initialize","storageOptions","stateManagerPromise","stateManager","undefined","StateManager","enableRegistry","defaultScope","eventBusPromise","eventBusConfig","enableTracking","eventBus","process","env","NODE_ENV","maxHistorySize","enableValidation","enablePerformanceMonitoring","namespacePrefix","instanceId","enableSecurityMode","allowedSources","AppEventBus","monitoring","all","info","performanceMonitor","PerformanceMonitor","onReport","metrics","reportPerformance","window","cleanupHandler","disconnect","removeEventListener","addEventListener","criticalServicesDuration","debug","toFixed","initializeNonCriticalServices","nonCriticalStartTime","scheduleInit","callback","requestIdleCallback","timeout","analytics","initAnalytics","runtimeSecurity","RuntimeSecurity","nonCriticalDuration","serviceInitDuration"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * 服务初始化模块
3
3
  * 负责初始化框架所需的各种服务
4
4
  */
5
- import type { MonitoringService } from '../../utils/monitoring';
5
+ import type { MonitoringService } from '@vlian/monitoring';
6
6
  import { PerformanceMonitor } from '../../utils/performance';
7
7
  import { StateManager } from '../../state';
8
8
  import type { StartOptions } from '../types';
@@ -2,7 +2,7 @@
2
2
  * 服务初始化模块
3
3
  * 负责初始化框架所需的各种服务
4
4
  */ import { logger } from "../../utils";
5
- import { initMonitoring } from "../../utils/monitoring";
5
+ import { initMonitoring } from "@vlian/monitoring";
6
6
  import { PerformanceMonitor } from "../../utils/performance";
7
7
  import { storage } from "../../library";
8
8
  import { StateManager } from "../../state";