@vlian/framework 1.2.25 → 1.2.38

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 (319) hide show
  1. package/dist/analytics.umd.js +208 -2395
  2. package/dist/analytics.umd.js.map +1 -1
  3. package/dist/core/Test.cjs +2 -2
  4. package/dist/core/Test.cjs.map +1 -1
  5. package/dist/core/Test.js +1 -1
  6. package/dist/core/Test.js.map +1 -1
  7. package/dist/core/config/ConfigLoader.cjs +7 -7
  8. package/dist/core/config/ConfigLoader.cjs.map +1 -1
  9. package/dist/core/config/ConfigLoader.js +1 -1
  10. package/dist/core/config/ConfigLoader.js.map +1 -1
  11. package/dist/core/error/ErrorBoundary.cjs +6 -6
  12. package/dist/core/error/ErrorBoundary.cjs.map +1 -1
  13. package/dist/core/error/ErrorBoundary.d.ts +1 -1
  14. package/dist/core/error/ErrorBoundary.js +2 -2
  15. package/dist/core/error/ErrorBoundary.js.map +1 -1
  16. package/dist/core/error/ErrorHandler.cjs +19 -19
  17. package/dist/core/error/ErrorHandler.cjs.map +1 -1
  18. package/dist/core/error/ErrorHandler.d.ts +2 -2
  19. package/dist/core/error/ErrorHandler.js +2 -2
  20. package/dist/core/error/ErrorHandler.js.map +1 -1
  21. package/dist/core/event/AppEventBus.cjs +5 -5
  22. package/dist/core/event/AppEventBus.cjs.map +1 -1
  23. package/dist/core/event/AppEventBus.js +1 -1
  24. package/dist/core/event/AppEventBus.js.map +1 -1
  25. package/dist/core/initialization/InitializationErrorThrower.cjs.map +1 -1
  26. package/dist/core/initialization/InitializationErrorThrower.js.map +1 -1
  27. package/dist/core/initialization/initialization.cjs +3 -3
  28. package/dist/core/initialization/initialization.cjs.map +1 -1
  29. package/dist/core/initialization/initialization.d.ts +1 -1
  30. package/dist/core/initialization/initialization.js +1 -1
  31. package/dist/core/initialization/initialization.js.map +1 -1
  32. package/dist/core/initialization/initializationErrorState.cjs +2 -2
  33. package/dist/core/initialization/initializationErrorState.cjs.map +1 -1
  34. package/dist/core/initialization/initializationErrorState.d.ts +1 -1
  35. package/dist/core/initialization/initializationErrorState.js +1 -1
  36. package/dist/core/initialization/initializationErrorState.js.map +1 -1
  37. package/dist/core/kernel/defaultAdapters.cjs +14 -13
  38. package/dist/core/kernel/defaultAdapters.cjs.map +1 -1
  39. package/dist/core/kernel/defaultAdapters.js +2 -1
  40. package/dist/core/kernel/defaultAdapters.js.map +1 -1
  41. package/dist/core/kernel/types.d.ts +1 -1
  42. package/dist/core/kernel/types.js.map +1 -1
  43. package/dist/core/router/RouterManager.cjs +9 -9
  44. package/dist/core/router/RouterManager.cjs.map +1 -1
  45. package/dist/core/router/RouterManager.js +1 -1
  46. package/dist/core/router/RouterManager.js.map +1 -1
  47. package/dist/core/router/adapter/AdapterManager.cjs +10 -10
  48. package/dist/core/router/adapter/AdapterManager.cjs.map +1 -1
  49. package/dist/core/router/adapter/AdapterManager.js +1 -1
  50. package/dist/core/router/adapter/AdapterManager.js.map +1 -1
  51. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +4 -4
  52. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
  53. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -1
  54. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
  55. package/dist/core/router/dynamic/DynamicRouteManager.cjs +8 -8
  56. package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +1 -1
  57. package/dist/core/router/dynamic/DynamicRouteManager.js +1 -1
  58. package/dist/core/router/dynamic/DynamicRouteManager.js.map +1 -1
  59. package/dist/core/router/errors/RouterError.cjs +4 -4
  60. package/dist/core/router/errors/RouterError.cjs.map +1 -1
  61. package/dist/core/router/errors/RouterError.d.ts +1 -1
  62. package/dist/core/router/errors/RouterError.js +1 -1
  63. package/dist/core/router/errors/RouterError.js.map +1 -1
  64. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +8 -8
  65. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +1 -1
  66. package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -1
  67. package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +1 -1
  68. package/dist/core/router/middleware/RouterMiddlewareManager.cjs +11 -11
  69. package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
  70. package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -1
  71. package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
  72. package/dist/core/router/middleware/auth.cjs +4 -4
  73. package/dist/core/router/middleware/auth.cjs.map +1 -1
  74. package/dist/core/router/middleware/auth.js +1 -1
  75. package/dist/core/router/middleware/auth.js.map +1 -1
  76. package/dist/core/router/monitoring/RouterMonitoring.cjs +2 -2
  77. package/dist/core/router/monitoring/RouterMonitoring.cjs.map +1 -1
  78. package/dist/core/router/monitoring/RouterMonitoring.js +2 -2
  79. package/dist/core/router/monitoring/RouterMonitoring.js.map +1 -1
  80. package/dist/core/router/navigation/RouterNavigation.cjs +7 -7
  81. package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
  82. package/dist/core/router/navigation/RouterNavigation.js +1 -1
  83. package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
  84. package/dist/core/router/performance/RouteCache.cjs +7 -7
  85. package/dist/core/router/performance/RouteCache.cjs.map +1 -1
  86. package/dist/core/router/performance/RouteCache.js +1 -1
  87. package/dist/core/router/performance/RouteCache.js.map +1 -1
  88. package/dist/core/router/performance/RoutePreloader.cjs +6 -6
  89. package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
  90. package/dist/core/router/performance/RoutePreloader.js +1 -1
  91. package/dist/core/router/performance/RoutePreloader.js.map +1 -1
  92. package/dist/core/router/plugin/RouterPluginManager.cjs +8 -8
  93. package/dist/core/router/plugin/RouterPluginManager.cjs.map +1 -1
  94. package/dist/core/router/plugin/RouterPluginManager.js +1 -1
  95. package/dist/core/router/plugin/RouterPluginManager.js.map +1 -1
  96. package/dist/core/router/utils/adapters/react-router/transform.cjs +6 -2
  97. package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
  98. package/dist/core/router/utils/adapters/react-router/transform.js +5 -1
  99. package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
  100. package/dist/core/router/utils/transform.cjs +13 -12
  101. package/dist/core/router/utils/transform.cjs.map +1 -1
  102. package/dist/core/router/utils/transform.js +2 -1
  103. package/dist/core/router/utils/transform.js.map +1 -1
  104. package/dist/core/router/validation/RouterConfigValidator.cjs +2 -2
  105. package/dist/core/router/validation/RouterConfigValidator.cjs.map +1 -1
  106. package/dist/core/router/validation/RouterConfigValidator.js +1 -1
  107. package/dist/core/router/validation/RouterConfigValidator.js.map +1 -1
  108. package/dist/core/router/version/RouteVersionManager.cjs +6 -6
  109. package/dist/core/router/version/RouteVersionManager.cjs.map +1 -1
  110. package/dist/core/router/version/RouteVersionManager.js +1 -1
  111. package/dist/core/router/version/RouteVersionManager.js.map +1 -1
  112. package/dist/core/splash/SplashScreen.cjs +4 -4
  113. package/dist/core/splash/SplashScreen.cjs.map +1 -1
  114. package/dist/core/splash/SplashScreen.js +1 -1
  115. package/dist/core/splash/SplashScreen.js.map +1 -1
  116. package/dist/core/startup/initializeServices.cjs +15 -15
  117. package/dist/core/startup/initializeServices.cjs.map +1 -1
  118. package/dist/core/startup/initializeServices.d.ts +2 -2
  119. package/dist/core/startup/initializeServices.js +3 -3
  120. package/dist/core/startup/initializeServices.js.map +1 -1
  121. package/dist/core/startup/performanceTracker.cjs.map +1 -1
  122. package/dist/core/startup/performanceTracker.d.ts +1 -1
  123. package/dist/core/startup/performanceTracker.js.map +1 -1
  124. package/dist/core/startup/renderApp.cjs +3 -3
  125. package/dist/core/startup/renderApp.cjs.map +1 -1
  126. package/dist/core/startup/renderApp.d.ts +1 -1
  127. package/dist/core/startup/renderApp.js +2 -2
  128. package/dist/core/startup/renderApp.js.map +1 -1
  129. package/dist/core/startup/startApp.cjs +24 -24
  130. package/dist/core/startup/startApp.cjs.map +1 -1
  131. package/dist/core/startup/startApp.js +5 -5
  132. package/dist/core/startup/startApp.js.map +1 -1
  133. package/dist/core/types.d.ts +3 -3
  134. package/dist/core/types.js.map +1 -1
  135. package/dist/index.cjs +15 -2
  136. package/dist/index.cjs.map +1 -1
  137. package/dist/index.d.ts +6 -4
  138. package/dist/index.js +5 -4
  139. package/dist/index.js.map +1 -1
  140. package/dist/index.umd.js +2150 -23125
  141. package/dist/index.umd.js.map +1 -1
  142. package/dist/kernel/constants.cjs +67 -0
  143. package/dist/kernel/constants.cjs.map +1 -0
  144. package/dist/kernel/constants.d.ts +5 -0
  145. package/dist/kernel/constants.js +43 -0
  146. package/dist/kernel/constants.js.map +1 -0
  147. package/dist/kernel/index.cjs +40 -0
  148. package/dist/kernel/index.cjs.map +1 -0
  149. package/dist/kernel/index.d.ts +3 -0
  150. package/dist/kernel/index.js +4 -0
  151. package/dist/kernel/index.js.map +1 -0
  152. package/dist/kernel/kernel.cjs +296 -0
  153. package/dist/kernel/kernel.cjs.map +1 -0
  154. package/dist/kernel/kernel.d.ts +40 -0
  155. package/dist/kernel/kernel.js +272 -0
  156. package/dist/kernel/kernel.js.map +1 -0
  157. package/dist/kernel/manager/cacheManager.cjs +46 -0
  158. package/dist/kernel/manager/cacheManager.cjs.map +1 -0
  159. package/dist/kernel/manager/cacheManager.d.ts +6 -0
  160. package/dist/kernel/manager/cacheManager.js +36 -0
  161. package/dist/kernel/manager/cacheManager.js.map +1 -0
  162. package/dist/kernel/manager/i18nManager.cjs +68 -0
  163. package/dist/kernel/manager/i18nManager.cjs.map +1 -0
  164. package/dist/kernel/manager/i18nManager.d.ts +8 -0
  165. package/dist/kernel/manager/i18nManager.js +58 -0
  166. package/dist/kernel/manager/i18nManager.js.map +1 -0
  167. package/dist/kernel/manager/index.cjs +30 -0
  168. package/dist/kernel/manager/index.cjs.map +1 -0
  169. package/dist/kernel/manager/index.d.ts +4 -0
  170. package/dist/kernel/manager/index.js +6 -0
  171. package/dist/kernel/manager/index.js.map +1 -0
  172. package/dist/kernel/manager/loggerManager.cjs +70 -0
  173. package/dist/kernel/manager/loggerManager.cjs.map +1 -0
  174. package/dist/kernel/manager/loggerManager.d.ts +14 -0
  175. package/dist/kernel/manager/loggerManager.js +60 -0
  176. package/dist/kernel/manager/loggerManager.js.map +1 -0
  177. package/dist/kernel/manager/persistence.cjs +93 -0
  178. package/dist/kernel/manager/persistence.cjs.map +1 -0
  179. package/dist/kernel/manager/persistence.d.ts +3 -0
  180. package/dist/kernel/manager/persistence.js +75 -0
  181. package/dist/kernel/manager/persistence.js.map +1 -0
  182. package/dist/kernel/manager/themeManager.cjs +85 -0
  183. package/dist/kernel/manager/themeManager.cjs.map +1 -0
  184. package/dist/kernel/manager/themeManager.d.ts +9 -0
  185. package/dist/kernel/manager/themeManager.js +75 -0
  186. package/dist/kernel/manager/themeManager.js.map +1 -0
  187. package/dist/kernel/types.cjs +6 -0
  188. package/dist/kernel/types.cjs.map +1 -0
  189. package/dist/kernel/types.d.ts +72 -0
  190. package/dist/kernel/types.js +3 -0
  191. package/dist/kernel/types.js.map +1 -0
  192. package/dist/library/storage/encryption.cjs +12 -13
  193. package/dist/library/storage/encryption.cjs.map +1 -1
  194. package/dist/library/storage/encryption.js +1 -2
  195. package/dist/library/storage/encryption.js.map +1 -1
  196. package/dist/request/adapter.d.ts +1 -0
  197. package/dist/request/core.d.ts +1 -0
  198. package/dist/request/index.d.ts +1 -42
  199. package/dist/request/plugin/csrfPlugin.d.ts +2 -2
  200. package/dist/request/plugin/queue.d.ts +2 -2
  201. package/dist/request/plugin.d.ts +1 -0
  202. package/dist/request/runtime.d.ts +1 -0
  203. package/dist/request/types.d.ts +1 -394
  204. package/dist/request/utils.d.ts +1 -0
  205. package/dist/state.umd.js +1 -1
  206. package/dist/utils/csrf.cjs +13 -152
  207. package/dist/utils/csrf.cjs.map +1 -1
  208. package/dist/utils/csrf.d.ts +1 -72
  209. package/dist/utils/csrf.js +1 -142
  210. package/dist/utils/csrf.js.map +1 -1
  211. package/dist/utils/errors/ErrorCodes.cjs +6 -76
  212. package/dist/utils/errors/ErrorCodes.cjs.map +1 -1
  213. package/dist/utils/errors/ErrorCodes.d.ts +1 -45
  214. package/dist/utils/errors/ErrorCodes.js +1 -84
  215. package/dist/utils/errors/ErrorCodes.js.map +1 -1
  216. package/dist/utils/errors.cjs +53 -326
  217. package/dist/utils/errors.cjs.map +1 -1
  218. package/dist/utils/errors.d.ts +19 -172
  219. package/dist/utils/errors.js +16 -352
  220. package/dist/utils/errors.js.map +1 -1
  221. package/dist/utils/logger.cjs +5 -374
  222. package/dist/utils/logger.cjs.map +1 -1
  223. package/dist/utils/logger.d.ts +2 -189
  224. package/dist/utils/logger.js +1 -379
  225. package/dist/utils/logger.js.map +1 -1
  226. package/dist/utils/logger.types.cjs +3 -12
  227. package/dist/utils/logger.types.cjs.map +1 -1
  228. package/dist/utils/logger.types.d.ts +2 -57
  229. package/dist/utils/logger.types.js +1 -10
  230. package/dist/utils/logger.types.js.map +1 -1
  231. package/dist/utils/monitoring.cjs +11 -302
  232. package/dist/utils/monitoring.cjs.map +1 -1
  233. package/dist/utils/monitoring.d.ts +1 -163
  234. package/dist/utils/monitoring.js +1 -294
  235. package/dist/utils/monitoring.js.map +1 -1
  236. package/dist/utils/performance.cjs +5 -352
  237. package/dist/utils/performance.cjs.map +1 -1
  238. package/dist/utils/performance.d.ts +2 -246
  239. package/dist/utils/performance.js +1 -354
  240. package/dist/utils/performance.js.map +1 -1
  241. package/dist/utils/resourceLoader.cjs +5 -303
  242. package/dist/utils/resourceLoader.cjs.map +1 -1
  243. package/dist/utils/resourceLoader.d.ts +2 -130
  244. package/dist/utils/resourceLoader.js +1 -305
  245. package/dist/utils/resourceLoader.js.map +1 -1
  246. package/dist/utils/runtimeSecurity.cjs +2 -140
  247. package/dist/utils/runtimeSecurity.cjs.map +1 -1
  248. package/dist/utils/runtimeSecurity.d.ts +2 -104
  249. package/dist/utils/runtimeSecurity.js +1 -141
  250. package/dist/utils/runtimeSecurity.js.map +1 -1
  251. package/dist/utils/security.cjs +3 -314
  252. package/dist/utils/security.cjs.map +1 -1
  253. package/dist/utils/security.d.ts +2 -80
  254. package/dist/utils/security.js +1 -311
  255. package/dist/utils/security.js.map +1 -1
  256. package/dist/utils/traceId.cjs +10 -111
  257. package/dist/utils/traceId.cjs.map +1 -1
  258. package/dist/utils/traceId.d.ts +1 -63
  259. package/dist/utils/traceId.js +1 -116
  260. package/dist/utils/traceId.js.map +1 -1
  261. package/dist/utils/validation.cjs +3 -173
  262. package/dist/utils/validation.cjs.map +1 -1
  263. package/dist/utils/validation.d.ts +2 -110
  264. package/dist/utils/validation.js +1 -175
  265. package/dist/utils/validation.js.map +1 -1
  266. package/package.json +15 -24
  267. package/dist/lazy/index.cjs +0 -104
  268. package/dist/lazy/index.cjs.map +0 -1
  269. package/dist/lazy/index.d.ts +0 -19
  270. package/dist/lazy/index.js +0 -24
  271. package/dist/lazy/index.js.map +0 -1
  272. package/dist/request/adapter/RequestAdapter.cjs +0 -78
  273. package/dist/request/adapter/RequestAdapter.cjs.map +0 -1
  274. package/dist/request/adapter/axiosAdapter.cjs +0 -164
  275. package/dist/request/adapter/axiosAdapter.cjs.map +0 -1
  276. package/dist/request/adapter/fetchAdapter.cjs +0 -134
  277. package/dist/request/adapter/fetchAdapter.cjs.map +0 -1
  278. package/dist/request/adapter/index.cjs +0 -80
  279. package/dist/request/adapter/index.cjs.map +0 -1
  280. package/dist/request/adapter/kyAdapter.cjs +0 -191
  281. package/dist/request/adapter/kyAdapter.cjs.map +0 -1
  282. package/dist/request/adapter/undiciAdapter.cjs +0 -213
  283. package/dist/request/adapter/undiciAdapter.cjs.map +0 -1
  284. package/dist/request/core/RequestClient.cjs +0 -558
  285. package/dist/request/core/RequestClient.cjs.map +0 -1
  286. package/dist/request/core/index.cjs +0 -15
  287. package/dist/request/core/index.cjs.map +0 -1
  288. package/dist/request/index.cjs +0 -149
  289. package/dist/request/index.cjs.map +0 -1
  290. package/dist/request/plugin/RequestPlugin.cjs +0 -218
  291. package/dist/request/plugin/RequestPlugin.cjs.map +0 -1
  292. package/dist/request/plugin/cache.cjs +0 -269
  293. package/dist/request/plugin/cache.cjs.map +0 -1
  294. package/dist/request/plugin/csrfPlugin.cjs +0 -40
  295. package/dist/request/plugin/csrfPlugin.cjs.map +0 -1
  296. package/dist/request/plugin/index.cjs +0 -53
  297. package/dist/request/plugin/index.cjs.map +0 -1
  298. package/dist/request/plugin/monitoring.cjs +0 -216
  299. package/dist/request/plugin/monitoring.cjs.map +0 -1
  300. package/dist/request/plugin/queue.cjs +0 -140
  301. package/dist/request/plugin/queue.cjs.map +0 -1
  302. package/dist/request/plugin/retry.cjs +0 -98
  303. package/dist/request/plugin/retry.cjs.map +0 -1
  304. package/dist/request/plugin/validation.cjs +0 -121
  305. package/dist/request/plugin/validation.cjs.map +0 -1
  306. package/dist/request/runtime/RequestContext.cjs +0 -77
  307. package/dist/request/runtime/RequestContext.cjs.map +0 -1
  308. package/dist/request/runtime/index.cjs +0 -32
  309. package/dist/request/runtime/index.cjs.map +0 -1
  310. package/dist/request/types.cjs +0 -112
  311. package/dist/request/types.cjs.map +0 -1
  312. package/dist/request/utils/RequestQueueManager.cjs +0 -168
  313. package/dist/request/utils/RequestQueueManager.cjs.map +0 -1
  314. package/dist/request/utils/dependencyCheck.cjs +0 -237
  315. package/dist/request/utils/dependencyCheck.cjs.map +0 -1
  316. package/dist/request/utils/index.cjs +0 -30
  317. package/dist/request/utils/index.cjs.map +0 -1
  318. package/dist/request.umd.js +0 -5392
  319. package/dist/request.umd.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/startup/performanceTracker.ts"],"sourcesContent":["/**\n * 性能追踪模块\n * 负责收集和上报启动性能指标\n */\n\nimport type { MonitoringService } from '../../utils/monitoring';\n\n/**\n * 启动性能指标单位常量\n */\nexport const STARTUP_METRIC_UNITS = {\n /**\n * 毫秒单位\n */\n ms: 'ms',\n /**\n * 无单位(分数)\n */\n none: '',\n} as const;\n\n/**\n * 启动性能指标\n */\nexport interface StartupPerformanceMetrics {\n /**\n * 服务初始化耗时\n * 单位:毫秒(ms)\n */\n serviceInitDuration?: number;\n\n /**\n * 初始化耗时\n * 单位:毫秒(ms)\n */\n initializationDuration?: number;\n\n /**\n * 首次渲染耗时\n * 单位:毫秒(ms)\n */\n firstRenderDuration?: number;\n\n /**\n * 总启动耗时\n * 单位:毫秒(ms)\n */\n totalStartupDuration?: number;\n\n /**\n * 首次内容绘制时间(FCP)\n * 单位:毫秒(ms)\n */\n fcp?: number;\n\n /**\n * 最大内容绘制时间(LCP)\n * 单位:毫秒(ms)\n */\n lcp?: number;\n\n /**\n * 首次输入延迟(FID)\n * 单位:毫秒(ms)\n */\n fid?: number;\n\n /**\n * 累积布局偏移(CLS)\n * 单位:无(分数)\n */\n cls?: number;\n}\n\n/**\n * 性能追踪器\n */\nexport class PerformanceTracker {\n private monitoring: MonitoringService;\n private metrics: StartupPerformanceMetrics = {};\n private startTime: number;\n\n constructor(monitoring: MonitoringService) {\n this.monitoring = monitoring;\n this.startTime = performance.now();\n }\n\n /**\n * 记录服务初始化耗时\n */\n recordServiceInit(duration: number): void {\n this.metrics.serviceInitDuration = duration;\n }\n\n /**\n * 记录初始化耗时\n */\n recordInitialization(duration: number): void {\n this.metrics.initializationDuration = duration;\n }\n\n /**\n * 记录首次渲染耗时\n */\n recordFirstRender(duration: number): void {\n this.metrics.firstRenderDuration = duration;\n }\n\n /**\n * 记录总启动耗时\n */\n recordTotalStartup(duration: number): void {\n this.metrics.totalStartupDuration = duration;\n }\n\n /**\n * 收集Web Vitals指标\n */\n collectWebVitals(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n // 收集FCP(首次内容绘制)\n if ('PerformanceObserver' in window) {\n try {\n const fcpObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n this.metrics.fcp = entry.startTime;\n this.report();\n }\n }\n });\n fcpObserver.observe({ entryTypes: ['paint'] });\n } catch (e) {\n // 忽略错误\n }\n }\n\n // 收集LCP(最大内容绘制)\n if ('PerformanceObserver' in window) {\n try {\n const lcpObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const lastEntry = entries[entries.length - 1];\n this.metrics.lcp = lastEntry.startTime;\n this.report();\n });\n lcpObserver.observe({ entryTypes: ['largest-contentful-paint'] });\n } catch (e) {\n // 忽略错误\n }\n }\n\n // 收集FID(首次输入延迟)\n if ('PerformanceObserver' in window) {\n try {\n const fidObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n // PerformanceEventTiming 类型检查\n if ('processingStart' in entry && 'startTime' in entry) {\n const eventEntry = entry as PerformanceEventTiming;\n this.metrics.fid = eventEntry.processingStart - eventEntry.startTime;\n this.report();\n }\n }\n });\n fidObserver.observe({ entryTypes: ['first-input'] });\n } catch (e) {\n // 忽略错误\n }\n }\n\n // 收集CLS(累积布局偏移)\n if ('PerformanceObserver' in window) {\n try {\n let clsValue = 0;\n const clsObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!(entry as any).hadRecentInput) {\n clsValue += (entry as any).value;\n }\n }\n this.metrics.cls = clsValue;\n this.report();\n });\n clsObserver.observe({ entryTypes: ['layout-shift'] });\n } catch (e) {\n // 忽略错误\n }\n }\n }\n\n /**\n * 上报性能指标\n */\n report(): void {\n if (this.monitoring.reportPerformance) {\n this.monitoring.reportPerformance(this.metrics);\n }\n }\n\n /**\n * 获取所有指标\n */\n getMetrics(): StartupPerformanceMetrics {\n return { ...this.metrics };\n }\n\n /**\n * 获取总启动耗时\n */\n getTotalDuration(): number {\n return performance.now() - this.startTime;\n }\n}\n"],"names":["STARTUP_METRIC_UNITS","ms","none","PerformanceTracker","recordServiceInit","duration","metrics","serviceInitDuration","recordInitialization","initializationDuration","recordFirstRender","firstRenderDuration","recordTotalStartup","totalStartupDuration","collectWebVitals","window","fcpObserver","PerformanceObserver","list","entry","getEntries","name","fcp","startTime","report","observe","entryTypes","e","lcpObserver","entries","lastEntry","length","lcp","fidObserver","eventEntry","fid","processingStart","clsValue","clsObserver","hadRecentInput","value","cls","monitoring","reportPerformance","getMetrics","getTotalDuration","performance","now"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/startup/performanceTracker.ts"],"sourcesContent":["/**\n * 性能追踪模块\n * 负责收集和上报启动性能指标\n */\n\nimport type { MonitoringService } from '@vlian/monitoring';\n\n/**\n * 启动性能指标单位常量\n */\nexport const STARTUP_METRIC_UNITS = {\n /**\n * 毫秒单位\n */\n ms: 'ms',\n /**\n * 无单位(分数)\n */\n none: '',\n} as const;\n\n/**\n * 启动性能指标\n */\nexport interface StartupPerformanceMetrics {\n /**\n * 服务初始化耗时\n * 单位:毫秒(ms)\n */\n serviceInitDuration?: number;\n\n /**\n * 初始化耗时\n * 单位:毫秒(ms)\n */\n initializationDuration?: number;\n\n /**\n * 首次渲染耗时\n * 单位:毫秒(ms)\n */\n firstRenderDuration?: number;\n\n /**\n * 总启动耗时\n * 单位:毫秒(ms)\n */\n totalStartupDuration?: number;\n\n /**\n * 首次内容绘制时间(FCP)\n * 单位:毫秒(ms)\n */\n fcp?: number;\n\n /**\n * 最大内容绘制时间(LCP)\n * 单位:毫秒(ms)\n */\n lcp?: number;\n\n /**\n * 首次输入延迟(FID)\n * 单位:毫秒(ms)\n */\n fid?: number;\n\n /**\n * 累积布局偏移(CLS)\n * 单位:无(分数)\n */\n cls?: number;\n}\n\n/**\n * 性能追踪器\n */\nexport class PerformanceTracker {\n private monitoring: MonitoringService;\n private metrics: StartupPerformanceMetrics = {};\n private startTime: number;\n\n constructor(monitoring: MonitoringService) {\n this.monitoring = monitoring;\n this.startTime = performance.now();\n }\n\n /**\n * 记录服务初始化耗时\n */\n recordServiceInit(duration: number): void {\n this.metrics.serviceInitDuration = duration;\n }\n\n /**\n * 记录初始化耗时\n */\n recordInitialization(duration: number): void {\n this.metrics.initializationDuration = duration;\n }\n\n /**\n * 记录首次渲染耗时\n */\n recordFirstRender(duration: number): void {\n this.metrics.firstRenderDuration = duration;\n }\n\n /**\n * 记录总启动耗时\n */\n recordTotalStartup(duration: number): void {\n this.metrics.totalStartupDuration = duration;\n }\n\n /**\n * 收集Web Vitals指标\n */\n collectWebVitals(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n // 收集FCP(首次内容绘制)\n if ('PerformanceObserver' in window) {\n try {\n const fcpObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n this.metrics.fcp = entry.startTime;\n this.report();\n }\n }\n });\n fcpObserver.observe({ entryTypes: ['paint'] });\n } catch (e) {\n // 忽略错误\n }\n }\n\n // 收集LCP(最大内容绘制)\n if ('PerformanceObserver' in window) {\n try {\n const lcpObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const lastEntry = entries[entries.length - 1];\n this.metrics.lcp = lastEntry.startTime;\n this.report();\n });\n lcpObserver.observe({ entryTypes: ['largest-contentful-paint'] });\n } catch (e) {\n // 忽略错误\n }\n }\n\n // 收集FID(首次输入延迟)\n if ('PerformanceObserver' in window) {\n try {\n const fidObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n // PerformanceEventTiming 类型检查\n if ('processingStart' in entry && 'startTime' in entry) {\n const eventEntry = entry as PerformanceEventTiming;\n this.metrics.fid = eventEntry.processingStart - eventEntry.startTime;\n this.report();\n }\n }\n });\n fidObserver.observe({ entryTypes: ['first-input'] });\n } catch (e) {\n // 忽略错误\n }\n }\n\n // 收集CLS(累积布局偏移)\n if ('PerformanceObserver' in window) {\n try {\n let clsValue = 0;\n const clsObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!(entry as any).hadRecentInput) {\n clsValue += (entry as any).value;\n }\n }\n this.metrics.cls = clsValue;\n this.report();\n });\n clsObserver.observe({ entryTypes: ['layout-shift'] });\n } catch (e) {\n // 忽略错误\n }\n }\n }\n\n /**\n * 上报性能指标\n */\n report(): void {\n if (this.monitoring.reportPerformance) {\n this.monitoring.reportPerformance(this.metrics);\n }\n }\n\n /**\n * 获取所有指标\n */\n getMetrics(): StartupPerformanceMetrics {\n return { ...this.metrics };\n }\n\n /**\n * 获取总启动耗时\n */\n getTotalDuration(): number {\n return performance.now() - this.startTime;\n }\n}\n"],"names":["STARTUP_METRIC_UNITS","ms","none","PerformanceTracker","recordServiceInit","duration","metrics","serviceInitDuration","recordInitialization","initializationDuration","recordFirstRender","firstRenderDuration","recordTotalStartup","totalStartupDuration","collectWebVitals","window","fcpObserver","PerformanceObserver","list","entry","getEntries","name","fcp","startTime","report","observe","entryTypes","e","lcpObserver","entries","lastEntry","length","lcp","fidObserver","eventEntry","fid","processingStart","clsValue","clsObserver","hadRecentInput","value","cls","monitoring","reportPerformance","getMetrics","getTotalDuration","performance","now"],"mappings":"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"}
@@ -18,7 +18,7 @@ const _app = require("../app");
18
18
  const _error = require("../error");
19
19
  const _initialization = require("../initialization");
20
20
  const _splash = require("../splash");
21
- const _security = require("../../utils/security");
21
+ const _utils = require("@vlian/utils");
22
22
  const _RouterManager = require("../router/RouterManager");
23
23
  const _reactrouterdom = require("react-router-dom");
24
24
  function _define_property(obj, key, value) {
@@ -188,7 +188,7 @@ let AppRenderer = class AppRenderer {
188
188
  Promise.resolve().then(()=>{
189
189
  try {
190
190
  const configStr = JSON.stringify(options);
191
- const validation = _security.SecurityUtils.validateInput(configStr);
191
+ const validation = _utils.SecurityUtils.validateInput(configStr);
192
192
  if (!validation.safe) {
193
193
  services.monitoring.captureError(new Error('配置项包含不安全内容'), {
194
194
  reason: validation.reason
@@ -201,7 +201,7 @@ let AppRenderer = class AppRenderer {
201
201
  }
202
202
  // 初始化 CSRF 防护(如果启用,异步执行,不阻塞渲染)
203
203
  if (securityConfig.enableXSSProtection && securityConfig.csrf?.enabled !== false) {
204
- Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../utils/csrf"))).then(({ initCSRFManager })=>{
204
+ Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("@vlian/csrf"))).then(({ initCSRFManager })=>{
205
205
  initCSRFManager({
206
206
  headerName: securityConfig.csrf?.headerName,
207
207
  cookieName: securityConfig.csrf?.cookieName,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/startup/renderApp.tsx"],"sourcesContent":["/**\n * 应用渲染模块\n * 负责渲染React应用\n */\n\nimport { createRoot } from 'react-dom/client';\nimport type { Root } from 'react-dom/client';\nimport { StrictMode, useMemo, useCallback, memo } from 'react';\nimport type { Container, RootOptions } from 'react-dom/client';\nimport { BasicLayout, DefaultApp, AppContextProvider } from '../app';\nimport type { LangType } from '../../library/locale/types';\nimport { ErrorBoundary } from '../error';\nimport { InitializationErrorThrower } from '../initialization';\nimport type { StartOptions } from '../types';\nimport type { InitializationContext } from '../initialization';\nimport type { MonitoringService } from '../../utils/monitoring';\nimport type { StateManager } from '../../state';\nimport { SplashScreen } from '../splash';\nimport { SecurityUtils } from '../../utils/security';\nimport { getRouterManager } from '../router/RouterManager';\nimport { RouterProvider } from \"react-router-dom\";\n\n/**\n * 安全配置类型\n */\ninterface SecurityConfig {\n enableXSSProtection: boolean;\n validateConfig: boolean;\n sanitizeUserInput: boolean;\n csrf?: StartOptions['security'] extends infer S\n ? S extends { csrf?: infer C }\n ? C\n : never\n : never;\n}\n\n/**\n * 优化的应用内容组件\n * 使用 useMemo 缓存计算结果,提升渲染性能\n */\ninterface OptimizedAppContentProps {\n options: StartOptions;\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n };\n context?: InitializationContext;\n securityConfig: SecurityConfig;\n}\n\nconst OptimizedAppContent = memo<OptimizedAppContentProps>(({\n options,\n services,\n context,\n // securityConfig 用于未来扩展,当前暂不使用\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n securityConfig: _securityConfig,\n}) => {\n // 优化:使用 useMemo 缓存初始语言计算\n const initialLocale = useMemo<LangType>(() => {\n return options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n }, [options.locale]);\n\n // 优化:使用 useMemo 缓存路由判断结果\n const shouldUseRouter = useMemo(() => {\n const routerEnabled = options.router\n ? options.router.enabled !== false && options.router.enabled !== 'disabled'\n : false;\n\n if (!routerEnabled) {\n return false;\n }\n\n const routerManager = getRouterManager();\n const router = routerManager.getRouter();\n return router !== null;\n }, [options.router]);\n\n // 优化:使用 useMemo 缓存路由实例\n const router = useMemo(() => {\n if (!shouldUseRouter) {\n return null;\n }\n const routerManager = getRouterManager();\n return routerManager.getRouter();\n }, [shouldUseRouter]);\n\n // 优化:使用 useCallback 缓存错误处理函数\n const handleError = useCallback((error: unknown) => {\n services.monitoring.captureError(error);\n }, [services.monitoring]);\n\n // 优化:使用 useMemo 缓存应用内容\n const appContent = useMemo(() => {\n if (shouldUseRouter && router) {\n return <RouterProvider router={router} />;\n }\n return options.app || <DefaultApp />;\n }, [shouldUseRouter, router, options.app]);\n\n return (\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={handleError}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.uiProvider || options.antd}\n initialInitializationContext={context}\n stateManager={services.stateManager}\n antdApp={options.uiApp || options.antdApp}\n >\n <BasicLayout globalProvider={options.globalProvider}>\n {appContent}\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n );\n});\n\nOptimizedAppContent.displayName = 'OptimizedAppContent';\n\n/**\n * 应用渲染器\n */\nexport class AppRenderer {\n private root: Root | null = null;\n private container: Container | null = null;\n\n /**\n * 初始化渲染器\n *\n * @param container - React应用的挂载容器\n * @param rootOptions - React根节点配置选项\n */\n initialize(container: Container, rootOptions?: RootOptions): void {\n this.container = container;\n if (!this.root) {\n this.root = createRoot(container, rootOptions);\n }\n }\n\n /**\n * 渲染应用\n *\n * 优化:\n * 1. 默认启用安全防护(XSS防护)\n * 2. 优化组件渲染性能,使用 useMemo 缓存计算结果\n * 3. 将安全配置计算提取到初始化阶段\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param context - 初始化上下文(可选)\n */\n async renderApp(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n context?: InitializationContext\n ): Promise<void> {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 优化:安全配置在初始化阶段计算(在 startApp 中预计算)\n // 这里只使用预计算的值,避免在渲染时重复计算\n const securityConfig: SecurityConfig = {\n enableXSSProtection: options.security?.enableXSSProtection ?? true,\n validateConfig: options.security?.validateConfig ?? true,\n sanitizeUserInput: options.security?.sanitizeUserInput ?? true,\n csrf: options.security?.csrf,\n };\n\n // 优化:安全验证在初始化阶段完成,这里只进行必要的运行时检查\n // 如果启用了安全模式(默认启用),对配置进行验证\n if (securityConfig.enableXSSProtection && securityConfig.validateConfig) {\n // 异步验证配置,不阻塞渲染\n Promise.resolve().then(() => {\n try {\n const configStr = JSON.stringify(options);\n const validation = SecurityUtils.validateInput(configStr);\n if (!validation.safe) {\n services.monitoring.captureError(\n new Error('配置项包含不安全内容'),\n { reason: validation.reason }\n );\n }\n } catch (error) {\n // 忽略序列化错误(某些配置项可能包含不可序列化的内容)\n }\n });\n }\n\n // 初始化 CSRF 防护(如果启用,异步执行,不阻塞渲染)\n if (securityConfig.enableXSSProtection && securityConfig.csrf?.enabled !== false) {\n import('../../utils/csrf').then(({ initCSRFManager }) => {\n initCSRFManager({\n headerName: securityConfig.csrf?.headerName,\n cookieName: securityConfig.csrf?.cookieName,\n getToken: securityConfig.csrf?.getToken,\n validateToken: securityConfig.csrf?.validateToken,\n });\n }).catch((error) => {\n // CSRF 初始化失败不影响应用启动,但记录警告\n if (process.env.NODE_ENV === 'development') {\n console.warn('CSRF 防护初始化失败:', error);\n }\n });\n }\n\n // 使用优化的应用内容组件,内部使用 useMemo 缓存计算结果\n this.root.render(\n <StrictMode>\n <OptimizedAppContent\n options={options}\n services={services}\n context={context}\n securityConfig={securityConfig}\n />\n </StrictMode>\n );\n }\n\n /**\n * 渲染启动页\n *\n * 注意:启动页不使用 RouterWrapper,因为启动页应该在路由系统之前渲染\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param onComplete - 启动页完成回调\n */\n renderSplashScreen(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n onComplete: (context: InitializationContext) => void\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 获取初始语言(从 locale 配置中推断,或使用默认值)\n const initialLocale: LangType = options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(error) => {\n services.monitoring.captureError(error);\n }}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.uiProvider || options.antd}\n stateManager={services.stateManager}\n antdApp={options.uiApp || options.antdApp}\n >\n {/*\n 启动页不使用 RouterWrapper,因为:\n 1. 启动页应该在路由系统初始化之前渲染\n 2. 启动页完成后才会渲染主应用,此时路由系统已经初始化完成\n */}\n <BasicLayout globalProvider={options.globalProvider}>\n <SplashScreen options={options} onComplete={onComplete} />\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 渲染错误页面\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param error - 错误信息\n */\n renderError(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n }\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(err) => {\n services.monitoring.captureError(err);\n if (options.errorMonitor?.onError) {\n options.errorMonitor.onError(err);\n }\n }}\n >\n <InitializationErrorThrower />\n <div>框架启动失败</div>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 销毁渲染器\n */\n destroy(): void {\n if (this.root) {\n this.root.unmount();\n this.root = null;\n }\n this.container = null;\n }\n\n /**\n * 获取容器\n */\n getContainer(): Container | null {\n return this.container;\n }\n}\n"],"names":["AppRenderer","OptimizedAppContent","memo","options","services","context","securityConfig","_securityConfig","initialLocale","useMemo","locale","Object","keys","shouldUseRouter","routerEnabled","router","enabled","routerManager","getRouterManager","getRouter","handleError","useCallback","error","monitoring","captureError","appContent","RouterProvider","app","DefaultApp","ErrorBoundary","fallback","errorFallback","onError","InitializationErrorThrower","AppContextProvider","initialTheme","theme","initialAntdConfig","uiProvider","antd","initialInitializationContext","stateManager","antdApp","uiApp","BasicLayout","globalProvider","displayName","initialize","container","rootOptions","root","createRoot","renderApp","Error","enableXSSProtection","security","validateConfig","sanitizeUserInput","csrf","Promise","resolve","then","configStr","JSON","stringify","validation","SecurityUtils","validateInput","safe","reason","initCSRFManager","headerName","cookieName","getToken","validateToken","catch","process","env","NODE_ENV","console","warn","render","StrictMode","renderSplashScreen","onComplete","SplashScreen","renderError","err","errorMonitor","div","destroy","unmount","getContainer"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/startup/renderApp.tsx"],"sourcesContent":["/**\n * 应用渲染模块\n * 负责渲染React应用\n */\n\nimport { createRoot } from 'react-dom/client';\nimport type { Root } from 'react-dom/client';\nimport { StrictMode, useMemo, useCallback, memo } from 'react';\nimport type { Container, RootOptions } from 'react-dom/client';\nimport { BasicLayout, DefaultApp, AppContextProvider } from '../app';\nimport type { LangType } from '../../library/locale/types';\nimport { ErrorBoundary } from '../error';\nimport { InitializationErrorThrower } from '../initialization';\nimport type { StartOptions } from '../types';\nimport type { InitializationContext } from '../initialization';\nimport type { MonitoringService } from '@vlian/monitoring';\nimport type { StateManager } from '../../state';\nimport { SplashScreen } from '../splash';\nimport { SecurityUtils } from '@vlian/utils';\nimport { getRouterManager } from '../router/RouterManager';\nimport { RouterProvider } from \"react-router-dom\";\n\n/**\n * 安全配置类型\n */\ninterface SecurityConfig {\n enableXSSProtection: boolean;\n validateConfig: boolean;\n sanitizeUserInput: boolean;\n csrf?: StartOptions['security'] extends infer S\n ? S extends { csrf?: infer C }\n ? C\n : never\n : never;\n}\n\n/**\n * 优化的应用内容组件\n * 使用 useMemo 缓存计算结果,提升渲染性能\n */\ninterface OptimizedAppContentProps {\n options: StartOptions;\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n };\n context?: InitializationContext;\n securityConfig: SecurityConfig;\n}\n\nconst OptimizedAppContent = memo<OptimizedAppContentProps>(({\n options,\n services,\n context,\n // securityConfig 用于未来扩展,当前暂不使用\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n securityConfig: _securityConfig,\n}) => {\n // 优化:使用 useMemo 缓存初始语言计算\n const initialLocale = useMemo<LangType>(() => {\n return options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n }, [options.locale]);\n\n // 优化:使用 useMemo 缓存路由判断结果\n const shouldUseRouter = useMemo(() => {\n const routerEnabled = options.router\n ? options.router.enabled !== false && options.router.enabled !== 'disabled'\n : false;\n\n if (!routerEnabled) {\n return false;\n }\n\n const routerManager = getRouterManager();\n const router = routerManager.getRouter();\n return router !== null;\n }, [options.router]);\n\n // 优化:使用 useMemo 缓存路由实例\n const router = useMemo(() => {\n if (!shouldUseRouter) {\n return null;\n }\n const routerManager = getRouterManager();\n return routerManager.getRouter();\n }, [shouldUseRouter]);\n\n // 优化:使用 useCallback 缓存错误处理函数\n const handleError = useCallback((error: unknown) => {\n services.monitoring.captureError(error);\n }, [services.monitoring]);\n\n // 优化:使用 useMemo 缓存应用内容\n const appContent = useMemo(() => {\n if (shouldUseRouter && router) {\n return <RouterProvider router={router} />;\n }\n return options.app || <DefaultApp />;\n }, [shouldUseRouter, router, options.app]);\n\n return (\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={handleError}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.uiProvider || options.antd}\n initialInitializationContext={context}\n stateManager={services.stateManager}\n antdApp={options.uiApp || options.antdApp}\n >\n <BasicLayout globalProvider={options.globalProvider}>\n {appContent}\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n );\n});\n\nOptimizedAppContent.displayName = 'OptimizedAppContent';\n\n/**\n * 应用渲染器\n */\nexport class AppRenderer {\n private root: Root | null = null;\n private container: Container | null = null;\n\n /**\n * 初始化渲染器\n *\n * @param container - React应用的挂载容器\n * @param rootOptions - React根节点配置选项\n */\n initialize(container: Container, rootOptions?: RootOptions): void {\n this.container = container;\n if (!this.root) {\n this.root = createRoot(container, rootOptions);\n }\n }\n\n /**\n * 渲染应用\n *\n * 优化:\n * 1. 默认启用安全防护(XSS防护)\n * 2. 优化组件渲染性能,使用 useMemo 缓存计算结果\n * 3. 将安全配置计算提取到初始化阶段\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param context - 初始化上下文(可选)\n */\n async renderApp(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n context?: InitializationContext\n ): Promise<void> {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 优化:安全配置在初始化阶段计算(在 startApp 中预计算)\n // 这里只使用预计算的值,避免在渲染时重复计算\n const securityConfig: SecurityConfig = {\n enableXSSProtection: options.security?.enableXSSProtection ?? true,\n validateConfig: options.security?.validateConfig ?? true,\n sanitizeUserInput: options.security?.sanitizeUserInput ?? true,\n csrf: options.security?.csrf,\n };\n\n // 优化:安全验证在初始化阶段完成,这里只进行必要的运行时检查\n // 如果启用了安全模式(默认启用),对配置进行验证\n if (securityConfig.enableXSSProtection && securityConfig.validateConfig) {\n // 异步验证配置,不阻塞渲染\n Promise.resolve().then(() => {\n try {\n const configStr = JSON.stringify(options);\n const validation = SecurityUtils.validateInput(configStr);\n if (!validation.safe) {\n services.monitoring.captureError(\n new Error('配置项包含不安全内容'),\n { reason: validation.reason }\n );\n }\n } catch (error) {\n // 忽略序列化错误(某些配置项可能包含不可序列化的内容)\n }\n });\n }\n\n // 初始化 CSRF 防护(如果启用,异步执行,不阻塞渲染)\n if (securityConfig.enableXSSProtection && securityConfig.csrf?.enabled !== false) {\n import('@vlian/csrf').then(({ initCSRFManager }) => {\n initCSRFManager({\n headerName: securityConfig.csrf?.headerName,\n cookieName: securityConfig.csrf?.cookieName,\n getToken: securityConfig.csrf?.getToken,\n validateToken: securityConfig.csrf?.validateToken,\n });\n }).catch((error) => {\n // CSRF 初始化失败不影响应用启动,但记录警告\n if (process.env.NODE_ENV === 'development') {\n console.warn('CSRF 防护初始化失败:', error);\n }\n });\n }\n\n // 使用优化的应用内容组件,内部使用 useMemo 缓存计算结果\n this.root.render(\n <StrictMode>\n <OptimizedAppContent\n options={options}\n services={services}\n context={context}\n securityConfig={securityConfig}\n />\n </StrictMode>\n );\n }\n\n /**\n * 渲染启动页\n *\n * 注意:启动页不使用 RouterWrapper,因为启动页应该在路由系统之前渲染\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param onComplete - 启动页完成回调\n */\n renderSplashScreen(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n onComplete: (context: InitializationContext) => void\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 获取初始语言(从 locale 配置中推断,或使用默认值)\n const initialLocale: LangType = options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(error) => {\n services.monitoring.captureError(error);\n }}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.uiProvider || options.antd}\n stateManager={services.stateManager}\n antdApp={options.uiApp || options.antdApp}\n >\n {/*\n 启动页不使用 RouterWrapper,因为:\n 1. 启动页应该在路由系统初始化之前渲染\n 2. 启动页完成后才会渲染主应用,此时路由系统已经初始化完成\n */}\n <BasicLayout globalProvider={options.globalProvider}>\n <SplashScreen options={options} onComplete={onComplete} />\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 渲染错误页面\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param error - 错误信息\n */\n renderError(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n }\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(err) => {\n services.monitoring.captureError(err);\n if (options.errorMonitor?.onError) {\n options.errorMonitor.onError(err);\n }\n }}\n >\n <InitializationErrorThrower />\n <div>框架启动失败</div>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 销毁渲染器\n */\n destroy(): void {\n if (this.root) {\n this.root.unmount();\n this.root = null;\n }\n this.container = null;\n }\n\n /**\n * 获取容器\n */\n getContainer(): Container | null {\n return this.container;\n }\n}\n"],"names":["AppRenderer","OptimizedAppContent","memo","options","services","context","securityConfig","_securityConfig","initialLocale","useMemo","locale","Object","keys","shouldUseRouter","routerEnabled","router","enabled","routerManager","getRouterManager","getRouter","handleError","useCallback","error","monitoring","captureError","appContent","RouterProvider","app","DefaultApp","ErrorBoundary","fallback","errorFallback","onError","InitializationErrorThrower","AppContextProvider","initialTheme","theme","initialAntdConfig","uiProvider","antd","initialInitializationContext","stateManager","antdApp","uiApp","BasicLayout","globalProvider","displayName","initialize","container","rootOptions","root","createRoot","renderApp","Error","enableXSSProtection","security","validateConfig","sanitizeUserInput","csrf","Promise","resolve","then","configStr","JSON","stringify","validation","SecurityUtils","validateInput","safe","reason","initCSRFManager","headerName","cookieName","getToken","validateToken","catch","process","env","NODE_ENV","console","warn","render","StrictMode","renderSplashScreen","onComplete","SplashScreen","renderError","err","errorMonitor","div","destroy","unmount","getContainer"],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  import type { Container, RootOptions } from 'react-dom/client';
6
6
  import type { StartOptions } from '../types';
7
7
  import type { InitializationContext } from '../initialization';
8
- import type { MonitoringService } from '../../utils/monitoring';
8
+ import type { MonitoringService } from '@vlian/monitoring';
9
9
  import type { StateManager } from '../../state';
10
10
  /**
11
11
  * 应用渲染器
@@ -21,7 +21,7 @@ import { BasicLayout, DefaultApp, AppContextProvider } from "../app";
21
21
  import { ErrorBoundary } from "../error";
22
22
  import { InitializationErrorThrower } from "../initialization";
23
23
  import { SplashScreen } from "../splash";
24
- import { SecurityUtils } from "../../utils/security";
24
+ import { SecurityUtils } from "@vlian/utils";
25
25
  import { getRouterManager } from "../router/RouterManager";
26
26
  import { RouterProvider } from "react-router-dom";
27
27
  const OptimizedAppContent = /*#__PURE__*/ memo(({ options, services, context, // securityConfig 用于未来扩展,当前暂不使用
@@ -152,7 +152,7 @@ OptimizedAppContent.displayName = 'OptimizedAppContent';
152
152
  }
153
153
  // 初始化 CSRF 防护(如果启用,异步执行,不阻塞渲染)
154
154
  if (securityConfig.enableXSSProtection && securityConfig.csrf?.enabled !== false) {
155
- import("../../utils/csrf").then(({ initCSRFManager })=>{
155
+ import("@vlian/csrf").then(({ initCSRFManager })=>{
156
156
  initCSRFManager({
157
157
  headerName: securityConfig.csrf?.headerName,
158
158
  cookieName: securityConfig.csrf?.cookieName,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/startup/renderApp.tsx"],"sourcesContent":["/**\n * 应用渲染模块\n * 负责渲染React应用\n */\n\nimport { createRoot } from 'react-dom/client';\nimport type { Root } from 'react-dom/client';\nimport { StrictMode, useMemo, useCallback, memo } from 'react';\nimport type { Container, RootOptions } from 'react-dom/client';\nimport { BasicLayout, DefaultApp, AppContextProvider } from '../app';\nimport type { LangType } from '../../library/locale/types';\nimport { ErrorBoundary } from '../error';\nimport { InitializationErrorThrower } from '../initialization';\nimport type { StartOptions } from '../types';\nimport type { InitializationContext } from '../initialization';\nimport type { MonitoringService } from '../../utils/monitoring';\nimport type { StateManager } from '../../state';\nimport { SplashScreen } from '../splash';\nimport { SecurityUtils } from '../../utils/security';\nimport { getRouterManager } from '../router/RouterManager';\nimport { RouterProvider } from \"react-router-dom\";\n\n/**\n * 安全配置类型\n */\ninterface SecurityConfig {\n enableXSSProtection: boolean;\n validateConfig: boolean;\n sanitizeUserInput: boolean;\n csrf?: StartOptions['security'] extends infer S\n ? S extends { csrf?: infer C }\n ? C\n : never\n : never;\n}\n\n/**\n * 优化的应用内容组件\n * 使用 useMemo 缓存计算结果,提升渲染性能\n */\ninterface OptimizedAppContentProps {\n options: StartOptions;\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n };\n context?: InitializationContext;\n securityConfig: SecurityConfig;\n}\n\nconst OptimizedAppContent = memo<OptimizedAppContentProps>(({\n options,\n services,\n context,\n // securityConfig 用于未来扩展,当前暂不使用\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n securityConfig: _securityConfig,\n}) => {\n // 优化:使用 useMemo 缓存初始语言计算\n const initialLocale = useMemo<LangType>(() => {\n return options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n }, [options.locale]);\n\n // 优化:使用 useMemo 缓存路由判断结果\n const shouldUseRouter = useMemo(() => {\n const routerEnabled = options.router\n ? options.router.enabled !== false && options.router.enabled !== 'disabled'\n : false;\n\n if (!routerEnabled) {\n return false;\n }\n\n const routerManager = getRouterManager();\n const router = routerManager.getRouter();\n return router !== null;\n }, [options.router]);\n\n // 优化:使用 useMemo 缓存路由实例\n const router = useMemo(() => {\n if (!shouldUseRouter) {\n return null;\n }\n const routerManager = getRouterManager();\n return routerManager.getRouter();\n }, [shouldUseRouter]);\n\n // 优化:使用 useCallback 缓存错误处理函数\n const handleError = useCallback((error: unknown) => {\n services.monitoring.captureError(error);\n }, [services.monitoring]);\n\n // 优化:使用 useMemo 缓存应用内容\n const appContent = useMemo(() => {\n if (shouldUseRouter && router) {\n return <RouterProvider router={router} />;\n }\n return options.app || <DefaultApp />;\n }, [shouldUseRouter, router, options.app]);\n\n return (\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={handleError}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.uiProvider || options.antd}\n initialInitializationContext={context}\n stateManager={services.stateManager}\n antdApp={options.uiApp || options.antdApp}\n >\n <BasicLayout globalProvider={options.globalProvider}>\n {appContent}\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n );\n});\n\nOptimizedAppContent.displayName = 'OptimizedAppContent';\n\n/**\n * 应用渲染器\n */\nexport class AppRenderer {\n private root: Root | null = null;\n private container: Container | null = null;\n\n /**\n * 初始化渲染器\n *\n * @param container - React应用的挂载容器\n * @param rootOptions - React根节点配置选项\n */\n initialize(container: Container, rootOptions?: RootOptions): void {\n this.container = container;\n if (!this.root) {\n this.root = createRoot(container, rootOptions);\n }\n }\n\n /**\n * 渲染应用\n *\n * 优化:\n * 1. 默认启用安全防护(XSS防护)\n * 2. 优化组件渲染性能,使用 useMemo 缓存计算结果\n * 3. 将安全配置计算提取到初始化阶段\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param context - 初始化上下文(可选)\n */\n async renderApp(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n context?: InitializationContext\n ): Promise<void> {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 优化:安全配置在初始化阶段计算(在 startApp 中预计算)\n // 这里只使用预计算的值,避免在渲染时重复计算\n const securityConfig: SecurityConfig = {\n enableXSSProtection: options.security?.enableXSSProtection ?? true,\n validateConfig: options.security?.validateConfig ?? true,\n sanitizeUserInput: options.security?.sanitizeUserInput ?? true,\n csrf: options.security?.csrf,\n };\n\n // 优化:安全验证在初始化阶段完成,这里只进行必要的运行时检查\n // 如果启用了安全模式(默认启用),对配置进行验证\n if (securityConfig.enableXSSProtection && securityConfig.validateConfig) {\n // 异步验证配置,不阻塞渲染\n Promise.resolve().then(() => {\n try {\n const configStr = JSON.stringify(options);\n const validation = SecurityUtils.validateInput(configStr);\n if (!validation.safe) {\n services.monitoring.captureError(\n new Error('配置项包含不安全内容'),\n { reason: validation.reason }\n );\n }\n } catch (error) {\n // 忽略序列化错误(某些配置项可能包含不可序列化的内容)\n }\n });\n }\n\n // 初始化 CSRF 防护(如果启用,异步执行,不阻塞渲染)\n if (securityConfig.enableXSSProtection && securityConfig.csrf?.enabled !== false) {\n import('../../utils/csrf').then(({ initCSRFManager }) => {\n initCSRFManager({\n headerName: securityConfig.csrf?.headerName,\n cookieName: securityConfig.csrf?.cookieName,\n getToken: securityConfig.csrf?.getToken,\n validateToken: securityConfig.csrf?.validateToken,\n });\n }).catch((error) => {\n // CSRF 初始化失败不影响应用启动,但记录警告\n if (process.env.NODE_ENV === 'development') {\n console.warn('CSRF 防护初始化失败:', error);\n }\n });\n }\n\n // 使用优化的应用内容组件,内部使用 useMemo 缓存计算结果\n this.root.render(\n <StrictMode>\n <OptimizedAppContent\n options={options}\n services={services}\n context={context}\n securityConfig={securityConfig}\n />\n </StrictMode>\n );\n }\n\n /**\n * 渲染启动页\n *\n * 注意:启动页不使用 RouterWrapper,因为启动页应该在路由系统之前渲染\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param onComplete - 启动页完成回调\n */\n renderSplashScreen(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n onComplete: (context: InitializationContext) => void\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 获取初始语言(从 locale 配置中推断,或使用默认值)\n const initialLocale: LangType = options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(error) => {\n services.monitoring.captureError(error);\n }}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.uiProvider || options.antd}\n stateManager={services.stateManager}\n antdApp={options.uiApp || options.antdApp}\n >\n {/*\n 启动页不使用 RouterWrapper,因为:\n 1. 启动页应该在路由系统初始化之前渲染\n 2. 启动页完成后才会渲染主应用,此时路由系统已经初始化完成\n */}\n <BasicLayout globalProvider={options.globalProvider}>\n <SplashScreen options={options} onComplete={onComplete} />\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 渲染错误页面\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param error - 错误信息\n */\n renderError(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n }\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(err) => {\n services.monitoring.captureError(err);\n if (options.errorMonitor?.onError) {\n options.errorMonitor.onError(err);\n }\n }}\n >\n <InitializationErrorThrower />\n <div>框架启动失败</div>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 销毁渲染器\n */\n destroy(): void {\n if (this.root) {\n this.root.unmount();\n this.root = null;\n }\n this.container = null;\n }\n\n /**\n * 获取容器\n */\n getContainer(): Container | null {\n return this.container;\n }\n}\n"],"names":["createRoot","StrictMode","useMemo","useCallback","memo","BasicLayout","DefaultApp","AppContextProvider","ErrorBoundary","InitializationErrorThrower","SplashScreen","SecurityUtils","getRouterManager","RouterProvider","OptimizedAppContent","options","services","context","securityConfig","_securityConfig","initialLocale","locale","Object","keys","shouldUseRouter","routerEnabled","router","enabled","routerManager","getRouter","handleError","error","monitoring","captureError","appContent","app","fallback","errorFallback","onError","initialTheme","theme","initialAntdConfig","uiProvider","antd","initialInitializationContext","stateManager","antdApp","uiApp","globalProvider","displayName","AppRenderer","initialize","container","rootOptions","root","renderApp","Error","enableXSSProtection","security","validateConfig","sanitizeUserInput","csrf","Promise","resolve","then","configStr","JSON","stringify","validation","validateInput","safe","reason","initCSRFManager","headerName","cookieName","getToken","validateToken","catch","process","env","NODE_ENV","console","warn","render","renderSplashScreen","onComplete","renderError","err","errorMonitor","div","destroy","unmount","getContainer"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/startup/renderApp.tsx"],"sourcesContent":["/**\n * 应用渲染模块\n * 负责渲染React应用\n */\n\nimport { createRoot } from 'react-dom/client';\nimport type { Root } from 'react-dom/client';\nimport { StrictMode, useMemo, useCallback, memo } from 'react';\nimport type { Container, RootOptions } from 'react-dom/client';\nimport { BasicLayout, DefaultApp, AppContextProvider } from '../app';\nimport type { LangType } from '../../library/locale/types';\nimport { ErrorBoundary } from '../error';\nimport { InitializationErrorThrower } from '../initialization';\nimport type { StartOptions } from '../types';\nimport type { InitializationContext } from '../initialization';\nimport type { MonitoringService } from '@vlian/monitoring';\nimport type { StateManager } from '../../state';\nimport { SplashScreen } from '../splash';\nimport { SecurityUtils } from '@vlian/utils';\nimport { getRouterManager } from '../router/RouterManager';\nimport { RouterProvider } from \"react-router-dom\";\n\n/**\n * 安全配置类型\n */\ninterface SecurityConfig {\n enableXSSProtection: boolean;\n validateConfig: boolean;\n sanitizeUserInput: boolean;\n csrf?: StartOptions['security'] extends infer S\n ? S extends { csrf?: infer C }\n ? C\n : never\n : never;\n}\n\n/**\n * 优化的应用内容组件\n * 使用 useMemo 缓存计算结果,提升渲染性能\n */\ninterface OptimizedAppContentProps {\n options: StartOptions;\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n };\n context?: InitializationContext;\n securityConfig: SecurityConfig;\n}\n\nconst OptimizedAppContent = memo<OptimizedAppContentProps>(({\n options,\n services,\n context,\n // securityConfig 用于未来扩展,当前暂不使用\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n securityConfig: _securityConfig,\n}) => {\n // 优化:使用 useMemo 缓存初始语言计算\n const initialLocale = useMemo<LangType>(() => {\n return options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n }, [options.locale]);\n\n // 优化:使用 useMemo 缓存路由判断结果\n const shouldUseRouter = useMemo(() => {\n const routerEnabled = options.router\n ? options.router.enabled !== false && options.router.enabled !== 'disabled'\n : false;\n\n if (!routerEnabled) {\n return false;\n }\n\n const routerManager = getRouterManager();\n const router = routerManager.getRouter();\n return router !== null;\n }, [options.router]);\n\n // 优化:使用 useMemo 缓存路由实例\n const router = useMemo(() => {\n if (!shouldUseRouter) {\n return null;\n }\n const routerManager = getRouterManager();\n return routerManager.getRouter();\n }, [shouldUseRouter]);\n\n // 优化:使用 useCallback 缓存错误处理函数\n const handleError = useCallback((error: unknown) => {\n services.monitoring.captureError(error);\n }, [services.monitoring]);\n\n // 优化:使用 useMemo 缓存应用内容\n const appContent = useMemo(() => {\n if (shouldUseRouter && router) {\n return <RouterProvider router={router} />;\n }\n return options.app || <DefaultApp />;\n }, [shouldUseRouter, router, options.app]);\n\n return (\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={handleError}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.uiProvider || options.antd}\n initialInitializationContext={context}\n stateManager={services.stateManager}\n antdApp={options.uiApp || options.antdApp}\n >\n <BasicLayout globalProvider={options.globalProvider}>\n {appContent}\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n );\n});\n\nOptimizedAppContent.displayName = 'OptimizedAppContent';\n\n/**\n * 应用渲染器\n */\nexport class AppRenderer {\n private root: Root | null = null;\n private container: Container | null = null;\n\n /**\n * 初始化渲染器\n *\n * @param container - React应用的挂载容器\n * @param rootOptions - React根节点配置选项\n */\n initialize(container: Container, rootOptions?: RootOptions): void {\n this.container = container;\n if (!this.root) {\n this.root = createRoot(container, rootOptions);\n }\n }\n\n /**\n * 渲染应用\n *\n * 优化:\n * 1. 默认启用安全防护(XSS防护)\n * 2. 优化组件渲染性能,使用 useMemo 缓存计算结果\n * 3. 将安全配置计算提取到初始化阶段\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param context - 初始化上下文(可选)\n */\n async renderApp(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n context?: InitializationContext\n ): Promise<void> {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 优化:安全配置在初始化阶段计算(在 startApp 中预计算)\n // 这里只使用预计算的值,避免在渲染时重复计算\n const securityConfig: SecurityConfig = {\n enableXSSProtection: options.security?.enableXSSProtection ?? true,\n validateConfig: options.security?.validateConfig ?? true,\n sanitizeUserInput: options.security?.sanitizeUserInput ?? true,\n csrf: options.security?.csrf,\n };\n\n // 优化:安全验证在初始化阶段完成,这里只进行必要的运行时检查\n // 如果启用了安全模式(默认启用),对配置进行验证\n if (securityConfig.enableXSSProtection && securityConfig.validateConfig) {\n // 异步验证配置,不阻塞渲染\n Promise.resolve().then(() => {\n try {\n const configStr = JSON.stringify(options);\n const validation = SecurityUtils.validateInput(configStr);\n if (!validation.safe) {\n services.monitoring.captureError(\n new Error('配置项包含不安全内容'),\n { reason: validation.reason }\n );\n }\n } catch (error) {\n // 忽略序列化错误(某些配置项可能包含不可序列化的内容)\n }\n });\n }\n\n // 初始化 CSRF 防护(如果启用,异步执行,不阻塞渲染)\n if (securityConfig.enableXSSProtection && securityConfig.csrf?.enabled !== false) {\n import('@vlian/csrf').then(({ initCSRFManager }) => {\n initCSRFManager({\n headerName: securityConfig.csrf?.headerName,\n cookieName: securityConfig.csrf?.cookieName,\n getToken: securityConfig.csrf?.getToken,\n validateToken: securityConfig.csrf?.validateToken,\n });\n }).catch((error) => {\n // CSRF 初始化失败不影响应用启动,但记录警告\n if (process.env.NODE_ENV === 'development') {\n console.warn('CSRF 防护初始化失败:', error);\n }\n });\n }\n\n // 使用优化的应用内容组件,内部使用 useMemo 缓存计算结果\n this.root.render(\n <StrictMode>\n <OptimizedAppContent\n options={options}\n services={services}\n context={context}\n securityConfig={securityConfig}\n />\n </StrictMode>\n );\n }\n\n /**\n * 渲染启动页\n *\n * 注意:启动页不使用 RouterWrapper,因为启动页应该在路由系统之前渲染\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param onComplete - 启动页完成回调\n */\n renderSplashScreen(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n onComplete: (context: InitializationContext) => void\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 获取初始语言(从 locale 配置中推断,或使用默认值)\n const initialLocale: LangType = options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(error) => {\n services.monitoring.captureError(error);\n }}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.uiProvider || options.antd}\n stateManager={services.stateManager}\n antdApp={options.uiApp || options.antdApp}\n >\n {/*\n 启动页不使用 RouterWrapper,因为:\n 1. 启动页应该在路由系统初始化之前渲染\n 2. 启动页完成后才会渲染主应用,此时路由系统已经初始化完成\n */}\n <BasicLayout globalProvider={options.globalProvider}>\n <SplashScreen options={options} onComplete={onComplete} />\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 渲染错误页面\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param error - 错误信息\n */\n renderError(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n }\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(err) => {\n services.monitoring.captureError(err);\n if (options.errorMonitor?.onError) {\n options.errorMonitor.onError(err);\n }\n }}\n >\n <InitializationErrorThrower />\n <div>框架启动失败</div>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 销毁渲染器\n */\n destroy(): void {\n if (this.root) {\n this.root.unmount();\n this.root = null;\n }\n this.container = null;\n }\n\n /**\n * 获取容器\n */\n getContainer(): Container | null {\n return this.container;\n }\n}\n"],"names":["createRoot","StrictMode","useMemo","useCallback","memo","BasicLayout","DefaultApp","AppContextProvider","ErrorBoundary","InitializationErrorThrower","SplashScreen","SecurityUtils","getRouterManager","RouterProvider","OptimizedAppContent","options","services","context","securityConfig","_securityConfig","initialLocale","locale","Object","keys","shouldUseRouter","routerEnabled","router","enabled","routerManager","getRouter","handleError","error","monitoring","captureError","appContent","app","fallback","errorFallback","onError","initialTheme","theme","initialAntdConfig","uiProvider","antd","initialInitializationContext","stateManager","antdApp","uiApp","globalProvider","displayName","AppRenderer","initialize","container","rootOptions","root","renderApp","Error","enableXSSProtection","security","validateConfig","sanitizeUserInput","csrf","Promise","resolve","then","configStr","JSON","stringify","validation","validateInput","safe","reason","initCSRFManager","headerName","cookieName","getToken","validateToken","catch","process","env","NODE_ENV","console","warn","render","renderSplashScreen","onComplete","renderError","err","errorMonitor","div","destroy","unmount","getContainer"],"mappings":"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"}
@@ -11,8 +11,8 @@ Object.defineProperty(exports, "startApp", {
11
11
  return startApp;
12
12
  }
13
13
  });
14
- const _utils = require("../../utils");
15
- const _errors = require("../../utils/errors");
14
+ const _logger = require("@vlian/logger");
15
+ const _utils = require("@vlian/utils");
16
16
  const _traceId = require("../../utils/traceId");
17
17
  const _splash = require("../splash");
18
18
  const _index = require("../initialization/index");
@@ -38,16 +38,16 @@ async function startApp(options = {}, instanceId) {
38
38
  // 1. 环境检测和容器获取
39
39
  const container = options.container || envDetector.safeGetElement('#root');
40
40
  if (!container) {
41
- throw new _errors.InitializationError('未找到挂载容器', undefined, {
41
+ throw new _utils.InitializationError('未找到挂载容器', undefined, {
42
42
  container: options.container
43
- }, _errors.ErrorCode.CONTAINER_NOT_FOUND);
43
+ }, _utils.ErrorCode.CONTAINER_NOT_FOUND);
44
44
  }
45
- _utils.logger.info('框架启动中...');
45
+ _logger.logger.info('框架启动中...');
46
46
  if (options.antd && !options.uiProvider) {
47
- _utils.logger.warn('[deprecated] StartOptions.antd 即将废弃,请迁移到 StartOptions.uiProvider');
47
+ _logger.logger.warn('[deprecated] StartOptions.antd 即将废弃,请迁移到 StartOptions.uiProvider');
48
48
  }
49
49
  if (options.antdApp && !options.uiApp) {
50
- _utils.logger.warn('[deprecated] StartOptions.antdApp 即将废弃,请迁移到 StartOptions.uiApp');
50
+ _logger.logger.warn('[deprecated] StartOptions.antdApp 即将废弃,请迁移到 StartOptions.uiApp');
51
51
  }
52
52
  // 2. 创建应用实例
53
53
  const appInstance = instanceManager.createInstance(instanceId, options);
@@ -94,11 +94,11 @@ async function startApp(options = {}, instanceId) {
94
94
  if (services) {
95
95
  services.monitoring.captureError(error, metadata);
96
96
  } else {
97
- _utils.logger.error('Kernel 监控上报失败(服务尚未初始化):', error, metadata);
97
+ _logger.logger.error('Kernel 监控上报失败(服务尚未初始化):', error, metadata);
98
98
  }
99
99
  },
100
100
  reportMetric: (name, value, tags)=>{
101
- _utils.logger.debug(`[kernel.metric] ${name}`, {
101
+ _logger.logger.debug(`[kernel.metric] ${name}`, {
102
102
  value,
103
103
  tags,
104
104
  instanceId: finalInstanceId
@@ -129,7 +129,7 @@ async function startApp(options = {}, instanceId) {
129
129
  },
130
130
  errorHandler: {
131
131
  async handle (error) {
132
- _utils.logger.error('Kernel 启动阶段失败:', error);
132
+ _logger.logger.error('Kernel 启动阶段失败:', error);
133
133
  return {
134
134
  handled: true,
135
135
  shouldThrow: true
@@ -184,7 +184,7 @@ async function startApp(options = {}, instanceId) {
184
184
  // 使用 requestIdleCallback 在浏览器空闲时初始化,不影响用户体验
185
185
  if (resolvedServices.initializeNonCriticalServices) {
186
186
  resolvedServices.initializeNonCriticalServices().catch((error)=>{
187
- _utils.logger.warn('非关键服务初始化失败(不影响应用运行):', error);
187
+ _logger.logger.warn('非关键服务初始化失败(不影响应用运行):', error);
188
188
  });
189
189
  }
190
190
  if (performanceTracker) {
@@ -222,7 +222,7 @@ async function startApp(options = {}, instanceId) {
222
222
  if (shouldShowSplash) {
223
223
  // 场景1: 显示启动页,初始化在启动页中完成
224
224
  const onSplashComplete = (context)=>{
225
- _utils.logger.info('启动页初始化完成');
225
+ _logger.logger.info('启动页初始化完成');
226
226
  // 触发初始化完成事件
227
227
  if (frameworkEventManager) {
228
228
  const initDuration = context.duration || 0;
@@ -230,15 +230,15 @@ async function startApp(options = {}, instanceId) {
230
230
  }
231
231
  if (options.onSplashComplete) {
232
232
  Promise.resolve(options.onSplashComplete(()=>{
233
- _utils.logger.info('框架加载完成');
233
+ _logger.logger.info('框架加载完成');
234
234
  renderApp(context);
235
235
  }, context)).catch((error)=>{
236
- _utils.logger.error('onSplashComplete 回调执行失败:', error);
236
+ _logger.logger.error('onSplashComplete 回调执行失败:', error);
237
237
  _index.initializationErrorState.setError(error);
238
238
  renderApp(context);
239
239
  });
240
240
  } else {
241
- _utils.logger.info('框架加载完成');
241
+ _logger.logger.info('框架加载完成');
242
242
  renderApp(context);
243
243
  }
244
244
  };
@@ -250,7 +250,7 @@ async function startApp(options = {}, instanceId) {
250
250
  renderer.renderSplashScreen(options, resolvedServices, onSplashComplete);
251
251
  } else {
252
252
  // 场景2: 不显示启动页,直接执行初始化
253
- _utils.logger.info('开始执行初始化(无启动页)');
253
+ _logger.logger.info('开始执行初始化(无启动页)');
254
254
  // 触发初始化开始事件
255
255
  if (frameworkEventManager) {
256
256
  frameworkEventManager.emitAppInitStart(finalInstanceId);
@@ -260,7 +260,7 @@ async function startApp(options = {}, instanceId) {
260
260
  // 使用中间件包装初始化函数
261
261
  const initContext = await _middleware.middlewareManager.execute(options, async ()=>{
262
262
  return await (0, _index.initialization)(options, (progress, step)=>{
263
- _utils.logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);
263
+ _logger.logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);
264
264
  });
265
265
  });
266
266
  const initDuration = performance.now() - initStart;
@@ -271,22 +271,22 @@ async function startApp(options = {}, instanceId) {
271
271
  if (performanceTracker) {
272
272
  performanceTracker.recordInitialization(initDuration);
273
273
  }
274
- _utils.logger.info('初始化完成(无启动页)', initContext);
275
- _utils.logger.info('框架加载完成');
276
- renderApp(initContext);
274
+ _logger.logger.info('初始化完成(无启动页)', initContext);
275
+ _logger.logger.info('框架加载完成');
276
+ void renderApp(initContext);
277
277
  } catch (error) {
278
- _utils.logger.error('初始化失败:', error);
278
+ _logger.logger.error('初始化失败:', error);
279
279
  // 触发初始化错误事件
280
280
  if (frameworkEventManager) {
281
281
  frameworkEventManager.emitAppInitError(finalInstanceId, error instanceof Error ? error : new Error(String(error)));
282
282
  }
283
283
  _index.initializationErrorState.setError(error);
284
- renderApp();
284
+ void renderApp();
285
285
  }
286
286
  }
287
287
  return instanceManager;
288
288
  } catch (error) {
289
- _utils.logger.error('框架启动失败:', error);
289
+ _logger.logger.error('框架启动失败:', error);
290
290
  // 触发错误事件
291
291
  if (frameworkEventManager) {
292
292
  const errorInstanceId = instanceId || instanceManager.getInstance()?.id;
@@ -297,7 +297,7 @@ async function startApp(options = {}, instanceId) {
297
297
  }
298
298
  }
299
299
  if (kernelTraceId) {
300
- _utils.logger.error('Kernel Trace 失败上下文', {
300
+ _logger.logger.error('Kernel Trace 失败上下文', {
301
301
  traceId: kernelTraceId
302
302
  });
303
303
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/startup/startApp.ts"],"sourcesContent":["/**\n * 应用启动主函数\n * 重构后的启动逻辑,集成所有新功能\n */\n\nimport { logger } from '../../utils';\nimport { ErrorCode, InitializationError } from '../../utils/errors';\nimport { initTraceIdGenerator, generateTraceId, setCurrentTraceId } from '../../utils/traceId';\nimport type { StartOptions } from '../types';\nimport { shouldShowSplashScreen } from '../splash';\nimport { initialization, initializationErrorState } from '../initialization/index';\nimport { middlewareManager } from '../middleware';\nimport { initializeServices } from './initializeServices';\nimport type { ServicesInitResult } from './initializeServices';\nimport { AppInstanceManager, getAppInstanceManager } from './AppInstance';\nimport { getEnvironmentDetector } from './environment';\nimport { getRouterManager } from '../router/RouterManager';\nimport { FrameworkEventManager } from '../event/frameworkEvents';\nimport { startKernel } from '../kernel';\n\n/**\n * 启动应用\n * \n * @param options - 启动配置选项\n * @param instanceId - 应用实例ID(可选,用于多实例场景)\n * @returns 应用实例\n */\nexport async function startApp(\n options: StartOptions = {},\n instanceId?: string\n): Promise<AppInstanceManager> {\n const startTime = performance.now();\n const envDetector = getEnvironmentDetector();\n const instanceManager = getAppInstanceManager();\n\n // 初始化追踪 ID 生成器\n initTraceIdGenerator('app');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n // 框架事件管理器(在服务初始化后创建)\n let frameworkEventManager: FrameworkEventManager | null = null;\n let kernelTraceId: string | null = null;\n\n try {\n // 1. 环境检测和容器获取\n const container = options.container || envDetector.safeGetElement('#root');\n if (!container) {\n throw new InitializationError(\n '未找到挂载容器',\n undefined,\n { container: options.container },\n ErrorCode.CONTAINER_NOT_FOUND\n );\n }\n\n logger.info('框架启动中...');\n\n if (options.antd && !options.uiProvider) {\n logger.warn('[deprecated] StartOptions.antd 即将废弃,请迁移到 StartOptions.uiProvider');\n }\n if (options.antdApp && !options.uiApp) {\n logger.warn('[deprecated] StartOptions.antdApp 即将废弃,请迁移到 StartOptions.uiApp');\n }\n\n // 2. 创建应用实例\n const appInstance = instanceManager.createInstance(instanceId, options);\n const finalInstanceId = appInstance.id;\n let services: ServicesInitResult | null = null;\n\n // 使用单次 Promise 防止重复初始化,提升加载速度并保证可观测数据一致。\n let servicesInitPromise: Promise<ServicesInitResult> | null = null;\n const ensureServicesInitialized = async (): Promise<ServicesInitResult> => {\n if (services) {\n return services;\n }\n if (!servicesInitPromise) {\n servicesInitPromise = initializeServices({\n ...options,\n eventBus: {\n ...options.eventBus,\n instanceId: finalInstanceId,\n },\n });\n }\n services = await servicesInitPromise;\n return services;\n };\n\n // 3. 使用无 UI Kernel 管理启动阶段(配置、主题、i18n、服务注入、统一错误处理)\n const kernelRuntime = await startKernel({\n loggerLevel: options.loggerLevel,\n locale: {\n locale: (options.locale ? (Object.keys(options.locale)[0] as any) : 'zh-CN') || 'zh-CN',\n resources: options.locale as any,\n },\n theme: {\n mode: options.theme?.mode || 'light',\n primaryColor: options.theme?.primaryColor,\n compatibility: {\n antd: (options.uiProvider || options.antd) as unknown as Record<string, unknown> | undefined,\n },\n },\n adapters: {\n monitoring: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n captureError: (error, metadata) => {\n if (services) {\n services.monitoring.captureError(error, metadata);\n } else {\n logger.error('Kernel 监控上报失败(服务尚未初始化):', error, metadata);\n }\n },\n reportMetric: (name, value, tags) => {\n logger.debug(`[kernel.metric] ${name}`, { value, tags, instanceId: finalInstanceId });\n },\n },\n state: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n getInstance: () => services?.stateManager ?? null,\n },\n eventBus: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n emit: (event, payload) => {\n if (services) {\n services.eventBus.emit(event as any, payload as any);\n }\n },\n on: (event, handler) => {\n if (!services) {\n return () => {};\n }\n return services.eventBus.on(event as any, handler as any);\n },\n },\n errorHandler: {\n async handle(error) {\n logger.error('Kernel 启动阶段失败:', error);\n return { handled: true, shouldThrow: true };\n },\n },\n },\n enabledPhases: {\n init: false,\n },\n enablePostReady: false,\n });\n kernelTraceId = kernelRuntime.traceId;\n\n const servicesInitStart = performance.now();\n const resolvedServices = await ensureServicesInitialized();\n const servicesInitDuration = performance.now() - servicesInitStart;\n\n // 创建框架事件管理器\n frameworkEventManager = new FrameworkEventManager(resolvedServices.eventBus);\n \n // 触发应用启动事件(使用真实的事件总线)\n frameworkEventManager.emitAppStart(finalInstanceId);\n \n // 触发实例创建事件\n frameworkEventManager.emitInstanceCreated(finalInstanceId);\n\n // 4. 初始化应用实例\n appInstance.initialize(container, resolvedServices);\n\n // 5. 初始化路由管理器\n const routerManager = getRouterManager();\n if (options.router) {\n await routerManager.initialize(options.router);\n }\n\n // 6. 性能追踪\n const performanceTracker = appInstance.getPerformanceTracker();\n if (performanceTracker) {\n performanceTracker.recordServiceInit(servicesInitDuration);\n }\n\n // 6. 是否显示启动页\n const shouldShowSplash = shouldShowSplashScreen(options.showSplashScreen);\n\n const renderer = appInstance.getRenderer();\n\n // 8. 渲染应用函数\n const renderApp = async (context?: Awaited<ReturnType<typeof initialization>>) => {\n const renderStart = performance.now();\n \n // 触发渲染开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderStart(finalInstanceId);\n }\n \n await renderer.renderApp(options, resolvedServices, context);\n const renderDuration = performance.now() - renderStart;\n\n // 触发渲染完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderComplete(finalInstanceId, renderDuration);\n }\n\n // 优化:在应用渲染完成后,延迟初始化非关键服务\n // 使用 requestIdleCallback 在浏览器空闲时初始化,不影响用户体验\n if (resolvedServices.initializeNonCriticalServices) {\n resolvedServices.initializeNonCriticalServices().catch((error) => {\n logger.warn('非关键服务初始化失败(不影响应用运行):', error);\n });\n }\n\n if (performanceTracker) {\n performanceTracker.recordFirstRender(renderDuration);\n const totalDuration = performance.now() - startTime;\n performanceTracker.recordTotalStartup(totalDuration);\n performanceTracker.report();\n }\n \n // 触发应用启动完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppStarted(finalInstanceId, performance.now() - startTime);\n }\n\n // 统一发出 Kernel post-ready 事件,供可观测系统消费。\n kernelRuntime.getEventBus().emit('kernel.postReady', {\n traceId: kernelRuntime.traceId,\n instanceId: finalInstanceId,\n startupDuration: performance.now() - startTime,\n });\n\n // 开发模式下显示开发工具\n if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {\n // 延迟显示开发工具,避免影响首次渲染\n setTimeout(() => {\n const devToolsContainer = document.createElement('div');\n devToolsContainer.id = '__framework_dev_tools__';\n document.body.appendChild(devToolsContainer);\n \n // 这里需要动态导入React来渲染开发工具\n // 为了简化,暂时注释掉,后续可以完善\n // import('react-dom/client').then(({ createRoot }) => {\n // const root = createRoot(devToolsContainer);\n // root.render(<DevToolsTrigger appInstance={appInstance} />);\n // });\n }, 1000);\n }\n };\n\n if (shouldShowSplash) {\n // 场景1: 显示启动页,初始化在启动页中完成\n const onSplashComplete = (context: Awaited<ReturnType<typeof initialization>>) => {\n logger.info('启动页初始化完成');\n\n // 触发初始化完成事件\n if (frameworkEventManager) {\n const initDuration = context.duration || 0;\n frameworkEventManager.emitAppInitComplete(finalInstanceId, context, initDuration);\n }\n\n if (options.onSplashComplete) {\n Promise.resolve(\n options.onSplashComplete(() => {\n logger.info('框架加载完成');\n renderApp(context);\n }, context)\n ).catch((error) => {\n logger.error('onSplashComplete 回调执行失败:', error);\n initializationErrorState.setError(error);\n renderApp(context);\n });\n } else {\n logger.info('框架加载完成');\n renderApp(context);\n }\n };\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n // 渲染启动页\n renderer.renderSplashScreen(options, resolvedServices, onSplashComplete);\n } else {\n // 场景2: 不显示启动页,直接执行初始化\n logger.info('开始执行初始化(无启动页)');\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n try {\n const initStart = performance.now();\n\n // 使用中间件包装初始化函数\n const initContext = await middlewareManager.execute(\n options,\n async () => {\n return await initialization(options, (progress, step) => {\n logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);\n });\n }\n );\n\n const initDuration = performance.now() - initStart;\n \n // 触发初始化完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitComplete(finalInstanceId, initContext, initDuration);\n }\n \n if (performanceTracker) {\n performanceTracker.recordInitialization(initDuration);\n }\n\n logger.info('初始化完成(无启动页)', initContext);\n logger.info('框架加载完成');\n renderApp(initContext);\n } catch (error) {\n logger.error('初始化失败:', error);\n \n // 触发初始化错误事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitError(\n finalInstanceId,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n \n initializationErrorState.setError(error);\n renderApp();\n }\n }\n\n return instanceManager;\n } catch (error) {\n logger.error('框架启动失败:', error);\n\n // 触发错误事件\n if (frameworkEventManager) {\n const errorInstanceId = instanceId || instanceManager.getInstance()?.id;\n if (errorInstanceId) {\n frameworkEventManager.emitErrorOccurred(\n error instanceof Error ? error : new Error(String(error)),\n { phase: 'startup' }\n );\n }\n }\n\n if (kernelTraceId) {\n logger.error('Kernel Trace 失败上下文', { traceId: kernelTraceId });\n }\n\n // 如果容器存在,尝试渲染错误页面\n const container = options.container || envDetector.safeGetElement('#root');\n if (container) {\n const errorInstance = instanceManager.getInstance();\n if (errorInstance && errorInstance.isInitialized()) {\n const renderer = errorInstance.getRenderer();\n const services = errorInstance.getServices();\n initializationErrorState.setError(error);\n renderer.renderError(options, services);\n }\n }\n\n throw error;\n }\n}\n"],"names":["startApp","options","instanceId","startTime","performance","now","envDetector","getEnvironmentDetector","instanceManager","getAppInstanceManager","initTraceIdGenerator","traceId","generateTraceId","setCurrentTraceId","frameworkEventManager","kernelTraceId","container","safeGetElement","InitializationError","undefined","ErrorCode","CONTAINER_NOT_FOUND","logger","info","antd","uiProvider","warn","antdApp","uiApp","appInstance","createInstance","finalInstanceId","id","services","servicesInitPromise","ensureServicesInitialized","initializeServices","eventBus","kernelRuntime","startKernel","loggerLevel","locale","Object","keys","resources","theme","mode","primaryColor","compatibility","adapters","monitoring","initialize","captureError","error","metadata","reportMetric","name","value","tags","debug","state","getInstance","stateManager","emit","event","payload","on","handler","errorHandler","handle","handled","shouldThrow","enabledPhases","init","enablePostReady","servicesInitStart","resolvedServices","servicesInitDuration","FrameworkEventManager","emitAppStart","emitInstanceCreated","routerManager","getRouterManager","router","performanceTracker","getPerformanceTracker","recordServiceInit","shouldShowSplash","shouldShowSplashScreen","showSplashScreen","renderer","getRenderer","renderApp","context","renderStart","emitAppRenderStart","renderDuration","emitAppRenderComplete","initializeNonCriticalServices","catch","recordFirstRender","totalDuration","recordTotalStartup","report","emitAppStarted","getEventBus","startupDuration","process","env","NODE_ENV","window","setTimeout","devToolsContainer","document","createElement","body","appendChild","onSplashComplete","initDuration","duration","emitAppInitComplete","Promise","resolve","initializationErrorState","setError","emitAppInitStart","renderSplashScreen","initStart","initContext","middlewareManager","execute","initialization","progress","step","recordInitialization","emitAppInitError","Error","String","errorInstanceId","emitErrorOccurred","phase","errorInstance","isInitialized","getServices","renderError"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/startup/startApp.ts"],"sourcesContent":["/**\n * 应用启动主函数\n * 重构后的启动逻辑,集成所有新功能\n */\n\nimport { logger } from '@vlian/logger';\nimport { ErrorCode, InitializationError } from '@vlian/utils';\nimport { initTraceIdGenerator, generateTraceId, setCurrentTraceId } from '../../utils/traceId';\nimport type { StartOptions } from '../types';\nimport { shouldShowSplashScreen } from '../splash';\nimport { initialization, initializationErrorState } from '../initialization/index';\nimport { middlewareManager } from '../middleware';\nimport { initializeServices } from './initializeServices';\nimport type { ServicesInitResult } from './initializeServices';\nimport { AppInstanceManager, getAppInstanceManager } from './AppInstance';\nimport { getEnvironmentDetector } from './environment';\nimport { getRouterManager } from '../router/RouterManager';\nimport { FrameworkEventManager } from '../event/frameworkEvents';\nimport { startKernel } from '../kernel';\n\n/**\n * 启动应用\n *\n * @param options - 启动配置选项\n * @param instanceId - 应用实例ID(可选,用于多实例场景)\n * @returns 应用实例\n */\nexport async function startApp(\n options: StartOptions = {},\n instanceId?: string\n): Promise<AppInstanceManager> {\n const startTime = performance.now();\n const envDetector = getEnvironmentDetector();\n const instanceManager = getAppInstanceManager();\n\n // 初始化追踪 ID 生成器\n initTraceIdGenerator('app');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n // 框架事件管理器(在服务初始化后创建)\n let frameworkEventManager: FrameworkEventManager | null = null;\n let kernelTraceId: string | null = null;\n\n try {\n // 1. 环境检测和容器获取\n const container = options.container || envDetector.safeGetElement('#root');\n if (!container) {\n throw new InitializationError(\n '未找到挂载容器',\n undefined,\n { container: options.container },\n ErrorCode.CONTAINER_NOT_FOUND\n );\n }\n\n logger.info('框架启动中...');\n\n if (options.antd && !options.uiProvider) {\n logger.warn('[deprecated] StartOptions.antd 即将废弃,请迁移到 StartOptions.uiProvider');\n }\n if (options.antdApp && !options.uiApp) {\n logger.warn('[deprecated] StartOptions.antdApp 即将废弃,请迁移到 StartOptions.uiApp');\n }\n\n // 2. 创建应用实例\n const appInstance = instanceManager.createInstance(instanceId, options);\n const finalInstanceId = appInstance.id;\n let services: ServicesInitResult | null = null;\n\n // 使用单次 Promise 防止重复初始化,提升加载速度并保证可观测数据一致。\n let servicesInitPromise: Promise<ServicesInitResult> | null = null;\n const ensureServicesInitialized = async (): Promise<ServicesInitResult> => {\n if (services) {\n return services;\n }\n if (!servicesInitPromise) {\n servicesInitPromise = initializeServices({\n ...options,\n eventBus: {\n ...options.eventBus,\n instanceId: finalInstanceId,\n },\n });\n }\n services = await servicesInitPromise;\n return services;\n };\n\n // 3. 使用无 UI Kernel 管理启动阶段(配置、主题、i18n、服务注入、统一错误处理)\n const kernelRuntime = await startKernel({\n loggerLevel: options.loggerLevel,\n locale: {\n locale: (options.locale ? (Object.keys(options.locale)[0] as any) : 'zh-CN') || 'zh-CN',\n resources: options.locale as any,\n },\n theme: {\n mode: options.theme?.mode || 'light',\n primaryColor: options.theme?.primaryColor,\n compatibility: {\n antd: (options.uiProvider || options.antd) as unknown as Record<string, unknown> | undefined,\n },\n },\n adapters: {\n monitoring: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n captureError: (error, metadata) => {\n if (services) {\n services.monitoring.captureError(error, metadata);\n } else {\n logger.error('Kernel 监控上报失败(服务尚未初始化):', error, metadata);\n }\n },\n reportMetric: (name, value, tags) => {\n logger.debug(`[kernel.metric] ${name}`, { value, tags, instanceId: finalInstanceId });\n },\n },\n state: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n getInstance: () => services?.stateManager ?? null,\n },\n eventBus: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n emit: (event, payload) => {\n if (services) {\n services.eventBus.emit(event as any, payload as any);\n }\n },\n on: (event, handler) => {\n if (!services) {\n return () => {};\n }\n return services.eventBus.on(event as any, handler as any);\n },\n },\n errorHandler: {\n async handle(error) {\n logger.error('Kernel 启动阶段失败:', error);\n return { handled: true, shouldThrow: true };\n },\n },\n },\n enabledPhases: {\n init: false,\n },\n enablePostReady: false,\n });\n kernelTraceId = kernelRuntime.traceId;\n\n const servicesInitStart = performance.now();\n const resolvedServices = await ensureServicesInitialized();\n const servicesInitDuration = performance.now() - servicesInitStart;\n\n // 创建框架事件管理器\n frameworkEventManager = new FrameworkEventManager(resolvedServices.eventBus);\n\n // 触发应用启动事件(使用真实的事件总线)\n frameworkEventManager.emitAppStart(finalInstanceId);\n\n // 触发实例创建事件\n frameworkEventManager.emitInstanceCreated(finalInstanceId);\n\n // 4. 初始化应用实例\n appInstance.initialize(container, resolvedServices);\n\n // 5. 初始化路由管理器\n const routerManager = getRouterManager();\n if (options.router) {\n await routerManager.initialize(options.router);\n }\n\n // 6. 性能追踪\n const performanceTracker = appInstance.getPerformanceTracker();\n if (performanceTracker) {\n performanceTracker.recordServiceInit(servicesInitDuration);\n }\n\n // 6. 是否显示启动页\n const shouldShowSplash = shouldShowSplashScreen(options.showSplashScreen);\n\n const renderer = appInstance.getRenderer();\n\n // 8. 渲染应用函数\n const renderApp = async (context?: Awaited<ReturnType<typeof initialization>>) => {\n const renderStart = performance.now();\n\n // 触发渲染开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderStart(finalInstanceId);\n }\n\n await renderer.renderApp(options, resolvedServices, context);\n const renderDuration = performance.now() - renderStart;\n\n // 触发渲染完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderComplete(finalInstanceId, renderDuration);\n }\n\n // 优化:在应用渲染完成后,延迟初始化非关键服务\n // 使用 requestIdleCallback 在浏览器空闲时初始化,不影响用户体验\n if (resolvedServices.initializeNonCriticalServices) {\n resolvedServices.initializeNonCriticalServices().catch((error) => {\n logger.warn('非关键服务初始化失败(不影响应用运行):', error);\n });\n }\n\n if (performanceTracker) {\n performanceTracker.recordFirstRender(renderDuration);\n const totalDuration = performance.now() - startTime;\n performanceTracker.recordTotalStartup(totalDuration);\n performanceTracker.report();\n }\n\n // 触发应用启动完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppStarted(finalInstanceId, performance.now() - startTime);\n }\n\n // 统一发出 Kernel post-ready 事件,供可观测系统消费。\n kernelRuntime.getEventBus().emit('kernel.postReady', {\n traceId: kernelRuntime.traceId,\n instanceId: finalInstanceId,\n startupDuration: performance.now() - startTime,\n });\n\n // 开发模式下显示开发工具\n if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {\n // 延迟显示开发工具,避免影响首次渲染\n setTimeout(() => {\n const devToolsContainer = document.createElement('div');\n devToolsContainer.id = '__framework_dev_tools__';\n document.body.appendChild(devToolsContainer);\n\n // 这里需要动态导入React来渲染开发工具\n // 为了简化,暂时注释掉,后续可以完善\n // import('react-dom/client').then(({ createRoot }) => {\n // const root = createRoot(devToolsContainer);\n // root.render(<DevToolsTrigger appInstance={appInstance} />);\n // });\n }, 1000);\n }\n };\n\n if (shouldShowSplash) {\n // 场景1: 显示启动页,初始化在启动页中完成\n const onSplashComplete = (context: Awaited<ReturnType<typeof initialization>>) => {\n logger.info('启动页初始化完成');\n\n // 触发初始化完成事件\n if (frameworkEventManager) {\n const initDuration = context.duration || 0;\n frameworkEventManager.emitAppInitComplete(finalInstanceId, context, initDuration);\n }\n\n if (options.onSplashComplete) {\n Promise.resolve(\n options.onSplashComplete(() => {\n logger.info('框架加载完成');\n renderApp(context);\n }, context)\n ).catch((error) => {\n logger.error('onSplashComplete 回调执行失败:', error);\n initializationErrorState.setError(error);\n renderApp(context);\n });\n } else {\n logger.info('框架加载完成');\n renderApp(context);\n }\n };\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n // 渲染启动页\n renderer.renderSplashScreen(options, resolvedServices, onSplashComplete);\n } else {\n // 场景2: 不显示启动页,直接执行初始化\n logger.info('开始执行初始化(无启动页)');\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n try {\n const initStart = performance.now();\n\n // 使用中间件包装初始化函数\n const initContext = await middlewareManager.execute(\n options,\n async () => {\n return await initialization(options, (progress, step) => {\n logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);\n });\n }\n );\n\n const initDuration = performance.now() - initStart;\n\n // 触发初始化完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitComplete(finalInstanceId, initContext, initDuration);\n }\n\n if (performanceTracker) {\n performanceTracker.recordInitialization(initDuration);\n }\n\n logger.info('初始化完成(无启动页)', initContext);\n logger.info('框架加载完成');\n void renderApp(initContext);\n } catch (error) {\n logger.error('初始化失败:', error);\n\n // 触发初始化错误事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitError(\n finalInstanceId,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n\n initializationErrorState.setError(error);\n void renderApp();\n }\n }\n\n return instanceManager;\n } catch (error) {\n logger.error('框架启动失败:', error);\n\n // 触发错误事件\n if (frameworkEventManager) {\n const errorInstanceId = instanceId || instanceManager.getInstance()?.id;\n if (errorInstanceId) {\n frameworkEventManager.emitErrorOccurred(\n error instanceof Error ? error : new Error(String(error)),\n { phase: 'startup' }\n );\n }\n }\n\n if (kernelTraceId) {\n logger.error('Kernel Trace 失败上下文', { traceId: kernelTraceId });\n }\n\n // 如果容器存在,尝试渲染错误页面\n const container = options.container || envDetector.safeGetElement('#root');\n if (container) {\n const errorInstance = instanceManager.getInstance();\n if (errorInstance && errorInstance.isInitialized()) {\n const renderer = errorInstance.getRenderer();\n const services = errorInstance.getServices();\n initializationErrorState.setError(error);\n renderer.renderError(options, services);\n }\n }\n\n throw error;\n }\n}\n"],"names":["startApp","options","instanceId","startTime","performance","now","envDetector","getEnvironmentDetector","instanceManager","getAppInstanceManager","initTraceIdGenerator","traceId","generateTraceId","setCurrentTraceId","frameworkEventManager","kernelTraceId","container","safeGetElement","InitializationError","undefined","ErrorCode","CONTAINER_NOT_FOUND","logger","info","antd","uiProvider","warn","antdApp","uiApp","appInstance","createInstance","finalInstanceId","id","services","servicesInitPromise","ensureServicesInitialized","initializeServices","eventBus","kernelRuntime","startKernel","loggerLevel","locale","Object","keys","resources","theme","mode","primaryColor","compatibility","adapters","monitoring","initialize","captureError","error","metadata","reportMetric","name","value","tags","debug","state","getInstance","stateManager","emit","event","payload","on","handler","errorHandler","handle","handled","shouldThrow","enabledPhases","init","enablePostReady","servicesInitStart","resolvedServices","servicesInitDuration","FrameworkEventManager","emitAppStart","emitInstanceCreated","routerManager","getRouterManager","router","performanceTracker","getPerformanceTracker","recordServiceInit","shouldShowSplash","shouldShowSplashScreen","showSplashScreen","renderer","getRenderer","renderApp","context","renderStart","emitAppRenderStart","renderDuration","emitAppRenderComplete","initializeNonCriticalServices","catch","recordFirstRender","totalDuration","recordTotalStartup","report","emitAppStarted","getEventBus","startupDuration","process","env","NODE_ENV","window","setTimeout","devToolsContainer","document","createElement","body","appendChild","onSplashComplete","initDuration","duration","emitAppInitComplete","Promise","resolve","initializationErrorState","setError","emitAppInitStart","renderSplashScreen","initStart","initContext","middlewareManager","execute","initialization","progress","step","recordInitialization","emitAppInitError","Error","String","errorInstanceId","emitErrorOccurred","phase","errorInstance","isInitialized","getServices","renderError"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * 应用启动主函数
3
3
  * 重构后的启动逻辑,集成所有新功能
4
- */ import { logger } from "../../utils";
5
- import { ErrorCode, InitializationError } from "../../utils/errors";
4
+ */ import { logger } from "@vlian/logger";
5
+ import { ErrorCode, InitializationError } from "@vlian/utils";
6
6
  import { initTraceIdGenerator, generateTraceId, setCurrentTraceId } from "../../utils/traceId";
7
7
  import { shouldShowSplashScreen } from "../splash";
8
8
  import { initialization, initializationErrorState } from "../initialization/index";
@@ -15,7 +15,7 @@ import { FrameworkEventManager } from "../event/frameworkEvents";
15
15
  import { startKernel } from "../kernel";
16
16
  /**
17
17
  * 启动应用
18
- *
18
+ *
19
19
  * @param options - 启动配置选项
20
20
  * @param instanceId - 应用实例ID(可选,用于多实例场景)
21
21
  * @returns 应用实例
@@ -269,7 +269,7 @@ import { startKernel } from "../kernel";
269
269
  }
270
270
  logger.info('初始化完成(无启动页)', initContext);
271
271
  logger.info('框架加载完成');
272
- renderApp(initContext);
272
+ void renderApp(initContext);
273
273
  } catch (error) {
274
274
  logger.error('初始化失败:', error);
275
275
  // 触发初始化错误事件
@@ -277,7 +277,7 @@ import { startKernel } from "../kernel";
277
277
  frameworkEventManager.emitAppInitError(finalInstanceId, error instanceof Error ? error : new Error(String(error)));
278
278
  }
279
279
  initializationErrorState.setError(error);
280
- renderApp();
280
+ void renderApp();
281
281
  }
282
282
  }
283
283
  return instanceManager;