@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.
- package/README.md +35 -1
- package/dist/core/config/ConfigLoader.cjs +90 -8
- package/dist/core/config/ConfigLoader.cjs.map +1 -1
- package/dist/core/config/ConfigLoader.d.ts +20 -4
- package/dist/core/config/ConfigLoader.d.ts.map +1 -1
- package/dist/core/config/ConfigLoader.js +90 -8
- package/dist/core/config/ConfigLoader.js.map +1 -1
- package/dist/core/error/ErrorBoundary.cjs +23 -9
- package/dist/core/error/ErrorBoundary.cjs.map +1 -1
- package/dist/core/error/ErrorBoundary.d.ts.map +1 -1
- package/dist/core/error/ErrorBoundary.js +23 -9
- package/dist/core/error/ErrorBoundary.js.map +1 -1
- package/dist/core/error/ErrorHandler.cjs +277 -0
- package/dist/core/error/ErrorHandler.cjs.map +1 -0
- package/dist/core/error/ErrorHandler.d.ts +172 -0
- package/dist/core/error/ErrorHandler.d.ts.map +1 -0
- package/dist/core/error/ErrorHandler.js +261 -0
- package/dist/core/error/ErrorHandler.js.map +1 -0
- package/dist/core/error/index.cjs +10 -0
- package/dist/core/error/index.cjs.map +1 -1
- package/dist/core/error/index.d.ts +2 -0
- package/dist/core/error/index.d.ts.map +1 -1
- package/dist/core/error/index.js +1 -0
- package/dist/core/error/index.js.map +1 -1
- package/dist/core/startup/initializeServices.cjs +69 -24
- package/dist/core/startup/initializeServices.cjs.map +1 -1
- package/dist/core/startup/initializeServices.d.ts +9 -2
- package/dist/core/startup/initializeServices.d.ts.map +1 -1
- package/dist/core/startup/initializeServices.js +73 -26
- package/dist/core/startup/initializeServices.js.map +1 -1
- package/dist/core/startup/renderApp.cjs +100 -61
- package/dist/core/startup/renderApp.cjs.map +1 -1
- package/dist/core/startup/renderApp.d.ts +2 -2
- package/dist/core/startup/renderApp.d.ts.map +1 -1
- package/dist/core/startup/renderApp.js +101 -62
- package/dist/core/startup/renderApp.js.map +1 -1
- package/dist/core/startup/startApp.cjs +7 -0
- package/dist/core/startup/startApp.cjs.map +1 -1
- package/dist/core/startup/startApp.d.ts.map +1 -1
- package/dist/core/startup/startApp.js +7 -0
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/index.umd.js +32434 -39284
- package/dist/index.umd.js.map +1 -1
- 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
|
-
//
|
|
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
|
|
168
|
-
_utils.logger.debug(
|
|
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:
|
|
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;
|
|
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
|
-
//
|
|
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
|
|
126
|
-
logger.debug(
|
|
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:
|
|
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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"}
|