@vlian/framework 1.0.1 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/event/AppEventBus.cjs +446 -0
- package/dist/core/event/AppEventBus.cjs.map +1 -0
- package/dist/core/event/AppEventBus.d.ts +179 -0
- package/dist/core/event/AppEventBus.d.ts.map +1 -0
- package/dist/core/event/AppEventBus.js +438 -0
- package/dist/core/event/AppEventBus.js.map +1 -0
- package/dist/core/event/frameworkEvents.cjs +143 -0
- package/dist/core/event/frameworkEvents.cjs.map +1 -0
- package/dist/core/event/frameworkEvents.d.ts +70 -0
- package/dist/core/event/frameworkEvents.d.ts.map +1 -0
- package/dist/core/event/frameworkEvents.js +135 -0
- package/dist/core/event/frameworkEvents.js.map +1 -0
- package/dist/core/event/hooks.cjs +71 -0
- package/dist/core/event/hooks.cjs.map +1 -0
- package/dist/core/event/hooks.d.ts +58 -0
- package/dist/core/event/hooks.d.ts.map +1 -0
- package/dist/core/event/hooks.js +95 -0
- package/dist/core/event/hooks.js.map +1 -0
- package/dist/core/event/index.cjs +43 -0
- package/dist/core/event/index.cjs.map +1 -0
- package/dist/core/event/index.d.ts +11 -0
- package/dist/core/event/index.d.ts.map +1 -0
- package/dist/core/event/index.js +10 -0
- package/dist/core/event/index.js.map +1 -0
- package/dist/core/event/types.cjs +64 -0
- package/dist/core/event/types.cjs.map +1 -0
- package/dist/core/event/types.d.ts +270 -0
- package/dist/core/event/types.d.ts.map +1 -0
- package/dist/core/event/types.js +56 -0
- package/dist/core/event/types.js.map +1 -0
- package/dist/core/event/useEventBus.cjs +27 -0
- package/dist/core/event/useEventBus.cjs.map +1 -0
- package/dist/core/event/useEventBus.d.ts +29 -0
- package/dist/core/event/useEventBus.d.ts.map +1 -0
- package/dist/core/event/useEventBus.js +39 -0
- package/dist/core/event/useEventBus.js.map +1 -0
- package/dist/core/index.cjs +1 -0
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/startup/AppInstance.cjs +8 -0
- package/dist/core/startup/AppInstance.cjs.map +1 -1
- package/dist/core/startup/AppInstance.d.ts +4 -0
- package/dist/core/startup/AppInstance.d.ts.map +1 -1
- package/dist/core/startup/AppInstance.js +8 -0
- package/dist/core/startup/AppInstance.js.map +1 -1
- package/dist/core/startup/initializeServices.cjs +21 -4
- package/dist/core/startup/initializeServices.cjs.map +1 -1
- package/dist/core/startup/initializeServices.d.ts +5 -0
- package/dist/core/startup/initializeServices.d.ts.map +1 -1
- package/dist/core/startup/initializeServices.js +21 -4
- package/dist/core/startup/initializeServices.js.map +1 -1
- package/dist/core/startup/startApp.cjs +59 -1
- 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 +59 -1
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/core/types.d.ts +31 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/package.json +2 -3
|
@@ -59,6 +59,14 @@ import { PerformanceTracker } from "./performanceTracker";
|
|
|
59
59
|
return this.performanceTracker;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
|
+
* 获取事件总线
|
|
63
|
+
*/ getEventBus() {
|
|
64
|
+
if (!this.services) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
return this.services.eventBus;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
62
70
|
* 获取启动配置
|
|
63
71
|
*/ getOptions() {
|
|
64
72
|
return this.options;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/startup/AppInstance.ts"],"sourcesContent":["/**\n * 应用实例管理模块\n * 支持多实例隔离\n */\n\nimport type { Container } from 'react-dom/client';\nimport type { StartOptions } from '../types';\nimport { AppRenderer } from './renderApp';\nimport type { ServicesInitResult } from './initializeServices';\nimport { PerformanceTracker } from './performanceTracker';\n\n/**\n * 应用实例\n */\nexport class AppInstance {\n /**\n * 实例ID\n */\n readonly id: string;\n\n /**\n * 应用渲染器\n */\n private renderer: AppRenderer;\n\n /**\n * 服务实例\n */\n private services: ServicesInitResult | null = null;\n\n /**\n * 性能追踪器\n */\n private performanceTracker: PerformanceTracker | null = null;\n\n /**\n * 启动配置\n */\n private options: StartOptions;\n\n /**\n * 是否已初始化\n */\n private initialized = false;\n\n /**\n * 是否已销毁\n */\n private destroyed = false;\n\n constructor(id: string, options: StartOptions) {\n this.id = id;\n this.options = options;\n this.renderer = new AppRenderer();\n }\n\n /**\n * 初始化应用实例\n * \n * @param container - React应用的挂载容器\n * @param services - 服务实例\n */\n initialize(container: Container, services: ServicesInitResult): void {\n if (this.initialized) {\n throw new Error(`应用实例 ${this.id} 已经初始化`);\n }\n\n if (this.destroyed) {\n throw new Error(`应用实例 ${this.id} 已销毁,无法重新初始化`);\n }\n\n this.services = services;\n this.renderer.initialize(container, this.options.rootOptions);\n this.performanceTracker = new PerformanceTracker(services.monitoring);\n this.performanceTracker.collectWebVitals();\n this.initialized = true;\n }\n\n /**\n * 获取渲染器\n */\n getRenderer(): AppRenderer {\n if (!this.initialized) {\n throw new Error(`应用实例 ${this.id} 未初始化`);\n }\n return this.renderer;\n }\n\n /**\n * 获取服务实例\n */\n getServices(): ServicesInitResult {\n if (!this.services) {\n throw new Error(`应用实例 ${this.id} 未初始化`);\n }\n return this.services;\n }\n\n /**\n * 获取性能追踪器\n */\n getPerformanceTracker(): PerformanceTracker | null {\n return this.performanceTracker;\n }\n\n /**\n * 获取启动配置\n */\n getOptions(): StartOptions {\n return this.options;\n }\n\n /**\n * 是否已初始化\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 是否已销毁\n */\n isDestroyed(): boolean {\n return this.destroyed;\n }\n\n /**\n * 销毁应用实例\n */\n destroy(): void {\n if (this.destroyed) {\n return;\n }\n\n this.renderer.destroy();\n this.services = null;\n this.performanceTracker = null;\n this.destroyed = true;\n }\n}\n\n/**\n * 应用实例管理器\n */\nexport class AppInstanceManager {\n private static instance: AppInstanceManager | null = null;\n private instances: Map<string, AppInstance> = new Map();\n private defaultInstanceId: string | null = null;\n\n private constructor() {\n // 私有构造函数\n }\n\n /**\n * 获取单例实例\n */\n static getInstance(): AppInstanceManager {\n if (!AppInstanceManager.instance) {\n AppInstanceManager.instance = new AppInstanceManager();\n }\n return AppInstanceManager.instance;\n }\n\n /**\n * 创建应用实例\n * \n * @param id - 实例ID,如果不提供则自动生成\n * @param options - 启动配置选项\n * @returns 应用实例\n */\n createInstance(id?: string, options: StartOptions = {}): AppInstance {\n const instanceId = id || `app-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n \n if (this.instances.has(instanceId)) {\n throw new Error(`应用实例 ${instanceId} 已存在`);\n }\n\n const instance = new AppInstance(instanceId, options);\n this.instances.set(instanceId, instance);\n\n // 如果没有默认实例,设置为默认实例\n if (!this.defaultInstanceId) {\n this.defaultInstanceId = instanceId;\n }\n\n return instance;\n }\n\n /**\n * 获取应用实例\n * \n * @param id - 实例ID,如果不提供则返回默认实例\n * @returns 应用实例或undefined\n */\n getInstance(id?: string): AppInstance | undefined {\n const instanceId = id || this.defaultInstanceId;\n if (!instanceId) {\n return undefined;\n }\n return this.instances.get(instanceId);\n }\n\n /**\n * 销毁应用实例\n * \n * @param id - 实例ID,如果不提供则销毁默认实例\n */\n destroyInstance(id?: string): void {\n const instanceId = id || this.defaultInstanceId;\n if (!instanceId) {\n return;\n }\n\n const instance = this.instances.get(instanceId);\n if (instance) {\n instance.destroy();\n this.instances.delete(instanceId);\n\n // 如果销毁的是默认实例,重新设置默认实例\n if (this.defaultInstanceId === instanceId) {\n const remainingInstances = Array.from(this.instances.keys());\n this.defaultInstanceId = remainingInstances.length > 0 ? remainingInstances[0] : null;\n }\n }\n }\n\n /**\n * 获取所有实例\n */\n getAllInstances(): AppInstance[] {\n return Array.from(this.instances.values());\n }\n\n /**\n * 设置默认实例\n * \n * @param id - 实例ID\n */\n setDefaultInstance(id: string): void {\n if (!this.instances.has(id)) {\n throw new Error(`应用实例 ${id} 不存在`);\n }\n this.defaultInstanceId = id;\n }\n\n /**\n * 获取默认实例ID\n */\n getDefaultInstanceId(): string | null {\n return this.defaultInstanceId;\n }\n\n /**\n * 清空所有实例\n */\n clear(): void {\n for (const instance of this.instances.values()) {\n instance.destroy();\n }\n this.instances.clear();\n this.defaultInstanceId = null;\n }\n}\n\n/**\n * 获取应用实例管理器\n */\nexport function getAppInstanceManager(): AppInstanceManager {\n return AppInstanceManager.getInstance();\n}\n"],"names":["AppRenderer","PerformanceTracker","AppInstance","initialize","container","services","initialized","Error","id","destroyed","renderer","options","rootOptions","performanceTracker","monitoring","collectWebVitals","getRenderer","getServices","getPerformanceTracker","getOptions","isInitialized","isDestroyed","destroy","AppInstanceManager","getInstance","instance","createInstance","instanceId","Date","now","Math","random","toString","substr","instances","has","set","defaultInstanceId","undefined","get","destroyInstance","delete","remainingInstances","Array","from","keys","length","getAllInstances","values","setDefaultInstance","getDefaultInstanceId","clear","Map","getAppInstanceManager"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/startup/AppInstance.ts"],"sourcesContent":["/**\n * 应用实例管理模块\n * 支持多实例隔离\n */\n\nimport type { Container } from 'react-dom/client';\nimport type { StartOptions } from '../types';\nimport { AppRenderer } from './renderApp';\nimport type { ServicesInitResult } from './initializeServices';\nimport { PerformanceTracker } from './performanceTracker';\n\n/**\n * 应用实例\n */\nexport class AppInstance {\n /**\n * 实例ID\n */\n readonly id: string;\n\n /**\n * 应用渲染器\n */\n private renderer: AppRenderer;\n\n /**\n * 服务实例\n */\n private services: ServicesInitResult | null = null;\n\n /**\n * 性能追踪器\n */\n private performanceTracker: PerformanceTracker | null = null;\n\n /**\n * 启动配置\n */\n private options: StartOptions;\n\n /**\n * 是否已初始化\n */\n private initialized = false;\n\n /**\n * 是否已销毁\n */\n private destroyed = false;\n\n constructor(id: string, options: StartOptions) {\n this.id = id;\n this.options = options;\n this.renderer = new AppRenderer();\n }\n\n /**\n * 初始化应用实例\n * \n * @param container - React应用的挂载容器\n * @param services - 服务实例\n */\n initialize(container: Container, services: ServicesInitResult): void {\n if (this.initialized) {\n throw new Error(`应用实例 ${this.id} 已经初始化`);\n }\n\n if (this.destroyed) {\n throw new Error(`应用实例 ${this.id} 已销毁,无法重新初始化`);\n }\n\n this.services = services;\n this.renderer.initialize(container, this.options.rootOptions);\n this.performanceTracker = new PerformanceTracker(services.monitoring);\n this.performanceTracker.collectWebVitals();\n this.initialized = true;\n }\n\n /**\n * 获取渲染器\n */\n getRenderer(): AppRenderer {\n if (!this.initialized) {\n throw new Error(`应用实例 ${this.id} 未初始化`);\n }\n return this.renderer;\n }\n\n /**\n * 获取服务实例\n */\n getServices(): ServicesInitResult {\n if (!this.services) {\n throw new Error(`应用实例 ${this.id} 未初始化`);\n }\n return this.services;\n }\n\n /**\n * 获取性能追踪器\n */\n getPerformanceTracker(): PerformanceTracker | null {\n return this.performanceTracker;\n }\n\n /**\n * 获取事件总线\n */\n getEventBus(): import('../event/AppEventBus').AppEventBus | null {\n if (!this.services) {\n return null;\n }\n return this.services.eventBus;\n }\n\n /**\n * 获取启动配置\n */\n getOptions(): StartOptions {\n return this.options;\n }\n\n /**\n * 是否已初始化\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 是否已销毁\n */\n isDestroyed(): boolean {\n return this.destroyed;\n }\n\n /**\n * 销毁应用实例\n */\n destroy(): void {\n if (this.destroyed) {\n return;\n }\n\n this.renderer.destroy();\n this.services = null;\n this.performanceTracker = null;\n this.destroyed = true;\n }\n}\n\n/**\n * 应用实例管理器\n */\nexport class AppInstanceManager {\n private static instance: AppInstanceManager | null = null;\n private instances: Map<string, AppInstance> = new Map();\n private defaultInstanceId: string | null = null;\n\n private constructor() {\n // 私有构造函数\n }\n\n /**\n * 获取单例实例\n */\n static getInstance(): AppInstanceManager {\n if (!AppInstanceManager.instance) {\n AppInstanceManager.instance = new AppInstanceManager();\n }\n return AppInstanceManager.instance;\n }\n\n /**\n * 创建应用实例\n * \n * @param id - 实例ID,如果不提供则自动生成\n * @param options - 启动配置选项\n * @returns 应用实例\n */\n createInstance(id?: string, options: StartOptions = {}): AppInstance {\n const instanceId = id || `app-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n \n if (this.instances.has(instanceId)) {\n throw new Error(`应用实例 ${instanceId} 已存在`);\n }\n\n const instance = new AppInstance(instanceId, options);\n this.instances.set(instanceId, instance);\n\n // 如果没有默认实例,设置为默认实例\n if (!this.defaultInstanceId) {\n this.defaultInstanceId = instanceId;\n }\n\n return instance;\n }\n\n /**\n * 获取应用实例\n * \n * @param id - 实例ID,如果不提供则返回默认实例\n * @returns 应用实例或undefined\n */\n getInstance(id?: string): AppInstance | undefined {\n const instanceId = id || this.defaultInstanceId;\n if (!instanceId) {\n return undefined;\n }\n return this.instances.get(instanceId);\n }\n\n /**\n * 销毁应用实例\n * \n * @param id - 实例ID,如果不提供则销毁默认实例\n */\n destroyInstance(id?: string): void {\n const instanceId = id || this.defaultInstanceId;\n if (!instanceId) {\n return;\n }\n\n const instance = this.instances.get(instanceId);\n if (instance) {\n instance.destroy();\n this.instances.delete(instanceId);\n\n // 如果销毁的是默认实例,重新设置默认实例\n if (this.defaultInstanceId === instanceId) {\n const remainingInstances = Array.from(this.instances.keys());\n this.defaultInstanceId = remainingInstances.length > 0 ? remainingInstances[0] : null;\n }\n }\n }\n\n /**\n * 获取所有实例\n */\n getAllInstances(): AppInstance[] {\n return Array.from(this.instances.values());\n }\n\n /**\n * 设置默认实例\n * \n * @param id - 实例ID\n */\n setDefaultInstance(id: string): void {\n if (!this.instances.has(id)) {\n throw new Error(`应用实例 ${id} 不存在`);\n }\n this.defaultInstanceId = id;\n }\n\n /**\n * 获取默认实例ID\n */\n getDefaultInstanceId(): string | null {\n return this.defaultInstanceId;\n }\n\n /**\n * 清空所有实例\n */\n clear(): void {\n for (const instance of this.instances.values()) {\n instance.destroy();\n }\n this.instances.clear();\n this.defaultInstanceId = null;\n }\n}\n\n/**\n * 获取应用实例管理器\n */\nexport function getAppInstanceManager(): AppInstanceManager {\n return AppInstanceManager.getInstance();\n}\n"],"names":["AppRenderer","PerformanceTracker","AppInstance","initialize","container","services","initialized","Error","id","destroyed","renderer","options","rootOptions","performanceTracker","monitoring","collectWebVitals","getRenderer","getServices","getPerformanceTracker","getEventBus","eventBus","getOptions","isInitialized","isDestroyed","destroy","AppInstanceManager","getInstance","instance","createInstance","instanceId","Date","now","Math","random","toString","substr","instances","has","set","defaultInstanceId","undefined","get","destroyInstance","delete","remainingInstances","Array","from","keys","length","getAllInstances","values","setDefaultInstance","getDefaultInstanceId","clear","Map","getAppInstanceManager"],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ const _monitoring = require("../../utils/monitoring");
|
|
|
16
16
|
const _performance = require("../../utils/performance");
|
|
17
17
|
const _library = require("../../library");
|
|
18
18
|
const _state = require("../../state");
|
|
19
|
+
const _AppEventBus = require("../event/AppEventBus");
|
|
19
20
|
function _getRequireWildcardCache(nodeInterop) {
|
|
20
21
|
if (typeof WeakMap !== "function") return null;
|
|
21
22
|
var cacheBabelInterop = new WeakMap();
|
|
@@ -113,21 +114,36 @@ async function initializeServices(options = {}) {
|
|
|
113
114
|
});
|
|
114
115
|
}
|
|
115
116
|
}), retryConfig, '状态管理器');
|
|
116
|
-
// 4.
|
|
117
|
+
// 4. 事件总线(独立,可并行)
|
|
118
|
+
const eventBusPromise = withRetry(()=>Promise.resolve().then(()=>{
|
|
119
|
+
const eventBusConfig = {
|
|
120
|
+
enableTracking: options.eventBus?.enableTracking ?? process.env.NODE_ENV === 'development',
|
|
121
|
+
maxHistorySize: options.eventBus?.maxHistorySize ?? 100,
|
|
122
|
+
enableValidation: options.eventBus?.enableValidation ?? false,
|
|
123
|
+
enablePerformanceMonitoring: options.eventBus?.enablePerformanceMonitoring ?? process.env.NODE_ENV === 'development',
|
|
124
|
+
namespacePrefix: options.eventBus?.namespacePrefix,
|
|
125
|
+
instanceId: options.eventBus?.instanceId,
|
|
126
|
+
enableSecurityMode: options.eventBus?.enableSecurityMode ?? false,
|
|
127
|
+
allowedSources: options.eventBus?.allowedSources
|
|
128
|
+
};
|
|
129
|
+
return new _AppEventBus.AppEventBus(eventBusConfig);
|
|
130
|
+
}), retryConfig, '事件总线');
|
|
131
|
+
// 5. 分析服务(可选,动态导入)
|
|
117
132
|
const analyticsPromise = options.analytics ? withRetry(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../utils/analytics"))).then(({ initAnalytics })=>{
|
|
118
133
|
initAnalytics(options.analytics);
|
|
119
134
|
return true;
|
|
120
135
|
}), retryConfig, '分析服务') : Promise.resolve(false);
|
|
121
|
-
//
|
|
136
|
+
// 6. 运行时安全(可选,动态导入)
|
|
122
137
|
const runtimeSecurityPromise = options.runtimeSecurity ? withRetry(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../utils/runtimeSecurity"))).then(({ RuntimeSecurity })=>{
|
|
123
138
|
RuntimeSecurity.initialize(options.runtimeSecurity);
|
|
124
139
|
return true;
|
|
125
140
|
}), retryConfig, '运行时安全服务') : Promise.resolve(false);
|
|
126
141
|
// 并行执行所有初始化任务
|
|
127
|
-
const [monitoring, , stateManager] = await Promise.all([
|
|
142
|
+
const [monitoring, , stateManager, eventBus] = await Promise.all([
|
|
128
143
|
monitoringPromise,
|
|
129
144
|
storagePromise,
|
|
130
145
|
stateManagerPromise,
|
|
146
|
+
eventBusPromise,
|
|
131
147
|
analyticsPromise,
|
|
132
148
|
runtimeSecurityPromise
|
|
133
149
|
]);
|
|
@@ -159,7 +175,8 @@ async function initializeServices(options = {}) {
|
|
|
159
175
|
return {
|
|
160
176
|
monitoring,
|
|
161
177
|
performanceMonitor,
|
|
162
|
-
stateManager
|
|
178
|
+
stateManager,
|
|
179
|
+
eventBus
|
|
163
180
|
};
|
|
164
181
|
}
|
|
165
182
|
|
|
@@ -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';\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 */\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 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 // 5. 运行时安全(可选,动态导入)\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] = await Promise.all([\n monitoringPromise,\n storagePromise,\n stateManagerPromise,\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 };\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","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 * 带重试的异步函数执行器\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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"}
|
|
@@ -6,6 +6,7 @@ import type { MonitoringService } from '../../utils/monitoring';
|
|
|
6
6
|
import { PerformanceMonitor } from '../../utils/performance';
|
|
7
7
|
import { StateManager } from '../../state';
|
|
8
8
|
import type { StartOptions } from '../types';
|
|
9
|
+
import { AppEventBus } from '../event/AppEventBus';
|
|
9
10
|
/**
|
|
10
11
|
* 重试配置
|
|
11
12
|
*/
|
|
@@ -42,6 +43,10 @@ export interface ServicesInitResult {
|
|
|
42
43
|
* 状态管理器实例
|
|
43
44
|
*/
|
|
44
45
|
stateManager: StateManager;
|
|
46
|
+
/**
|
|
47
|
+
* 事件总线实例
|
|
48
|
+
*/
|
|
49
|
+
eventBus: AppEventBus;
|
|
45
50
|
}
|
|
46
51
|
/**
|
|
47
52
|
* 初始化所有服务
|
|
@@ -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;
|
|
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"}
|
|
@@ -6,6 +6,7 @@ import { initMonitoring } from "../../utils/monitoring";
|
|
|
6
6
|
import { PerformanceMonitor } from "../../utils/performance";
|
|
7
7
|
import { storage } from "../../library";
|
|
8
8
|
import { StateManager } from "../../state";
|
|
9
|
+
import { AppEventBus } from "../event/AppEventBus";
|
|
9
10
|
/**
|
|
10
11
|
* 带重试的异步函数执行器
|
|
11
12
|
*/ async function withRetry(fn, config = {}, serviceName) {
|
|
@@ -71,21 +72,36 @@ import { StateManager } from "../../state";
|
|
|
71
72
|
});
|
|
72
73
|
}
|
|
73
74
|
}), retryConfig, '状态管理器');
|
|
74
|
-
// 4.
|
|
75
|
+
// 4. 事件总线(独立,可并行)
|
|
76
|
+
const eventBusPromise = withRetry(()=>Promise.resolve().then(()=>{
|
|
77
|
+
const eventBusConfig = {
|
|
78
|
+
enableTracking: options.eventBus?.enableTracking ?? process.env.NODE_ENV === 'development',
|
|
79
|
+
maxHistorySize: options.eventBus?.maxHistorySize ?? 100,
|
|
80
|
+
enableValidation: options.eventBus?.enableValidation ?? false,
|
|
81
|
+
enablePerformanceMonitoring: options.eventBus?.enablePerformanceMonitoring ?? process.env.NODE_ENV === 'development',
|
|
82
|
+
namespacePrefix: options.eventBus?.namespacePrefix,
|
|
83
|
+
instanceId: options.eventBus?.instanceId,
|
|
84
|
+
enableSecurityMode: options.eventBus?.enableSecurityMode ?? false,
|
|
85
|
+
allowedSources: options.eventBus?.allowedSources
|
|
86
|
+
};
|
|
87
|
+
return new AppEventBus(eventBusConfig);
|
|
88
|
+
}), retryConfig, '事件总线');
|
|
89
|
+
// 5. 分析服务(可选,动态导入)
|
|
75
90
|
const analyticsPromise = options.analytics ? withRetry(()=>import("../../utils/analytics").then(({ initAnalytics })=>{
|
|
76
91
|
initAnalytics(options.analytics);
|
|
77
92
|
return true;
|
|
78
93
|
}), retryConfig, '分析服务') : Promise.resolve(false);
|
|
79
|
-
//
|
|
94
|
+
// 6. 运行时安全(可选,动态导入)
|
|
80
95
|
const runtimeSecurityPromise = options.runtimeSecurity ? withRetry(()=>import("../../utils/runtimeSecurity").then(({ RuntimeSecurity })=>{
|
|
81
96
|
RuntimeSecurity.initialize(options.runtimeSecurity);
|
|
82
97
|
return true;
|
|
83
98
|
}), retryConfig, '运行时安全服务') : Promise.resolve(false);
|
|
84
99
|
// 并行执行所有初始化任务
|
|
85
|
-
const [monitoring, , stateManager] = await Promise.all([
|
|
100
|
+
const [monitoring, , stateManager, eventBus] = await Promise.all([
|
|
86
101
|
monitoringPromise,
|
|
87
102
|
storagePromise,
|
|
88
103
|
stateManagerPromise,
|
|
104
|
+
eventBusPromise,
|
|
89
105
|
analyticsPromise,
|
|
90
106
|
runtimeSecurityPromise
|
|
91
107
|
]);
|
|
@@ -117,7 +133,8 @@ import { StateManager } from "../../state";
|
|
|
117
133
|
return {
|
|
118
134
|
monitoring,
|
|
119
135
|
performanceMonitor,
|
|
120
|
-
stateManager
|
|
136
|
+
stateManager,
|
|
137
|
+
eventBus
|
|
121
138
|
};
|
|
122
139
|
}
|
|
123
140
|
|
|
@@ -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';\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 */\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 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 // 5. 运行时安全(可选,动态导入)\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] = await Promise.all([\n monitoringPromise,\n storagePromise,\n stateManagerPromise,\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 };\n}\n"],"names":["logger","initMonitoring","PerformanceMonitor","storage","StateManager","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","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 * 带重试的异步函数执行器\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":"AAAA;;;CAGC,GAED,SAASA,MAAM,QAAQ,cAAc;AACrC,SAASC,cAAc,QAAQ,yBAAyB;AAExD,SAASC,kBAAkB,QAAQ,0BAA0B;AAC7D,SAASC,OAAO,QAAQ,gBAAgB;AACxC,SAASC,YAAY,QAAQ,cAAc;AAE3C,SAASC,WAAW,QAAQ,uBAAuB;AAiDnD;;CAEC,GACD,eAAeC,UACbC,EAAoB,EACpBC,SAAsB,CAAC,CAAC,EACxBC,WAAmB;IAEnB,MAAMC,aAAaF,OAAOE,UAAU,IAAI;IACxC,MAAMC,aAAaH,OAAOG,UAAU,IAAI;IACxC,MAAMC,qBAAqBJ,OAAOI,kBAAkB,IAAI;IAExD,IAAIC;IAEJ,IAAK,IAAIC,UAAU,GAAGA,WAAWJ,YAAYI,UAAW;QACtD,IAAI;YACF,OAAO,MAAMP;QACf,EAAE,OAAOQ,OAAO;YACdF,YAAYE;YAEZ,IAAID,UAAUJ,YAAY;gBACxB,MAAMM,QAAQJ,qBACVD,aAAaM,KAAKC,GAAG,CAAC,GAAGJ,WACzBH;gBAEJX,OAAOmB,IAAI,CACT,GAAGV,YAAY,UAAU,EAAEK,UAAU,EAAE,CAAC,EAAEJ,aAAa,EAAE,EAAE,EAAEM,MAAM,SAAS,CAAC,EAC7ED;gBAGF,MAAM,IAAIK,QAAQC,CAAAA,UAAWC,WAAWD,SAASL;YACnD;QACF;IACF;IAEAhB,OAAOe,KAAK,CAAC,GAAGN,YAAY,WAAW,EAAEC,WAAW,EAAE,CAAC;IACvD,MAAMG;AACR;AAEA;;;;;;;;;CASC,GACD,OAAO,eAAeU,mBACpBC,UAAwB,CAAC,CAAC;IAE1B,MAAMC,YAAYC,YAAYC,GAAG;IAEjC,OAAO;IACP,MAAMC,cAA2B;QAC/BlB,YAAYc,QAAQK,YAAY,EAAEnB,cAAc;QAChDC,YAAYa,QAAQK,YAAY,EAAElB,cAAc;QAChDC,oBAAoBY,QAAQK,YAAY,EAAEjB,sBAAsB;IAClE;IAEA,uBAAuB;IACvB,+BAA+B;IAC/B,MAAMkB,oBAAoBxB,UACxB,IAAMc,QAAQC,OAAO,CAACpB,eAAe;YACnC,GAAGuB,QAAQO,YAAY;YACvBC,SAAS,CAACjB;gBACRf,OAAOe,KAAK,CAAC,cAAcA;gBAC3BS,QAAQO,YAAY,EAAEC,UAAUjB;YAClC;QACF,KACAa,aACA;IAGF,kBAAkB;IAClB,MAAMK,iBAAiB3B,UACrB,IAAMc,QAAQC,OAAO,GAAGa,IAAI,CAAC;YAC3B/B,QAAQgC,UAAU,CAACX,QAAQY,cAAc;YACzC,OAAOjC;QACT,IACAyB,aACA;IAGF,mBAAmB;IACnB,MAAMS,sBAAsB/B,UAC1B,IAAMc,QAAQC,OAAO,GAAGa,IAAI,CAAC;YAC3B,IAAIV,QAAQc,YAAY,KAAKC,WAAW;gBACtC,OAAO,IAAInC,aAAaoB,QAAQc,YAAY;YAC9C,OAAO;gBACL,aAAa;gBACb,OAAO,IAAIlC,aAAa;oBACtBoC,gBAAgB;oBAChBC,cAAc;gBAChB;YACF;QACF,IACAb,aACA;IAGF,kBAAkB;IAClB,MAAMc,kBAAkBpC,UACtB,IAAMc,QAAQC,OAAO,GAAGa,IAAI,CAAC;YAC3B,MAAMS,iBAAoC;gBACxCC,gBAAgBpB,QAAQqB,QAAQ,EAAED,kBAAmBE,QAAQC,GAAG,CAACC,QAAQ,KAAK;gBAC9EC,gBAAgBzB,QAAQqB,QAAQ,EAAEI,kBAAkB;gBACpDC,kBAAkB1B,QAAQqB,QAAQ,EAAEK,oBAAoB;gBACxDC,6BAA6B3B,QAAQqB,QAAQ,EAAEM,+BAAgCL,QAAQC,GAAG,CAACC,QAAQ,KAAK;gBACxGI,iBAAiB5B,QAAQqB,QAAQ,EAAEO;gBACnCC,YAAY7B,QAAQqB,QAAQ,EAAEQ;gBAC9BC,oBAAoB9B,QAAQqB,QAAQ,EAAES,sBAAsB;gBAC5DC,gBAAgB/B,QAAQqB,QAAQ,EAAEU;YACpC;YACA,OAAO,IAAIlD,YAAYsC;QACzB,IACAf,aACA;IAGF,mBAAmB;IACnB,MAAM4B,mBAAmBhC,QAAQiC,SAAS,GACtCnD,UACE,IAAM,MAAM,CAAC,yBAAyB4B,IAAI,CAAC,CAAC,EAAEwB,aAAa,EAAE;YAC3DA,cAAclC,QAAQiC,SAAS;YAC/B,OAAO;QACT,IACA7B,aACA,UAEFR,QAAQC,OAAO,CAAC;IAEpB,oBAAoB;IACpB,MAAMsC,yBAAyBnC,QAAQoC,eAAe,GAClDtD,UACE,IAAM,MAAM,CAAC,+BAA+B4B,IAAI,CAAC,CAAC,EAAE2B,eAAe,EAAE;YACnEA,gBAAgB1B,UAAU,CAACX,QAAQoC,eAAe;YAClD,OAAO;QACT,IACAhC,aACA,aAEFR,QAAQC,OAAO,CAAC;IAEpB,cAAc;IACd,MAAM,CAACyC,cAAcxB,cAAcO,SAAS,GAAG,MAAMzB,QAAQ2C,GAAG,CAAC;QAC/DjC;QACAG;QACAI;QACAK;QACAc;QACAG;KACD;IAED3D,OAAOgE,IAAI,CAAC;IAEZ,8BAA8B;IAC9B,MAAMC,qBAAqB,IAAI/D,mBAAmB;QAChD,GAAGsB,QAAQyC,kBAAkB;QAC7BC,UAAU,CAACC;YACTL,WAAWM,iBAAiB,CAACD;YAC7B3C,QAAQyC,kBAAkB,EAAEC,WAAWC;QACzC;IACF;IAEA,eAAe;IACf,IAAI,OAAOE,WAAW,aAAa;QACjC,MAAMC,iBAAiB;YACrBL,mBAAmBM,UAAU;YAC7BF,OAAOG,mBAAmB,CAAC,gBAAgBF;QAC7C;QACAD,OAAOI,gBAAgB,CAAC,gBAAgBH;IAC1C;IAEA,MAAMI,WAAWhD,YAAYC,GAAG,KAAKF;IACrCzB,OAAO2E,KAAK,CAAC,CAAC,YAAY,EAAED,SAASE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEnD,SAAS;IACT,IAAId,WAAWM,iBAAiB,EAAE;QAChCN,WAAWM,iBAAiB,CAAC;YAC3BS,qBAAqBH;QACvB;IACF;IAEA,OAAO;QACLZ;QACAG;QACA3B;QACAO;IACF;AACF"}
|
|
@@ -21,6 +21,7 @@ const _initializeServices = require("./initializeServices");
|
|
|
21
21
|
const _AppInstance = require("./AppInstance");
|
|
22
22
|
const _environment = require("./environment");
|
|
23
23
|
const _RouterManager = require("../router/RouterManager");
|
|
24
|
+
const _frameworkEvents = require("../event/frameworkEvents");
|
|
24
25
|
async function startApp(options = {}, instanceId) {
|
|
25
26
|
const startTime = performance.now();
|
|
26
27
|
const envDetector = (0, _environment.getEnvironmentDetector)();
|
|
@@ -29,6 +30,8 @@ async function startApp(options = {}, instanceId) {
|
|
|
29
30
|
(0, _traceId.initTraceIdGenerator)('app');
|
|
30
31
|
const traceId = (0, _traceId.generateTraceId)();
|
|
31
32
|
(0, _traceId.setCurrentTraceId)(traceId);
|
|
33
|
+
// 框架事件管理器(在服务初始化后创建)
|
|
34
|
+
let frameworkEventManager = null;
|
|
32
35
|
try {
|
|
33
36
|
// 1. 环境检测和容器获取
|
|
34
37
|
const container = options.container || envDetector.safeGetElement('#root');
|
|
@@ -40,10 +43,23 @@ async function startApp(options = {}, instanceId) {
|
|
|
40
43
|
_utils.logger.info('框架启动中...');
|
|
41
44
|
// 2. 创建应用实例
|
|
42
45
|
const appInstance = instanceManager.createInstance(instanceId, options);
|
|
46
|
+
const finalInstanceId = appInstance.id;
|
|
43
47
|
// 3. 初始化服务(并行)
|
|
44
48
|
const servicesInitStart = performance.now();
|
|
45
|
-
const services = await (0, _initializeServices.initializeServices)(
|
|
49
|
+
const services = await (0, _initializeServices.initializeServices)({
|
|
50
|
+
...options,
|
|
51
|
+
eventBus: {
|
|
52
|
+
...options.eventBus,
|
|
53
|
+
instanceId: finalInstanceId
|
|
54
|
+
}
|
|
55
|
+
});
|
|
46
56
|
const servicesInitDuration = performance.now() - servicesInitStart;
|
|
57
|
+
// 创建框架事件管理器
|
|
58
|
+
frameworkEventManager = new _frameworkEvents.FrameworkEventManager(services.eventBus);
|
|
59
|
+
// 触发应用启动事件(使用真实的事件总线)
|
|
60
|
+
frameworkEventManager.emitAppStart(finalInstanceId);
|
|
61
|
+
// 触发实例创建事件
|
|
62
|
+
frameworkEventManager.emitInstanceCreated(finalInstanceId);
|
|
47
63
|
// 4. 初始化应用实例
|
|
48
64
|
appInstance.initialize(container, services);
|
|
49
65
|
// 5. 初始化路由管理器
|
|
@@ -62,14 +78,26 @@ async function startApp(options = {}, instanceId) {
|
|
|
62
78
|
// 8. 渲染应用函数
|
|
63
79
|
const renderApp = async (context)=>{
|
|
64
80
|
const renderStart = performance.now();
|
|
81
|
+
// 触发渲染开始事件
|
|
82
|
+
if (frameworkEventManager) {
|
|
83
|
+
frameworkEventManager.emitAppRenderStart(finalInstanceId);
|
|
84
|
+
}
|
|
65
85
|
await renderer.renderApp(options, services, context);
|
|
66
86
|
const renderDuration = performance.now() - renderStart;
|
|
87
|
+
// 触发渲染完成事件
|
|
88
|
+
if (frameworkEventManager) {
|
|
89
|
+
frameworkEventManager.emitAppRenderComplete(finalInstanceId, renderDuration);
|
|
90
|
+
}
|
|
67
91
|
if (performanceTracker) {
|
|
68
92
|
performanceTracker.recordFirstRender(renderDuration);
|
|
69
93
|
const totalDuration = performance.now() - startTime;
|
|
70
94
|
performanceTracker.recordTotalStartup(totalDuration);
|
|
71
95
|
performanceTracker.report();
|
|
72
96
|
}
|
|
97
|
+
// 触发应用启动完成事件
|
|
98
|
+
if (frameworkEventManager) {
|
|
99
|
+
frameworkEventManager.emitAppStarted(finalInstanceId, performance.now() - startTime);
|
|
100
|
+
}
|
|
73
101
|
// 开发模式下显示开发工具
|
|
74
102
|
if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {
|
|
75
103
|
// 延迟显示开发工具,避免影响首次渲染
|
|
@@ -90,6 +118,11 @@ async function startApp(options = {}, instanceId) {
|
|
|
90
118
|
// 场景1: 显示启动页,初始化在启动页中完成
|
|
91
119
|
const onSplashComplete = (context)=>{
|
|
92
120
|
_utils.logger.info('启动页初始化完成');
|
|
121
|
+
// 触发初始化完成事件
|
|
122
|
+
if (frameworkEventManager) {
|
|
123
|
+
const initDuration = context.duration || 0;
|
|
124
|
+
frameworkEventManager.emitAppInitComplete(finalInstanceId, context, initDuration);
|
|
125
|
+
}
|
|
93
126
|
if (options.onSplashComplete) {
|
|
94
127
|
Promise.resolve(options.onSplashComplete(()=>{
|
|
95
128
|
_utils.logger.info('框架加载完成');
|
|
@@ -104,11 +137,19 @@ async function startApp(options = {}, instanceId) {
|
|
|
104
137
|
renderApp(context);
|
|
105
138
|
}
|
|
106
139
|
};
|
|
140
|
+
// 触发初始化开始事件
|
|
141
|
+
if (frameworkEventManager) {
|
|
142
|
+
frameworkEventManager.emitAppInitStart(finalInstanceId);
|
|
143
|
+
}
|
|
107
144
|
// 渲染启动页
|
|
108
145
|
renderer.renderSplashScreen(options, services, onSplashComplete);
|
|
109
146
|
} else {
|
|
110
147
|
// 场景2: 不显示启动页,直接执行初始化
|
|
111
148
|
_utils.logger.info('开始执行初始化(无启动页)');
|
|
149
|
+
// 触发初始化开始事件
|
|
150
|
+
if (frameworkEventManager) {
|
|
151
|
+
frameworkEventManager.emitAppInitStart(finalInstanceId);
|
|
152
|
+
}
|
|
112
153
|
try {
|
|
113
154
|
const initStart = performance.now();
|
|
114
155
|
// 使用中间件包装初始化函数
|
|
@@ -118,6 +159,10 @@ async function startApp(options = {}, instanceId) {
|
|
|
118
159
|
});
|
|
119
160
|
});
|
|
120
161
|
const initDuration = performance.now() - initStart;
|
|
162
|
+
// 触发初始化完成事件
|
|
163
|
+
if (frameworkEventManager) {
|
|
164
|
+
frameworkEventManager.emitAppInitComplete(finalInstanceId, initContext, initDuration);
|
|
165
|
+
}
|
|
121
166
|
if (performanceTracker) {
|
|
122
167
|
performanceTracker.recordInitialization(initDuration);
|
|
123
168
|
}
|
|
@@ -126,6 +171,10 @@ async function startApp(options = {}, instanceId) {
|
|
|
126
171
|
renderApp(initContext);
|
|
127
172
|
} catch (error) {
|
|
128
173
|
_utils.logger.error('初始化失败:', error);
|
|
174
|
+
// 触发初始化错误事件
|
|
175
|
+
if (frameworkEventManager) {
|
|
176
|
+
frameworkEventManager.emitAppInitError(finalInstanceId, error instanceof Error ? error : new Error(String(error)));
|
|
177
|
+
}
|
|
129
178
|
_index.initializationErrorState.setError(error);
|
|
130
179
|
renderApp();
|
|
131
180
|
}
|
|
@@ -133,6 +182,15 @@ async function startApp(options = {}, instanceId) {
|
|
|
133
182
|
return instanceManager;
|
|
134
183
|
} catch (error) {
|
|
135
184
|
_utils.logger.error('框架启动失败:', error);
|
|
185
|
+
// 触发错误事件
|
|
186
|
+
if (frameworkEventManager) {
|
|
187
|
+
const errorInstanceId = instanceId || instanceManager.getInstance()?.id;
|
|
188
|
+
if (errorInstanceId) {
|
|
189
|
+
frameworkEventManager.emitErrorOccurred(error instanceof Error ? error : new Error(String(error)), {
|
|
190
|
+
phase: 'startup'
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
136
194
|
// 如果容器存在,尝试渲染错误页面
|
|
137
195
|
const container = options.container || envDetector.safeGetElement('#root');
|
|
138
196
|
if (container) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/startup/startApp.ts"],"sourcesContent":["/**\n * 应用启动主函数\n * 重构后的启动逻辑,集成所有新功能\n */\n\nimport { logger } from '../../utils';\nimport { ErrorCode, InitializationError } from '../../utils/errors';\nimport { initTraceIdGenerator, generateTraceId, setCurrentTraceId } from '../../utils/traceId';\nimport type { StartOptions } from '../types';\nimport { shouldShowSplashScreen } from '../splash';\nimport { initialization, initializationErrorState } from '../initialization/index';\nimport { middlewareManager } from '../middleware';\nimport { initializeServices } from './initializeServices';\nimport { AppInstanceManager, getAppInstanceManager } from './AppInstance';\nimport { getEnvironmentDetector } from './environment';\nimport { getRouterManager } from '../router/RouterManager';\n\n/**\n * 启动应用\n * \n * @param options - 启动配置选项\n * @param instanceId - 应用实例ID(可选,用于多实例场景)\n * @returns 应用实例\n */\nexport async function startApp(\n options: StartOptions = {},\n instanceId?: string\n): Promise<AppInstanceManager> {\n const startTime = performance.now();\n const envDetector = getEnvironmentDetector();\n const instanceManager = getAppInstanceManager();\n\n // 初始化追踪 ID 生成器\n initTraceIdGenerator('app');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n try {\n // 1. 环境检测和容器获取\n const container = options.container || envDetector.safeGetElement('#root');\n if (!container) {\n throw new InitializationError(\n '未找到挂载容器',\n undefined,\n { container: options.container },\n ErrorCode.CONTAINER_NOT_FOUND\n );\n }\n\n logger.info('框架启动中...');\n\n // 2. 创建应用实例\n const appInstance = instanceManager.createInstance(instanceId, options);\n\n // 3. 初始化服务(并行)\n const servicesInitStart = performance.now();\n const services = await initializeServices(options);\n const servicesInitDuration = performance.now() - servicesInitStart;\n\n // 4. 初始化应用实例\n appInstance.initialize(container, services);\n\n // 5. 初始化路由管理器\n const routerManager = getRouterManager();\n if (options.router) {\n await routerManager.initialize(options.router);\n }\n\n // 6. 性能追踪\n const performanceTracker = appInstance.getPerformanceTracker();\n if (performanceTracker) {\n performanceTracker.recordServiceInit(servicesInitDuration);\n }\n\n // 6. 是否显示启动页\n const shouldShowSplash = shouldShowSplashScreen(options.showSplashScreen);\n\n const renderer = appInstance.getRenderer();\n\n // 8. 渲染应用函数\n const renderApp = async (context?: Awaited<ReturnType<typeof initialization>>) => {\n const renderStart = performance.now();\n await renderer.renderApp(options, services, context);\n const renderDuration = performance.now() - renderStart;\n\n if (performanceTracker) {\n performanceTracker.recordFirstRender(renderDuration);\n const totalDuration = performance.now() - startTime;\n performanceTracker.recordTotalStartup(totalDuration);\n performanceTracker.report();\n }\n\n // 开发模式下显示开发工具\n if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {\n // 延迟显示开发工具,避免影响首次渲染\n setTimeout(() => {\n const devToolsContainer = document.createElement('div');\n devToolsContainer.id = '__framework_dev_tools__';\n document.body.appendChild(devToolsContainer);\n \n // 这里需要动态导入React来渲染开发工具\n // 为了简化,暂时注释掉,后续可以完善\n // import('react-dom/client').then(({ createRoot }) => {\n // const root = createRoot(devToolsContainer);\n // root.render(<DevToolsTrigger appInstance={appInstance} />);\n // });\n }, 1000);\n }\n };\n\n if (shouldShowSplash) {\n // 场景1: 显示启动页,初始化在启动页中完成\n const onSplashComplete = (context: Awaited<ReturnType<typeof initialization>>) => {\n logger.info('启动页初始化完成');\n\n if (options.onSplashComplete) {\n Promise.resolve(\n options.onSplashComplete(() => {\n logger.info('框架加载完成');\n renderApp(context);\n }, context)\n ).catch((error) => {\n logger.error('onSplashComplete 回调执行失败:', error);\n initializationErrorState.setError(error);\n renderApp(context);\n });\n } else {\n logger.info('框架加载完成');\n renderApp(context);\n }\n };\n\n // 渲染启动页\n renderer.renderSplashScreen(options, services, onSplashComplete);\n } else {\n // 场景2: 不显示启动页,直接执行初始化\n logger.info('开始执行初始化(无启动页)');\n\n try {\n const initStart = performance.now();\n\n // 使用中间件包装初始化函数\n const initContext = await middlewareManager.execute(\n options,\n async () => {\n return await initialization(options, (progress, step) => {\n logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);\n });\n }\n );\n\n const initDuration = performance.now() - initStart;\n if (performanceTracker) {\n performanceTracker.recordInitialization(initDuration);\n }\n\n logger.info('初始化完成(无启动页)', initContext);\n logger.info('框架加载完成');\n renderApp(initContext);\n } catch (error) {\n logger.error('初始化失败:', error);\n initializationErrorState.setError(error);\n renderApp();\n }\n }\n\n return instanceManager;\n } catch (error) {\n logger.error('框架启动失败:', error);\n\n // 如果容器存在,尝试渲染错误页面\n const container = options.container || envDetector.safeGetElement('#root');\n if (container) {\n const errorInstance = instanceManager.getInstance();\n if (errorInstance && errorInstance.isInitialized()) {\n const renderer = errorInstance.getRenderer();\n const services = errorInstance.getServices();\n initializationErrorState.setError(error);\n renderer.renderError(options, services);\n }\n }\n\n throw error;\n }\n}\n"],"names":["startApp","options","instanceId","startTime","performance","now","envDetector","getEnvironmentDetector","instanceManager","getAppInstanceManager","initTraceIdGenerator","traceId","generateTraceId","setCurrentTraceId","container","safeGetElement","InitializationError","undefined","ErrorCode","CONTAINER_NOT_FOUND","logger","info","appInstance","createInstance","servicesInitStart","services","initializeServices","servicesInitDuration","initialize","routerManager","getRouterManager","router","performanceTracker","getPerformanceTracker","recordServiceInit","shouldShowSplash","shouldShowSplashScreen","showSplashScreen","renderer","getRenderer","renderApp","context","renderStart","renderDuration","recordFirstRender","totalDuration","recordTotalStartup","report","process","env","NODE_ENV","window","setTimeout","devToolsContainer","document","createElement","id","body","appendChild","onSplashComplete","Promise","resolve","catch","error","initializationErrorState","setError","renderSplashScreen","initStart","initContext","middlewareManager","execute","initialization","progress","step","debug","initDuration","recordInitialization","errorInstance","getInstance","isInitialized","getServices","renderError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/startup/startApp.ts"],"sourcesContent":["/**\n * 应用启动主函数\n * 重构后的启动逻辑,集成所有新功能\n */\n\nimport { logger } from '../../utils';\nimport { ErrorCode, InitializationError } from '../../utils/errors';\nimport { initTraceIdGenerator, generateTraceId, setCurrentTraceId } from '../../utils/traceId';\nimport type { StartOptions } from '../types';\nimport { shouldShowSplashScreen } from '../splash';\nimport { initialization, initializationErrorState } from '../initialization/index';\nimport { middlewareManager } from '../middleware';\nimport { initializeServices } from './initializeServices';\nimport { AppInstanceManager, getAppInstanceManager } from './AppInstance';\nimport { getEnvironmentDetector } from './environment';\nimport { getRouterManager } from '../router/RouterManager';\nimport { FrameworkEventManager } from '../event/frameworkEvents';\n\n/**\n * 启动应用\n * \n * @param options - 启动配置选项\n * @param instanceId - 应用实例ID(可选,用于多实例场景)\n * @returns 应用实例\n */\nexport async function startApp(\n options: StartOptions = {},\n instanceId?: string\n): Promise<AppInstanceManager> {\n const startTime = performance.now();\n const envDetector = getEnvironmentDetector();\n const instanceManager = getAppInstanceManager();\n\n // 初始化追踪 ID 生成器\n initTraceIdGenerator('app');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n // 框架事件管理器(在服务初始化后创建)\n let frameworkEventManager: FrameworkEventManager | null = null;\n\n try {\n // 1. 环境检测和容器获取\n const container = options.container || envDetector.safeGetElement('#root');\n if (!container) {\n throw new InitializationError(\n '未找到挂载容器',\n undefined,\n { container: options.container },\n ErrorCode.CONTAINER_NOT_FOUND\n );\n }\n\n logger.info('框架启动中...');\n\n // 2. 创建应用实例\n const appInstance = instanceManager.createInstance(instanceId, options);\n const finalInstanceId = appInstance.id;\n\n // 3. 初始化服务(并行)\n const servicesInitStart = performance.now();\n const services = await initializeServices({\n ...options,\n eventBus: {\n ...options.eventBus,\n instanceId: finalInstanceId,\n },\n });\n const servicesInitDuration = performance.now() - servicesInitStart;\n\n // 创建框架事件管理器\n frameworkEventManager = new FrameworkEventManager(services.eventBus);\n \n // 触发应用启动事件(使用真实的事件总线)\n frameworkEventManager.emitAppStart(finalInstanceId);\n \n // 触发实例创建事件\n frameworkEventManager.emitInstanceCreated(finalInstanceId);\n\n // 4. 初始化应用实例\n appInstance.initialize(container, services);\n\n // 5. 初始化路由管理器\n const routerManager = getRouterManager();\n if (options.router) {\n await routerManager.initialize(options.router);\n }\n\n // 6. 性能追踪\n const performanceTracker = appInstance.getPerformanceTracker();\n if (performanceTracker) {\n performanceTracker.recordServiceInit(servicesInitDuration);\n }\n\n // 6. 是否显示启动页\n const shouldShowSplash = shouldShowSplashScreen(options.showSplashScreen);\n\n const renderer = appInstance.getRenderer();\n\n // 8. 渲染应用函数\n const renderApp = async (context?: Awaited<ReturnType<typeof initialization>>) => {\n const renderStart = performance.now();\n \n // 触发渲染开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderStart(finalInstanceId);\n }\n \n await renderer.renderApp(options, services, context);\n const renderDuration = performance.now() - renderStart;\n\n // 触发渲染完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderComplete(finalInstanceId, renderDuration);\n }\n\n if (performanceTracker) {\n performanceTracker.recordFirstRender(renderDuration);\n const totalDuration = performance.now() - startTime;\n performanceTracker.recordTotalStartup(totalDuration);\n performanceTracker.report();\n }\n \n // 触发应用启动完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppStarted(finalInstanceId, performance.now() - startTime);\n }\n\n // 开发模式下显示开发工具\n if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {\n // 延迟显示开发工具,避免影响首次渲染\n setTimeout(() => {\n const devToolsContainer = document.createElement('div');\n devToolsContainer.id = '__framework_dev_tools__';\n document.body.appendChild(devToolsContainer);\n \n // 这里需要动态导入React来渲染开发工具\n // 为了简化,暂时注释掉,后续可以完善\n // import('react-dom/client').then(({ createRoot }) => {\n // const root = createRoot(devToolsContainer);\n // root.render(<DevToolsTrigger appInstance={appInstance} />);\n // });\n }, 1000);\n }\n };\n\n if (shouldShowSplash) {\n // 场景1: 显示启动页,初始化在启动页中完成\n const onSplashComplete = (context: Awaited<ReturnType<typeof initialization>>) => {\n logger.info('启动页初始化完成');\n\n // 触发初始化完成事件\n if (frameworkEventManager) {\n const initDuration = context.duration || 0;\n frameworkEventManager.emitAppInitComplete(finalInstanceId, context, initDuration);\n }\n\n if (options.onSplashComplete) {\n Promise.resolve(\n options.onSplashComplete(() => {\n logger.info('框架加载完成');\n renderApp(context);\n }, context)\n ).catch((error) => {\n logger.error('onSplashComplete 回调执行失败:', error);\n initializationErrorState.setError(error);\n renderApp(context);\n });\n } else {\n logger.info('框架加载完成');\n renderApp(context);\n }\n };\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n // 渲染启动页\n renderer.renderSplashScreen(options, services, onSplashComplete);\n } else {\n // 场景2: 不显示启动页,直接执行初始化\n logger.info('开始执行初始化(无启动页)');\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n try {\n const initStart = performance.now();\n\n // 使用中间件包装初始化函数\n const initContext = await middlewareManager.execute(\n options,\n async () => {\n return await initialization(options, (progress, step) => {\n logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);\n });\n }\n );\n\n const initDuration = performance.now() - initStart;\n \n // 触发初始化完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitComplete(finalInstanceId, initContext, initDuration);\n }\n \n if (performanceTracker) {\n performanceTracker.recordInitialization(initDuration);\n }\n\n logger.info('初始化完成(无启动页)', initContext);\n logger.info('框架加载完成');\n renderApp(initContext);\n } catch (error) {\n logger.error('初始化失败:', error);\n \n // 触发初始化错误事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitError(\n finalInstanceId,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n \n initializationErrorState.setError(error);\n renderApp();\n }\n }\n\n return instanceManager;\n } catch (error) {\n logger.error('框架启动失败:', error);\n\n // 触发错误事件\n if (frameworkEventManager) {\n const errorInstanceId = instanceId || instanceManager.getInstance()?.id;\n if (errorInstanceId) {\n frameworkEventManager.emitErrorOccurred(\n error instanceof Error ? error : new Error(String(error)),\n { phase: 'startup' }\n );\n }\n }\n\n // 如果容器存在,尝试渲染错误页面\n const container = options.container || envDetector.safeGetElement('#root');\n if (container) {\n const errorInstance = instanceManager.getInstance();\n if (errorInstance && errorInstance.isInitialized()) {\n const renderer = errorInstance.getRenderer();\n const services = errorInstance.getServices();\n initializationErrorState.setError(error);\n renderer.renderError(options, services);\n }\n }\n\n throw error;\n }\n}\n"],"names":["startApp","options","instanceId","startTime","performance","now","envDetector","getEnvironmentDetector","instanceManager","getAppInstanceManager","initTraceIdGenerator","traceId","generateTraceId","setCurrentTraceId","frameworkEventManager","container","safeGetElement","InitializationError","undefined","ErrorCode","CONTAINER_NOT_FOUND","logger","info","appInstance","createInstance","finalInstanceId","id","servicesInitStart","services","initializeServices","eventBus","servicesInitDuration","FrameworkEventManager","emitAppStart","emitInstanceCreated","initialize","routerManager","getRouterManager","router","performanceTracker","getPerformanceTracker","recordServiceInit","shouldShowSplash","shouldShowSplashScreen","showSplashScreen","renderer","getRenderer","renderApp","context","renderStart","emitAppRenderStart","renderDuration","emitAppRenderComplete","recordFirstRender","totalDuration","recordTotalStartup","report","emitAppStarted","process","env","NODE_ENV","window","setTimeout","devToolsContainer","document","createElement","body","appendChild","onSplashComplete","initDuration","duration","emitAppInitComplete","Promise","resolve","catch","error","initializationErrorState","setError","emitAppInitStart","renderSplashScreen","initStart","initContext","middlewareManager","execute","initialization","progress","step","debug","recordInitialization","emitAppInitError","Error","String","errorInstanceId","getInstance","emitErrorOccurred","phase","errorInstance","isInitialized","getServices","renderError"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startApp.d.ts","sourceRoot":"","sources":["../../../src/core/startup/startApp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAK7C,OAAO,EAAE,kBAAkB,EAAyB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"startApp.d.ts","sourceRoot":"","sources":["../../../src/core/startup/startApp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAK7C,OAAO,EAAE,kBAAkB,EAAyB,MAAM,eAAe,CAAC;AAK1E;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,GAAE,YAAiB,EAC1B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CA0O7B"}
|