@vlian/framework 1.1.1 → 1.2.1

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 (44) hide show
  1. package/README.md +35 -1
  2. package/dist/core/config/ConfigLoader.cjs +90 -8
  3. package/dist/core/config/ConfigLoader.cjs.map +1 -1
  4. package/dist/core/config/ConfigLoader.d.ts +20 -4
  5. package/dist/core/config/ConfigLoader.d.ts.map +1 -1
  6. package/dist/core/config/ConfigLoader.js +90 -8
  7. package/dist/core/config/ConfigLoader.js.map +1 -1
  8. package/dist/core/error/ErrorBoundary.cjs +23 -9
  9. package/dist/core/error/ErrorBoundary.cjs.map +1 -1
  10. package/dist/core/error/ErrorBoundary.d.ts.map +1 -1
  11. package/dist/core/error/ErrorBoundary.js +23 -9
  12. package/dist/core/error/ErrorBoundary.js.map +1 -1
  13. package/dist/core/error/ErrorHandler.cjs +277 -0
  14. package/dist/core/error/ErrorHandler.cjs.map +1 -0
  15. package/dist/core/error/ErrorHandler.d.ts +172 -0
  16. package/dist/core/error/ErrorHandler.d.ts.map +1 -0
  17. package/dist/core/error/ErrorHandler.js +261 -0
  18. package/dist/core/error/ErrorHandler.js.map +1 -0
  19. package/dist/core/error/index.cjs +10 -0
  20. package/dist/core/error/index.cjs.map +1 -1
  21. package/dist/core/error/index.d.ts +2 -0
  22. package/dist/core/error/index.d.ts.map +1 -1
  23. package/dist/core/error/index.js +1 -0
  24. package/dist/core/error/index.js.map +1 -1
  25. package/dist/core/startup/initializeServices.cjs +69 -24
  26. package/dist/core/startup/initializeServices.cjs.map +1 -1
  27. package/dist/core/startup/initializeServices.d.ts +9 -2
  28. package/dist/core/startup/initializeServices.d.ts.map +1 -1
  29. package/dist/core/startup/initializeServices.js +73 -26
  30. package/dist/core/startup/initializeServices.js.map +1 -1
  31. package/dist/core/startup/renderApp.cjs +100 -61
  32. package/dist/core/startup/renderApp.cjs.map +1 -1
  33. package/dist/core/startup/renderApp.d.ts +2 -2
  34. package/dist/core/startup/renderApp.d.ts.map +1 -1
  35. package/dist/core/startup/renderApp.js +101 -62
  36. package/dist/core/startup/renderApp.js.map +1 -1
  37. package/dist/core/startup/startApp.cjs +7 -0
  38. package/dist/core/startup/startApp.cjs.map +1 -1
  39. package/dist/core/startup/startApp.d.ts.map +1 -1
  40. package/dist/core/startup/startApp.js +7 -0
  41. package/dist/core/startup/startApp.js.map +1 -1
  42. package/dist/index.umd.js +32434 -39284
  43. package/dist/index.umd.js.map +1 -1
  44. package/package.json +40 -6
@@ -88,7 +88,8 @@ async function initializeServices(options = {}) {
88
88
  retryDelay: options.serviceRetry?.retryDelay ?? 1000,
89
89
  exponentialBackoff: options.serviceRetry?.exponentialBackoff ?? true
90
90
  };
91
- // 优化:完全并行初始化所有不相互依赖的服务
91
+ // ========== 关键服务:必须在应用渲染前初始化 ==========
92
+ // 这些服务是应用运行的基础,必须并行初始化完成
92
93
  // 1. 监控服务(必须最先初始化,因为其他服务可能依赖它)
93
94
  const monitoringPromise = withRetry(()=>Promise.resolve((0, _monitoring.initMonitoring)({
94
95
  ...options.errorMonitor,
@@ -97,12 +98,12 @@ async function initializeServices(options = {}) {
97
98
  options.errorMonitor?.onError?.(error);
98
99
  }
99
100
  })), retryConfig, '监控服务');
100
- // 2. 存储服务(独立,可并行)
101
+ // 2. 存储服务(关键服务,应用可能需要立即使用存储)
101
102
  const storagePromise = withRetry(()=>Promise.resolve().then(()=>{
102
103
  _library.storage.initialize(options.storageOptions);
103
104
  return _library.storage;
104
105
  }), retryConfig, '存储服务');
105
- // 3. 状态管理器(独立,可并行)
106
+ // 3. 状态管理器(关键服务,应用状态管理的基础)
106
107
  const stateManagerPromise = withRetry(()=>Promise.resolve().then(()=>{
107
108
  if (options.stateManager !== undefined) {
108
109
  return new _state.StateManager(options.stateManager);
@@ -114,7 +115,7 @@ async function initializeServices(options = {}) {
114
115
  });
115
116
  }
116
117
  }), retryConfig, '状态管理器');
117
- // 4. 事件总线(独立,可并行)
118
+ // 4. 事件总线(关键服务,用于应用内部通信)
118
119
  const eventBusPromise = withRetry(()=>Promise.resolve().then(()=>{
119
120
  const eventBusConfig = {
120
121
  enableTracking: options.eventBus?.enableTracking ?? process.env.NODE_ENV === 'development',
@@ -128,26 +129,14 @@ async function initializeServices(options = {}) {
128
129
  };
129
130
  return new _AppEventBus.AppEventBus(eventBusConfig);
130
131
  }), retryConfig, '事件总线');
131
- // 5. 分析服务(可选,动态导入)
132
- const analyticsPromise = options.analytics ? withRetry(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../utils/analytics"))).then(({ initAnalytics })=>{
133
- initAnalytics(options.analytics);
134
- return true;
135
- }), retryConfig, '分析服务') : Promise.resolve(false);
136
- // 6. 运行时安全(可选,动态导入)
137
- const runtimeSecurityPromise = options.runtimeSecurity ? withRetry(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../utils/runtimeSecurity"))).then(({ RuntimeSecurity })=>{
138
- RuntimeSecurity.initialize(options.runtimeSecurity);
139
- return true;
140
- }), retryConfig, '运行时安全服务') : Promise.resolve(false);
141
- // 并行执行所有初始化任务
132
+ // 并行执行关键服务初始化
142
133
  const [monitoring, , stateManager, eventBus] = await Promise.all([
143
134
  monitoringPromise,
144
135
  storagePromise,
145
136
  stateManagerPromise,
146
- eventBusPromise,
147
- analyticsPromise,
148
- runtimeSecurityPromise
137
+ eventBusPromise
149
138
  ]);
150
- _utils.logger.info('状态管理器初始化完成');
139
+ _utils.logger.info('关键服务初始化完成');
151
140
  // 初始化性能监控(依赖监控服务,必须在监控服务初始化后)
152
141
  const performanceMonitor = new _performance.PerformanceMonitor({
153
142
  ...options.performanceMonitor,
@@ -164,19 +153,75 @@ async function initializeServices(options = {}) {
164
153
  };
165
154
  window.addEventListener('beforeunload', cleanupHandler);
166
155
  }
167
- const duration = performance.now() - startTime;
168
- _utils.logger.debug(`服务初始化完成,耗时: ${duration.toFixed(2)}ms`);
169
- // 记录性能指标
156
+ const criticalServicesDuration = performance.now() - startTime;
157
+ _utils.logger.debug(`关键服务初始化完成,耗时: ${criticalServicesDuration.toFixed(2)}ms`);
158
+ // ========== 非关键服务:延迟到应用渲染后初始化 ==========
159
+ // 这些服务不影响首屏渲染,可以在空闲时初始化
160
+ /**
161
+ * 延迟初始化非关键服务
162
+ * 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化
163
+ */ const initializeNonCriticalServices = async ()=>{
164
+ const nonCriticalStartTime = performance.now();
165
+ // 使用 requestIdleCallback 在浏览器空闲时初始化非关键服务
166
+ // 如果不支持 requestIdleCallback,则使用 setTimeout 延迟执行
167
+ const scheduleInit = (callback)=>{
168
+ if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {
169
+ window.requestIdleCallback(callback, {
170
+ timeout: 5000
171
+ });
172
+ } else {
173
+ setTimeout(callback, 100);
174
+ }
175
+ };
176
+ return new Promise((resolve)=>{
177
+ scheduleInit(async ()=>{
178
+ try {
179
+ // 1. 分析服务(可选,非关键)
180
+ if (options.analytics) {
181
+ try {
182
+ await withRetry(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../utils/analytics"))).then(({ initAnalytics })=>{
183
+ initAnalytics(options.analytics);
184
+ return true;
185
+ }), retryConfig, '分析服务');
186
+ _utils.logger.debug('分析服务初始化完成');
187
+ } catch (error) {
188
+ _utils.logger.warn('分析服务初始化失败(不影响应用运行):', error);
189
+ }
190
+ }
191
+ // 2. 运行时安全服务(可选,非关键)
192
+ if (options.runtimeSecurity) {
193
+ try {
194
+ await withRetry(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../utils/runtimeSecurity"))).then(({ RuntimeSecurity })=>{
195
+ RuntimeSecurity.initialize(options.runtimeSecurity);
196
+ return true;
197
+ }), retryConfig, '运行时安全服务');
198
+ _utils.logger.debug('运行时安全服务初始化完成');
199
+ } catch (error) {
200
+ _utils.logger.warn('运行时安全服务初始化失败(不影响应用运行):', error);
201
+ }
202
+ }
203
+ const nonCriticalDuration = performance.now() - nonCriticalStartTime;
204
+ _utils.logger.debug(`非关键服务初始化完成,耗时: ${nonCriticalDuration.toFixed(2)}ms`);
205
+ } catch (error) {
206
+ _utils.logger.warn('非关键服务初始化过程中出现错误:', error);
207
+ } finally{
208
+ resolve();
209
+ }
210
+ });
211
+ });
212
+ };
213
+ // 记录关键服务初始化性能指标
170
214
  if (monitoring.reportPerformance) {
171
215
  monitoring.reportPerformance({
172
- serviceInitDuration: duration
216
+ serviceInitDuration: criticalServicesDuration
173
217
  });
174
218
  }
175
219
  return {
176
220
  monitoring,
177
221
  performanceMonitor,
178
222
  stateManager,
179
- eventBus
223
+ eventBus,
224
+ initializeNonCriticalServices
180
225
  };
181
226
  }
182
227
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/startup/initializeServices.ts"],"sourcesContent":["/**\n * 服务初始化模块\n * 负责初始化框架所需的各种服务\n */\n\nimport { logger } from '../../utils';\nimport { initMonitoring } from '../../utils/monitoring';\nimport type { MonitoringService } from '../../utils/monitoring';\nimport { PerformanceMonitor } from '../../utils/performance';\nimport { storage } from '../../library';\nimport { StateManager } from '../../state';\nimport type { StartOptions } from '../types';\nimport { AppEventBus } from '../event/AppEventBus';\nimport type { AppEventBusConfig } from '../event/types';\n\n/**\n * 重试配置\n */\nexport interface RetryConfig {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n}\n\n/**\n * 服务初始化结果\n */\nexport interface ServicesInitResult {\n /**\n * 监控服务实例\n */\n monitoring: MonitoringService;\n\n /**\n * 性能监控实例\n */\n performanceMonitor: PerformanceMonitor;\n\n /**\n * 状态管理器实例\n */\n stateManager: StateManager;\n\n /**\n * 事件总线实例\n */\n eventBus: AppEventBus;\n}\n\n/**\n * 带重试的异步函数执行器\n */\nasync function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig = {},\n serviceName: string\n): Promise<T> {\n const maxRetries = config.maxRetries ?? 3;\n const retryDelay = config.retryDelay ?? 1000;\n const exponentialBackoff = config.exponentialBackoff ?? true;\n\n let lastError: unknown;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n \n if (attempt < maxRetries) {\n const delay = exponentialBackoff \n ? retryDelay * Math.pow(2, attempt)\n : retryDelay;\n \n logger.warn(\n `${serviceName} 初始化失败(尝试 ${attempt + 1}/${maxRetries + 1}),${delay}ms 后重试...`,\n error\n );\n \n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n \n logger.error(`${serviceName} 初始化失败,已重试 ${maxRetries} 次`);\n throw lastError;\n}\n\n/**\n * 初始化所有服务\n * \n * 优化:\n * 1. 完全并行初始化所有不相互依赖的服务,提高启动速度\n * 2. 实现服务初始化失败重试机制,提高启动成功率\n * \n * @param options - 启动配置选项\n * @returns 服务初始化结果\n */\nexport async function initializeServices(\n options: StartOptions = {}\n): Promise<ServicesInitResult> {\n const startTime = performance.now();\n \n // 重试配置\n const retryConfig: RetryConfig = {\n maxRetries: options.serviceRetry?.maxRetries ?? 3,\n retryDelay: options.serviceRetry?.retryDelay ?? 1000,\n exponentialBackoff: options.serviceRetry?.exponentialBackoff ?? true,\n };\n\n // 优化:完全并行初始化所有不相互依赖的服务\n // 1. 监控服务(必须最先初始化,因为其他服务可能依赖它)\n const monitoringPromise = withRetry(\n () => Promise.resolve(initMonitoring({\n ...options.errorMonitor,\n onError: (error) => {\n logger.error('监控服务捕获到错误:', error);\n options.errorMonitor?.onError?.(error);\n },\n })),\n retryConfig,\n '监控服务'\n );\n\n // 2. 存储服务(独立,可并行)\n const storagePromise = withRetry(\n () => Promise.resolve().then(() => {\n storage.initialize(options.storageOptions);\n return storage;\n }),\n retryConfig,\n '存储服务'\n );\n\n // 3. 状态管理器(独立,可并行)\n const stateManagerPromise = withRetry(\n () => Promise.resolve().then(() => {\n if (options.stateManager !== undefined) {\n return new StateManager(options.stateManager);\n } else {\n // 默认初始化状态管理器\n return new StateManager({\n enableRegistry: true,\n defaultScope: 'app',\n });\n }\n }),\n retryConfig,\n '状态管理器'\n );\n\n // 4. 事件总线(独立,可并行)\n const eventBusPromise = withRetry(\n () => Promise.resolve().then(() => {\n const eventBusConfig: AppEventBusConfig = {\n enableTracking: options.eventBus?.enableTracking ?? (process.env.NODE_ENV === 'development'),\n maxHistorySize: options.eventBus?.maxHistorySize ?? 100,\n enableValidation: options.eventBus?.enableValidation ?? false,\n enablePerformanceMonitoring: options.eventBus?.enablePerformanceMonitoring ?? (process.env.NODE_ENV === 'development'),\n namespacePrefix: options.eventBus?.namespacePrefix,\n instanceId: options.eventBus?.instanceId,\n enableSecurityMode: options.eventBus?.enableSecurityMode ?? false,\n allowedSources: options.eventBus?.allowedSources,\n };\n return new AppEventBus(eventBusConfig);\n }),\n retryConfig,\n '事件总线'\n );\n\n // 5. 分析服务(可选,动态导入)\n const analyticsPromise = options.analytics\n ? withRetry(\n () => import('../../utils/analytics').then(({ initAnalytics }) => {\n initAnalytics(options.analytics!);\n return true;\n }),\n retryConfig,\n '分析服务'\n )\n : Promise.resolve(false);\n\n // 6. 运行时安全(可选,动态导入)\n const runtimeSecurityPromise = options.runtimeSecurity\n ? withRetry(\n () => import('../../utils/runtimeSecurity').then(({ RuntimeSecurity }) => {\n RuntimeSecurity.initialize(options.runtimeSecurity!);\n return true;\n }),\n retryConfig,\n '运行时安全服务'\n )\n : Promise.resolve(false);\n\n // 并行执行所有初始化任务\n const [monitoring, , stateManager, eventBus] = await Promise.all([\n monitoringPromise,\n storagePromise,\n stateManagerPromise,\n eventBusPromise,\n analyticsPromise,\n runtimeSecurityPromise,\n ]);\n\n logger.info('状态管理器初始化完成');\n\n // 初始化性能监控(依赖监控服务,必须在监控服务初始化后)\n const performanceMonitor = new PerformanceMonitor({\n ...options.performanceMonitor,\n onReport: (metrics) => {\n monitoring.reportPerformance(metrics);\n options.performanceMonitor?.onReport?.(metrics);\n },\n });\n\n // 在页面卸载时清理性能监控\n if (typeof window !== 'undefined') {\n const cleanupHandler = () => {\n performanceMonitor.disconnect();\n window.removeEventListener('beforeunload', cleanupHandler);\n };\n window.addEventListener('beforeunload', cleanupHandler);\n }\n\n const duration = performance.now() - startTime;\n logger.debug(`服务初始化完成,耗时: ${duration.toFixed(2)}ms`);\n\n // 记录性能指标\n if (monitoring.reportPerformance) {\n monitoring.reportPerformance({\n serviceInitDuration: duration,\n } as any);\n }\n\n return {\n monitoring,\n performanceMonitor,\n stateManager,\n eventBus,\n };\n}\n"],"names":["initializeServices","withRetry","fn","config","serviceName","maxRetries","retryDelay","exponentialBackoff","lastError","attempt","error","delay","Math","pow","logger","warn","Promise","resolve","setTimeout","options","startTime","performance","now","retryConfig","serviceRetry","monitoringPromise","initMonitoring","errorMonitor","onError","storagePromise","then","storage","initialize","storageOptions","stateManagerPromise","stateManager","undefined","StateManager","enableRegistry","defaultScope","eventBusPromise","eventBusConfig","enableTracking","eventBus","process","env","NODE_ENV","maxHistorySize","enableValidation","enablePerformanceMonitoring","namespacePrefix","instanceId","enableSecurityMode","allowedSources","AppEventBus","analyticsPromise","analytics","initAnalytics","runtimeSecurityPromise","runtimeSecurity","RuntimeSecurity","monitoring","all","info","performanceMonitor","PerformanceMonitor","onReport","metrics","reportPerformance","window","cleanupHandler","disconnect","removeEventListener","addEventListener","duration","debug","toFixed","serviceInitDuration"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/startup/initializeServices.ts"],"sourcesContent":["/**\n * 服务初始化模块\n * 负责初始化框架所需的各种服务\n */\n\nimport { logger } from '../../utils';\nimport { initMonitoring } from '../../utils/monitoring';\nimport type { MonitoringService } from '../../utils/monitoring';\nimport { PerformanceMonitor } from '../../utils/performance';\nimport { storage } from '../../library';\nimport { StateManager } from '../../state';\nimport type { StartOptions } from '../types';\nimport { AppEventBus } from '../event/AppEventBus';\nimport type { AppEventBusConfig } from '../event/types';\n\n/**\n * 重试配置\n */\nexport interface RetryConfig {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n}\n\n/**\n * 服务初始化结果\n */\nexport interface ServicesInitResult {\n /**\n * 监控服务实例\n */\n monitoring: MonitoringService;\n\n /**\n * 性能监控实例\n */\n performanceMonitor: PerformanceMonitor;\n\n /**\n * 状态管理器实例\n */\n stateManager: StateManager;\n\n /**\n * 事件总线实例\n */\n eventBus: AppEventBus;\n\n /**\n * 延迟初始化非关键服务的函数\n * 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化\n */\n initializeNonCriticalServices?: () => Promise<void>;\n}\n\n/**\n * 带重试的异步函数执行器\n */\nasync function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig = {},\n serviceName: string\n): Promise<T> {\n const maxRetries = config.maxRetries ?? 3;\n const retryDelay = config.retryDelay ?? 1000;\n const exponentialBackoff = config.exponentialBackoff ?? true;\n\n let lastError: unknown;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n \n if (attempt < maxRetries) {\n const delay = exponentialBackoff \n ? retryDelay * Math.pow(2, attempt)\n : retryDelay;\n \n logger.warn(\n `${serviceName} 初始化失败(尝试 ${attempt + 1}/${maxRetries + 1}),${delay}ms 后重试...`,\n error\n );\n \n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n \n logger.error(`${serviceName} 初始化失败,已重试 ${maxRetries} 次`);\n throw lastError;\n}\n\n/**\n * 初始化所有服务\n * \n * 优化:\n * 1. 区分关键服务和非关键服务\n * 2. 关键服务并行初始化,缩短首屏时间\n * 3. 非关键服务延迟到应用渲染后初始化,使用 requestIdleCallback 在空闲时初始化\n * 4. 实现服务初始化失败重试机制,提高启动成功率\n * \n * @param options - 启动配置选项\n * @returns 服务初始化结果\n */\nexport async function initializeServices(\n options: StartOptions = {}\n): Promise<ServicesInitResult> {\n const startTime = performance.now();\n \n // 重试配置\n const retryConfig: RetryConfig = {\n maxRetries: options.serviceRetry?.maxRetries ?? 3,\n retryDelay: options.serviceRetry?.retryDelay ?? 1000,\n exponentialBackoff: options.serviceRetry?.exponentialBackoff ?? true,\n };\n\n // ========== 关键服务:必须在应用渲染前初始化 ==========\n // 这些服务是应用运行的基础,必须并行初始化完成\n\n // 1. 监控服务(必须最先初始化,因为其他服务可能依赖它)\n const monitoringPromise = withRetry(\n () => Promise.resolve(initMonitoring({\n ...options.errorMonitor,\n onError: (error) => {\n logger.error('监控服务捕获到错误:', error);\n options.errorMonitor?.onError?.(error);\n },\n })),\n retryConfig,\n '监控服务'\n );\n\n // 2. 存储服务(关键服务,应用可能需要立即使用存储)\n const storagePromise = withRetry(\n () => Promise.resolve().then(() => {\n storage.initialize(options.storageOptions);\n return storage;\n }),\n retryConfig,\n '存储服务'\n );\n\n // 3. 状态管理器(关键服务,应用状态管理的基础)\n const stateManagerPromise = withRetry(\n () => Promise.resolve().then(() => {\n if (options.stateManager !== undefined) {\n return new StateManager(options.stateManager);\n } else {\n // 默认初始化状态管理器\n return new StateManager({\n enableRegistry: true,\n defaultScope: 'app',\n });\n }\n }),\n retryConfig,\n '状态管理器'\n );\n\n // 4. 事件总线(关键服务,用于应用内部通信)\n const eventBusPromise = withRetry(\n () => Promise.resolve().then(() => {\n const eventBusConfig: AppEventBusConfig = {\n enableTracking: options.eventBus?.enableTracking ?? (process.env.NODE_ENV === 'development'),\n maxHistorySize: options.eventBus?.maxHistorySize ?? 100,\n enableValidation: options.eventBus?.enableValidation ?? false,\n enablePerformanceMonitoring: options.eventBus?.enablePerformanceMonitoring ?? (process.env.NODE_ENV === 'development'),\n namespacePrefix: options.eventBus?.namespacePrefix,\n instanceId: options.eventBus?.instanceId,\n enableSecurityMode: options.eventBus?.enableSecurityMode ?? false,\n allowedSources: options.eventBus?.allowedSources,\n };\n return new AppEventBus(eventBusConfig);\n }),\n retryConfig,\n '事件总线'\n );\n\n // 并行执行关键服务初始化\n const [monitoring, , stateManager, eventBus] = await Promise.all([\n monitoringPromise,\n storagePromise,\n stateManagerPromise,\n eventBusPromise,\n ]);\n\n logger.info('关键服务初始化完成');\n\n // 初始化性能监控(依赖监控服务,必须在监控服务初始化后)\n const performanceMonitor = new PerformanceMonitor({\n ...options.performanceMonitor,\n onReport: (metrics) => {\n monitoring.reportPerformance(metrics);\n options.performanceMonitor?.onReport?.(metrics);\n },\n });\n\n // 在页面卸载时清理性能监控\n if (typeof window !== 'undefined') {\n const cleanupHandler = () => {\n performanceMonitor.disconnect();\n window.removeEventListener('beforeunload', cleanupHandler);\n };\n window.addEventListener('beforeunload', cleanupHandler);\n }\n\n const criticalServicesDuration = performance.now() - startTime;\n logger.debug(`关键服务初始化完成,耗时: ${criticalServicesDuration.toFixed(2)}ms`);\n\n // ========== 非关键服务:延迟到应用渲染后初始化 ==========\n // 这些服务不影响首屏渲染,可以在空闲时初始化\n\n /**\n * 延迟初始化非关键服务\n * 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化\n */\n const initializeNonCriticalServices = async (): Promise<void> => {\n const nonCriticalStartTime = performance.now();\n \n // 使用 requestIdleCallback 在浏览器空闲时初始化非关键服务\n // 如果不支持 requestIdleCallback,则使用 setTimeout 延迟执行\n const scheduleInit = (callback: () => void) => {\n if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {\n window.requestIdleCallback(callback, { timeout: 5000 });\n } else {\n setTimeout(callback, 100);\n }\n };\n\n return new Promise<void>((resolve) => {\n scheduleInit(async () => {\n try {\n // 1. 分析服务(可选,非关键)\n if (options.analytics) {\n try {\n await withRetry(\n () => import('../../utils/analytics').then(({ initAnalytics }) => {\n initAnalytics(options.analytics!);\n return true;\n }),\n retryConfig,\n '分析服务'\n );\n logger.debug('分析服务初始化完成');\n } catch (error) {\n logger.warn('分析服务初始化失败(不影响应用运行):', error);\n }\n }\n\n // 2. 运行时安全服务(可选,非关键)\n if (options.runtimeSecurity) {\n try {\n await withRetry(\n () => import('../../utils/runtimeSecurity').then(({ RuntimeSecurity }) => {\n RuntimeSecurity.initialize(options.runtimeSecurity!);\n return true;\n }),\n retryConfig,\n '运行时安全服务'\n );\n logger.debug('运行时安全服务初始化完成');\n } catch (error) {\n logger.warn('运行时安全服务初始化失败(不影响应用运行):', error);\n }\n }\n\n const nonCriticalDuration = performance.now() - nonCriticalStartTime;\n logger.debug(`非关键服务初始化完成,耗时: ${nonCriticalDuration.toFixed(2)}ms`);\n } catch (error) {\n logger.warn('非关键服务初始化过程中出现错误:', error);\n } finally {\n resolve();\n }\n });\n });\n };\n\n // 记录关键服务初始化性能指标\n if (monitoring.reportPerformance) {\n monitoring.reportPerformance({\n serviceInitDuration: criticalServicesDuration,\n } as any);\n }\n\n return {\n monitoring,\n performanceMonitor,\n stateManager,\n eventBus,\n initializeNonCriticalServices,\n };\n}\n"],"names":["initializeServices","withRetry","fn","config","serviceName","maxRetries","retryDelay","exponentialBackoff","lastError","attempt","error","delay","Math","pow","logger","warn","Promise","resolve","setTimeout","options","startTime","performance","now","retryConfig","serviceRetry","monitoringPromise","initMonitoring","errorMonitor","onError","storagePromise","then","storage","initialize","storageOptions","stateManagerPromise","stateManager","undefined","StateManager","enableRegistry","defaultScope","eventBusPromise","eventBusConfig","enableTracking","eventBus","process","env","NODE_ENV","maxHistorySize","enableValidation","enablePerformanceMonitoring","namespacePrefix","instanceId","enableSecurityMode","allowedSources","AppEventBus","monitoring","all","info","performanceMonitor","PerformanceMonitor","onReport","metrics","reportPerformance","window","cleanupHandler","disconnect","removeEventListener","addEventListener","criticalServicesDuration","debug","toFixed","initializeNonCriticalServices","nonCriticalStartTime","scheduleInit","callback","requestIdleCallback","timeout","analytics","initAnalytics","runtimeSecurity","RuntimeSecurity","nonCriticalDuration","serviceInitDuration"],"mappings":"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"}
@@ -47,13 +47,20 @@ export interface ServicesInitResult {
47
47
  * 事件总线实例
48
48
  */
49
49
  eventBus: AppEventBus;
50
+ /**
51
+ * 延迟初始化非关键服务的函数
52
+ * 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化
53
+ */
54
+ initializeNonCriticalServices?: () => Promise<void>;
50
55
  }
51
56
  /**
52
57
  * 初始化所有服务
53
58
  *
54
59
  * 优化:
55
- * 1. 完全并行初始化所有不相互依赖的服务,提高启动速度
56
- * 2. 实现服务初始化失败重试机制,提高启动成功率
60
+ * 1. 区分关键服务和非关键服务
61
+ * 2. 关键服务并行初始化,缩短首屏时间
62
+ * 3. 非关键服务延迟到应用渲染后初始化,使用 requestIdleCallback 在空闲时初始化
63
+ * 4. 实现服务初始化失败重试机制,提高启动成功率
57
64
  *
58
65
  * @param options - 启动配置选项
59
66
  * @returns 服务初始化结果
@@ -1 +1 @@
1
- {"version":3,"file":"initializeServices.d.ts","sourceRoot":"","sources":["../../../src/core/startup/initializeServices.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,UAAU,EAAE,iBAAiB,CAAC;IAE9B;;OAEG;IACH,kBAAkB,EAAE,kBAAkB,CAAC;IAEvC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC;IAE3B;;OAEG;IACH,QAAQ,EAAE,WAAW,CAAC;CACvB;AAyCD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CA4I7B"}
1
+ {"version":3,"file":"initializeServices.d.ts","sourceRoot":"","sources":["../../../src/core/startup/initializeServices.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,UAAU,EAAE,iBAAiB,CAAC;IAE9B;;OAEG;IACH,kBAAkB,EAAE,kBAAkB,CAAC;IAEvC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC;IAE3B;;OAEG;IACH,QAAQ,EAAE,WAAW,CAAC;IAEtB;;;OAGG;IACH,6BAA6B,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAyCD;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAyL7B"}
@@ -33,8 +33,10 @@ import { AppEventBus } from "../event/AppEventBus";
33
33
  * 初始化所有服务
34
34
  *
35
35
  * 优化:
36
- * 1. 完全并行初始化所有不相互依赖的服务,提高启动速度
37
- * 2. 实现服务初始化失败重试机制,提高启动成功率
36
+ * 1. 区分关键服务和非关键服务
37
+ * 2. 关键服务并行初始化,缩短首屏时间
38
+ * 3. 非关键服务延迟到应用渲染后初始化,使用 requestIdleCallback 在空闲时初始化
39
+ * 4. 实现服务初始化失败重试机制,提高启动成功率
38
40
  *
39
41
  * @param options - 启动配置选项
40
42
  * @returns 服务初始化结果
@@ -46,7 +48,8 @@ import { AppEventBus } from "../event/AppEventBus";
46
48
  retryDelay: options.serviceRetry?.retryDelay ?? 1000,
47
49
  exponentialBackoff: options.serviceRetry?.exponentialBackoff ?? true
48
50
  };
49
- // 优化:完全并行初始化所有不相互依赖的服务
51
+ // ========== 关键服务:必须在应用渲染前初始化 ==========
52
+ // 这些服务是应用运行的基础,必须并行初始化完成
50
53
  // 1. 监控服务(必须最先初始化,因为其他服务可能依赖它)
51
54
  const monitoringPromise = withRetry(()=>Promise.resolve(initMonitoring({
52
55
  ...options.errorMonitor,
@@ -55,12 +58,12 @@ import { AppEventBus } from "../event/AppEventBus";
55
58
  options.errorMonitor?.onError?.(error);
56
59
  }
57
60
  })), retryConfig, '监控服务');
58
- // 2. 存储服务(独立,可并行)
61
+ // 2. 存储服务(关键服务,应用可能需要立即使用存储)
59
62
  const storagePromise = withRetry(()=>Promise.resolve().then(()=>{
60
63
  storage.initialize(options.storageOptions);
61
64
  return storage;
62
65
  }), retryConfig, '存储服务');
63
- // 3. 状态管理器(独立,可并行)
66
+ // 3. 状态管理器(关键服务,应用状态管理的基础)
64
67
  const stateManagerPromise = withRetry(()=>Promise.resolve().then(()=>{
65
68
  if (options.stateManager !== undefined) {
66
69
  return new StateManager(options.stateManager);
@@ -72,7 +75,7 @@ import { AppEventBus } from "../event/AppEventBus";
72
75
  });
73
76
  }
74
77
  }), retryConfig, '状态管理器');
75
- // 4. 事件总线(独立,可并行)
78
+ // 4. 事件总线(关键服务,用于应用内部通信)
76
79
  const eventBusPromise = withRetry(()=>Promise.resolve().then(()=>{
77
80
  const eventBusConfig = {
78
81
  enableTracking: options.eventBus?.enableTracking ?? process.env.NODE_ENV === 'development',
@@ -86,26 +89,14 @@ import { AppEventBus } from "../event/AppEventBus";
86
89
  };
87
90
  return new AppEventBus(eventBusConfig);
88
91
  }), retryConfig, '事件总线');
89
- // 5. 分析服务(可选,动态导入)
90
- const analyticsPromise = options.analytics ? withRetry(()=>import("../../utils/analytics").then(({ initAnalytics })=>{
91
- initAnalytics(options.analytics);
92
- return true;
93
- }), retryConfig, '分析服务') : Promise.resolve(false);
94
- // 6. 运行时安全(可选,动态导入)
95
- const runtimeSecurityPromise = options.runtimeSecurity ? withRetry(()=>import("../../utils/runtimeSecurity").then(({ RuntimeSecurity })=>{
96
- RuntimeSecurity.initialize(options.runtimeSecurity);
97
- return true;
98
- }), retryConfig, '运行时安全服务') : Promise.resolve(false);
99
- // 并行执行所有初始化任务
92
+ // 并行执行关键服务初始化
100
93
  const [monitoring, , stateManager, eventBus] = await Promise.all([
101
94
  monitoringPromise,
102
95
  storagePromise,
103
96
  stateManagerPromise,
104
- eventBusPromise,
105
- analyticsPromise,
106
- runtimeSecurityPromise
97
+ eventBusPromise
107
98
  ]);
108
- logger.info('状态管理器初始化完成');
99
+ logger.info('关键服务初始化完成');
109
100
  // 初始化性能监控(依赖监控服务,必须在监控服务初始化后)
110
101
  const performanceMonitor = new PerformanceMonitor({
111
102
  ...options.performanceMonitor,
@@ -122,19 +113,75 @@ import { AppEventBus } from "../event/AppEventBus";
122
113
  };
123
114
  window.addEventListener('beforeunload', cleanupHandler);
124
115
  }
125
- const duration = performance.now() - startTime;
126
- logger.debug(`服务初始化完成,耗时: ${duration.toFixed(2)}ms`);
127
- // 记录性能指标
116
+ const criticalServicesDuration = performance.now() - startTime;
117
+ logger.debug(`关键服务初始化完成,耗时: ${criticalServicesDuration.toFixed(2)}ms`);
118
+ // ========== 非关键服务:延迟到应用渲染后初始化 ==========
119
+ // 这些服务不影响首屏渲染,可以在空闲时初始化
120
+ /**
121
+ * 延迟初始化非关键服务
122
+ * 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化
123
+ */ const initializeNonCriticalServices = async ()=>{
124
+ const nonCriticalStartTime = performance.now();
125
+ // 使用 requestIdleCallback 在浏览器空闲时初始化非关键服务
126
+ // 如果不支持 requestIdleCallback,则使用 setTimeout 延迟执行
127
+ const scheduleInit = (callback)=>{
128
+ if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {
129
+ window.requestIdleCallback(callback, {
130
+ timeout: 5000
131
+ });
132
+ } else {
133
+ setTimeout(callback, 100);
134
+ }
135
+ };
136
+ return new Promise((resolve)=>{
137
+ scheduleInit(async ()=>{
138
+ try {
139
+ // 1. 分析服务(可选,非关键)
140
+ if (options.analytics) {
141
+ try {
142
+ await withRetry(()=>import("../../utils/analytics").then(({ initAnalytics })=>{
143
+ initAnalytics(options.analytics);
144
+ return true;
145
+ }), retryConfig, '分析服务');
146
+ logger.debug('分析服务初始化完成');
147
+ } catch (error) {
148
+ logger.warn('分析服务初始化失败(不影响应用运行):', error);
149
+ }
150
+ }
151
+ // 2. 运行时安全服务(可选,非关键)
152
+ if (options.runtimeSecurity) {
153
+ try {
154
+ await withRetry(()=>import("../../utils/runtimeSecurity").then(({ RuntimeSecurity })=>{
155
+ RuntimeSecurity.initialize(options.runtimeSecurity);
156
+ return true;
157
+ }), retryConfig, '运行时安全服务');
158
+ logger.debug('运行时安全服务初始化完成');
159
+ } catch (error) {
160
+ logger.warn('运行时安全服务初始化失败(不影响应用运行):', error);
161
+ }
162
+ }
163
+ const nonCriticalDuration = performance.now() - nonCriticalStartTime;
164
+ logger.debug(`非关键服务初始化完成,耗时: ${nonCriticalDuration.toFixed(2)}ms`);
165
+ } catch (error) {
166
+ logger.warn('非关键服务初始化过程中出现错误:', error);
167
+ } finally{
168
+ resolve();
169
+ }
170
+ });
171
+ });
172
+ };
173
+ // 记录关键服务初始化性能指标
128
174
  if (monitoring.reportPerformance) {
129
175
  monitoring.reportPerformance({
130
- serviceInitDuration: duration
176
+ serviceInitDuration: criticalServicesDuration
131
177
  });
132
178
  }
133
179
  return {
134
180
  monitoring,
135
181
  performanceMonitor,
136
182
  stateManager,
137
- eventBus
183
+ eventBus,
184
+ initializeNonCriticalServices
138
185
  };
139
186
  }
140
187
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/startup/initializeServices.ts"],"sourcesContent":["/**\n * 服务初始化模块\n * 负责初始化框架所需的各种服务\n */\n\nimport { logger } from '../../utils';\nimport { initMonitoring } from '../../utils/monitoring';\nimport type { MonitoringService } from '../../utils/monitoring';\nimport { PerformanceMonitor } from '../../utils/performance';\nimport { storage } from '../../library';\nimport { StateManager } from '../../state';\nimport type { StartOptions } from '../types';\nimport { AppEventBus } from '../event/AppEventBus';\nimport type { AppEventBusConfig } from '../event/types';\n\n/**\n * 重试配置\n */\nexport interface RetryConfig {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n}\n\n/**\n * 服务初始化结果\n */\nexport interface ServicesInitResult {\n /**\n * 监控服务实例\n */\n monitoring: MonitoringService;\n\n /**\n * 性能监控实例\n */\n performanceMonitor: PerformanceMonitor;\n\n /**\n * 状态管理器实例\n */\n stateManager: StateManager;\n\n /**\n * 事件总线实例\n */\n eventBus: AppEventBus;\n}\n\n/**\n * 带重试的异步函数执行器\n */\nasync function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig = {},\n serviceName: string\n): Promise<T> {\n const maxRetries = config.maxRetries ?? 3;\n const retryDelay = config.retryDelay ?? 1000;\n const exponentialBackoff = config.exponentialBackoff ?? true;\n\n let lastError: unknown;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n \n if (attempt < maxRetries) {\n const delay = exponentialBackoff \n ? retryDelay * Math.pow(2, attempt)\n : retryDelay;\n \n logger.warn(\n `${serviceName} 初始化失败(尝试 ${attempt + 1}/${maxRetries + 1}),${delay}ms 后重试...`,\n error\n );\n \n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n \n logger.error(`${serviceName} 初始化失败,已重试 ${maxRetries} 次`);\n throw lastError;\n}\n\n/**\n * 初始化所有服务\n * \n * 优化:\n * 1. 完全并行初始化所有不相互依赖的服务,提高启动速度\n * 2. 实现服务初始化失败重试机制,提高启动成功率\n * \n * @param options - 启动配置选项\n * @returns 服务初始化结果\n */\nexport async function initializeServices(\n options: StartOptions = {}\n): Promise<ServicesInitResult> {\n const startTime = performance.now();\n \n // 重试配置\n const retryConfig: RetryConfig = {\n maxRetries: options.serviceRetry?.maxRetries ?? 3,\n retryDelay: options.serviceRetry?.retryDelay ?? 1000,\n exponentialBackoff: options.serviceRetry?.exponentialBackoff ?? true,\n };\n\n // 优化:完全并行初始化所有不相互依赖的服务\n // 1. 监控服务(必须最先初始化,因为其他服务可能依赖它)\n const monitoringPromise = withRetry(\n () => Promise.resolve(initMonitoring({\n ...options.errorMonitor,\n onError: (error) => {\n logger.error('监控服务捕获到错误:', error);\n options.errorMonitor?.onError?.(error);\n },\n })),\n retryConfig,\n '监控服务'\n );\n\n // 2. 存储服务(独立,可并行)\n const storagePromise = withRetry(\n () => Promise.resolve().then(() => {\n storage.initialize(options.storageOptions);\n return storage;\n }),\n retryConfig,\n '存储服务'\n );\n\n // 3. 状态管理器(独立,可并行)\n const stateManagerPromise = withRetry(\n () => Promise.resolve().then(() => {\n if (options.stateManager !== undefined) {\n return new StateManager(options.stateManager);\n } else {\n // 默认初始化状态管理器\n return new StateManager({\n enableRegistry: true,\n defaultScope: 'app',\n });\n }\n }),\n retryConfig,\n '状态管理器'\n );\n\n // 4. 事件总线(独立,可并行)\n const eventBusPromise = withRetry(\n () => Promise.resolve().then(() => {\n const eventBusConfig: AppEventBusConfig = {\n enableTracking: options.eventBus?.enableTracking ?? (process.env.NODE_ENV === 'development'),\n maxHistorySize: options.eventBus?.maxHistorySize ?? 100,\n enableValidation: options.eventBus?.enableValidation ?? false,\n enablePerformanceMonitoring: options.eventBus?.enablePerformanceMonitoring ?? (process.env.NODE_ENV === 'development'),\n namespacePrefix: options.eventBus?.namespacePrefix,\n instanceId: options.eventBus?.instanceId,\n enableSecurityMode: options.eventBus?.enableSecurityMode ?? false,\n allowedSources: options.eventBus?.allowedSources,\n };\n return new AppEventBus(eventBusConfig);\n }),\n retryConfig,\n '事件总线'\n );\n\n // 5. 分析服务(可选,动态导入)\n const analyticsPromise = options.analytics\n ? withRetry(\n () => import('../../utils/analytics').then(({ initAnalytics }) => {\n initAnalytics(options.analytics!);\n return true;\n }),\n retryConfig,\n '分析服务'\n )\n : Promise.resolve(false);\n\n // 6. 运行时安全(可选,动态导入)\n const runtimeSecurityPromise = options.runtimeSecurity\n ? withRetry(\n () => import('../../utils/runtimeSecurity').then(({ RuntimeSecurity }) => {\n RuntimeSecurity.initialize(options.runtimeSecurity!);\n return true;\n }),\n retryConfig,\n '运行时安全服务'\n )\n : Promise.resolve(false);\n\n // 并行执行所有初始化任务\n const [monitoring, , stateManager, eventBus] = await Promise.all([\n monitoringPromise,\n storagePromise,\n stateManagerPromise,\n eventBusPromise,\n analyticsPromise,\n runtimeSecurityPromise,\n ]);\n\n logger.info('状态管理器初始化完成');\n\n // 初始化性能监控(依赖监控服务,必须在监控服务初始化后)\n const performanceMonitor = new PerformanceMonitor({\n ...options.performanceMonitor,\n onReport: (metrics) => {\n monitoring.reportPerformance(metrics);\n options.performanceMonitor?.onReport?.(metrics);\n },\n });\n\n // 在页面卸载时清理性能监控\n if (typeof window !== 'undefined') {\n const cleanupHandler = () => {\n performanceMonitor.disconnect();\n window.removeEventListener('beforeunload', cleanupHandler);\n };\n window.addEventListener('beforeunload', cleanupHandler);\n }\n\n const duration = performance.now() - startTime;\n logger.debug(`服务初始化完成,耗时: ${duration.toFixed(2)}ms`);\n\n // 记录性能指标\n if (monitoring.reportPerformance) {\n monitoring.reportPerformance({\n serviceInitDuration: duration,\n } as any);\n }\n\n return {\n monitoring,\n performanceMonitor,\n stateManager,\n eventBus,\n };\n}\n"],"names":["logger","initMonitoring","PerformanceMonitor","storage","StateManager","AppEventBus","withRetry","fn","config","serviceName","maxRetries","retryDelay","exponentialBackoff","lastError","attempt","error","delay","Math","pow","warn","Promise","resolve","setTimeout","initializeServices","options","startTime","performance","now","retryConfig","serviceRetry","monitoringPromise","errorMonitor","onError","storagePromise","then","initialize","storageOptions","stateManagerPromise","stateManager","undefined","enableRegistry","defaultScope","eventBusPromise","eventBusConfig","enableTracking","eventBus","process","env","NODE_ENV","maxHistorySize","enableValidation","enablePerformanceMonitoring","namespacePrefix","instanceId","enableSecurityMode","allowedSources","analyticsPromise","analytics","initAnalytics","runtimeSecurityPromise","runtimeSecurity","RuntimeSecurity","monitoring","all","info","performanceMonitor","onReport","metrics","reportPerformance","window","cleanupHandler","disconnect","removeEventListener","addEventListener","duration","debug","toFixed","serviceInitDuration"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/startup/initializeServices.ts"],"sourcesContent":["/**\n * 服务初始化模块\n * 负责初始化框架所需的各种服务\n */\n\nimport { logger } from '../../utils';\nimport { initMonitoring } from '../../utils/monitoring';\nimport type { MonitoringService } from '../../utils/monitoring';\nimport { PerformanceMonitor } from '../../utils/performance';\nimport { storage } from '../../library';\nimport { StateManager } from '../../state';\nimport type { StartOptions } from '../types';\nimport { AppEventBus } from '../event/AppEventBus';\nimport type { AppEventBusConfig } from '../event/types';\n\n/**\n * 重试配置\n */\nexport interface RetryConfig {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n}\n\n/**\n * 服务初始化结果\n */\nexport interface ServicesInitResult {\n /**\n * 监控服务实例\n */\n monitoring: MonitoringService;\n\n /**\n * 性能监控实例\n */\n performanceMonitor: PerformanceMonitor;\n\n /**\n * 状态管理器实例\n */\n stateManager: StateManager;\n\n /**\n * 事件总线实例\n */\n eventBus: AppEventBus;\n\n /**\n * 延迟初始化非关键服务的函数\n * 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化\n */\n initializeNonCriticalServices?: () => Promise<void>;\n}\n\n/**\n * 带重试的异步函数执行器\n */\nasync function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig = {},\n serviceName: string\n): Promise<T> {\n const maxRetries = config.maxRetries ?? 3;\n const retryDelay = config.retryDelay ?? 1000;\n const exponentialBackoff = config.exponentialBackoff ?? true;\n\n let lastError: unknown;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n \n if (attempt < maxRetries) {\n const delay = exponentialBackoff \n ? retryDelay * Math.pow(2, attempt)\n : retryDelay;\n \n logger.warn(\n `${serviceName} 初始化失败(尝试 ${attempt + 1}/${maxRetries + 1}),${delay}ms 后重试...`,\n error\n );\n \n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n \n logger.error(`${serviceName} 初始化失败,已重试 ${maxRetries} 次`);\n throw lastError;\n}\n\n/**\n * 初始化所有服务\n * \n * 优化:\n * 1. 区分关键服务和非关键服务\n * 2. 关键服务并行初始化,缩短首屏时间\n * 3. 非关键服务延迟到应用渲染后初始化,使用 requestIdleCallback 在空闲时初始化\n * 4. 实现服务初始化失败重试机制,提高启动成功率\n * \n * @param options - 启动配置选项\n * @returns 服务初始化结果\n */\nexport async function initializeServices(\n options: StartOptions = {}\n): Promise<ServicesInitResult> {\n const startTime = performance.now();\n \n // 重试配置\n const retryConfig: RetryConfig = {\n maxRetries: options.serviceRetry?.maxRetries ?? 3,\n retryDelay: options.serviceRetry?.retryDelay ?? 1000,\n exponentialBackoff: options.serviceRetry?.exponentialBackoff ?? true,\n };\n\n // ========== 关键服务:必须在应用渲染前初始化 ==========\n // 这些服务是应用运行的基础,必须并行初始化完成\n\n // 1. 监控服务(必须最先初始化,因为其他服务可能依赖它)\n const monitoringPromise = withRetry(\n () => Promise.resolve(initMonitoring({\n ...options.errorMonitor,\n onError: (error) => {\n logger.error('监控服务捕获到错误:', error);\n options.errorMonitor?.onError?.(error);\n },\n })),\n retryConfig,\n '监控服务'\n );\n\n // 2. 存储服务(关键服务,应用可能需要立即使用存储)\n const storagePromise = withRetry(\n () => Promise.resolve().then(() => {\n storage.initialize(options.storageOptions);\n return storage;\n }),\n retryConfig,\n '存储服务'\n );\n\n // 3. 状态管理器(关键服务,应用状态管理的基础)\n const stateManagerPromise = withRetry(\n () => Promise.resolve().then(() => {\n if (options.stateManager !== undefined) {\n return new StateManager(options.stateManager);\n } else {\n // 默认初始化状态管理器\n return new StateManager({\n enableRegistry: true,\n defaultScope: 'app',\n });\n }\n }),\n retryConfig,\n '状态管理器'\n );\n\n // 4. 事件总线(关键服务,用于应用内部通信)\n const eventBusPromise = withRetry(\n () => Promise.resolve().then(() => {\n const eventBusConfig: AppEventBusConfig = {\n enableTracking: options.eventBus?.enableTracking ?? (process.env.NODE_ENV === 'development'),\n maxHistorySize: options.eventBus?.maxHistorySize ?? 100,\n enableValidation: options.eventBus?.enableValidation ?? false,\n enablePerformanceMonitoring: options.eventBus?.enablePerformanceMonitoring ?? (process.env.NODE_ENV === 'development'),\n namespacePrefix: options.eventBus?.namespacePrefix,\n instanceId: options.eventBus?.instanceId,\n enableSecurityMode: options.eventBus?.enableSecurityMode ?? false,\n allowedSources: options.eventBus?.allowedSources,\n };\n return new AppEventBus(eventBusConfig);\n }),\n retryConfig,\n '事件总线'\n );\n\n // 并行执行关键服务初始化\n const [monitoring, , stateManager, eventBus] = await Promise.all([\n monitoringPromise,\n storagePromise,\n stateManagerPromise,\n eventBusPromise,\n ]);\n\n logger.info('关键服务初始化完成');\n\n // 初始化性能监控(依赖监控服务,必须在监控服务初始化后)\n const performanceMonitor = new PerformanceMonitor({\n ...options.performanceMonitor,\n onReport: (metrics) => {\n monitoring.reportPerformance(metrics);\n options.performanceMonitor?.onReport?.(metrics);\n },\n });\n\n // 在页面卸载时清理性能监控\n if (typeof window !== 'undefined') {\n const cleanupHandler = () => {\n performanceMonitor.disconnect();\n window.removeEventListener('beforeunload', cleanupHandler);\n };\n window.addEventListener('beforeunload', cleanupHandler);\n }\n\n const criticalServicesDuration = performance.now() - startTime;\n logger.debug(`关键服务初始化完成,耗时: ${criticalServicesDuration.toFixed(2)}ms`);\n\n // ========== 非关键服务:延迟到应用渲染后初始化 ==========\n // 这些服务不影响首屏渲染,可以在空闲时初始化\n\n /**\n * 延迟初始化非关键服务\n * 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化\n */\n const initializeNonCriticalServices = async (): Promise<void> => {\n const nonCriticalStartTime = performance.now();\n \n // 使用 requestIdleCallback 在浏览器空闲时初始化非关键服务\n // 如果不支持 requestIdleCallback,则使用 setTimeout 延迟执行\n const scheduleInit = (callback: () => void) => {\n if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {\n window.requestIdleCallback(callback, { timeout: 5000 });\n } else {\n setTimeout(callback, 100);\n }\n };\n\n return new Promise<void>((resolve) => {\n scheduleInit(async () => {\n try {\n // 1. 分析服务(可选,非关键)\n if (options.analytics) {\n try {\n await withRetry(\n () => import('../../utils/analytics').then(({ initAnalytics }) => {\n initAnalytics(options.analytics!);\n return true;\n }),\n retryConfig,\n '分析服务'\n );\n logger.debug('分析服务初始化完成');\n } catch (error) {\n logger.warn('分析服务初始化失败(不影响应用运行):', error);\n }\n }\n\n // 2. 运行时安全服务(可选,非关键)\n if (options.runtimeSecurity) {\n try {\n await withRetry(\n () => import('../../utils/runtimeSecurity').then(({ RuntimeSecurity }) => {\n RuntimeSecurity.initialize(options.runtimeSecurity!);\n return true;\n }),\n retryConfig,\n '运行时安全服务'\n );\n logger.debug('运行时安全服务初始化完成');\n } catch (error) {\n logger.warn('运行时安全服务初始化失败(不影响应用运行):', error);\n }\n }\n\n const nonCriticalDuration = performance.now() - nonCriticalStartTime;\n logger.debug(`非关键服务初始化完成,耗时: ${nonCriticalDuration.toFixed(2)}ms`);\n } catch (error) {\n logger.warn('非关键服务初始化过程中出现错误:', error);\n } finally {\n resolve();\n }\n });\n });\n };\n\n // 记录关键服务初始化性能指标\n if (monitoring.reportPerformance) {\n monitoring.reportPerformance({\n serviceInitDuration: criticalServicesDuration,\n } as any);\n }\n\n return {\n monitoring,\n performanceMonitor,\n stateManager,\n eventBus,\n initializeNonCriticalServices,\n };\n}\n"],"names":["logger","initMonitoring","PerformanceMonitor","storage","StateManager","AppEventBus","withRetry","fn","config","serviceName","maxRetries","retryDelay","exponentialBackoff","lastError","attempt","error","delay","Math","pow","warn","Promise","resolve","setTimeout","initializeServices","options","startTime","performance","now","retryConfig","serviceRetry","monitoringPromise","errorMonitor","onError","storagePromise","then","initialize","storageOptions","stateManagerPromise","stateManager","undefined","enableRegistry","defaultScope","eventBusPromise","eventBusConfig","enableTracking","eventBus","process","env","NODE_ENV","maxHistorySize","enableValidation","enablePerformanceMonitoring","namespacePrefix","instanceId","enableSecurityMode","allowedSources","monitoring","all","info","performanceMonitor","onReport","metrics","reportPerformance","window","cleanupHandler","disconnect","removeEventListener","addEventListener","criticalServicesDuration","debug","toFixed","initializeNonCriticalServices","nonCriticalStartTime","scheduleInit","callback","requestIdleCallback","timeout","analytics","initAnalytics","runtimeSecurity","RuntimeSecurity","nonCriticalDuration","serviceInitDuration"],"mappings":"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"}