@vlian/framework 1.2.19 → 1.2.25
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/analytics.umd.js +1 -1
- package/dist/core/index.cjs +0 -1
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +1 -2
- package/dist/core/index.js +0 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/initialization/index.cjs.map +1 -1
- package/dist/core/initialization/index.d.ts +1 -1
- package/dist/core/initialization/index.js.map +1 -1
- package/dist/core/initialization/initialization.cjs +2 -147
- package/dist/core/initialization/initialization.cjs.map +1 -1
- package/dist/core/initialization/initialization.d.ts +0 -57
- package/dist/core/initialization/initialization.js +2 -148
- package/dist/core/initialization/initialization.js.map +1 -1
- package/dist/core/kernel/startKernel.cjs +1 -2
- package/dist/core/kernel/startKernel.cjs.map +1 -1
- package/dist/core/kernel/startKernel.js +1 -2
- package/dist/core/kernel/startKernel.js.map +1 -1
- package/dist/core/plugin.cjs +16 -16
- package/dist/core/plugin.cjs.map +1 -1
- package/dist/core/plugin.d.ts +5 -1
- package/dist/core/plugin.js +17 -17
- package/dist/core/plugin.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +13 -8
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js +13 -8
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js.map +1 -1
- package/dist/core/startup/startApp.cjs +0 -2
- package/dist/core/startup/startApp.cjs.map +1 -1
- package/dist/core/startup/startApp.js +0 -2
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/core/types.d.ts +1 -5
- package/dist/core/types.js.map +1 -1
- package/dist/index.umd.js +35 -204
- package/dist/index.umd.js.map +1 -1
- package/dist/lazy/index.cjs +104 -0
- package/dist/lazy/index.cjs.map +1 -0
- package/dist/lazy/index.d.ts +19 -0
- package/dist/lazy/index.js +24 -0
- package/dist/lazy/index.js.map +1 -0
- package/dist/library/storage/index.cjs +1 -1
- package/dist/library/storage/index.cjs.map +1 -1
- package/dist/library/storage/index.d.ts +1 -0
- package/dist/library/storage/index.js +1 -1
- package/dist/library/storage/index.js.map +1 -1
- package/dist/request.umd.js +1 -1
- package/dist/state.umd.js +1 -1
- package/package.json +96 -2
- package/dist/core/ui-adapter/adapters.cjs +0 -45
- package/dist/core/ui-adapter/adapters.cjs.map +0 -1
- package/dist/core/ui-adapter/adapters.d.ts +0 -4
- package/dist/core/ui-adapter/adapters.js +0 -27
- package/dist/core/ui-adapter/adapters.js.map +0 -1
- package/dist/core/ui-adapter/index.cjs +0 -21
- package/dist/core/ui-adapter/index.cjs.map +0 -1
- package/dist/core/ui-adapter/index.d.ts +0 -2
- package/dist/core/ui-adapter/index.js +0 -3
- package/dist/core/ui-adapter/index.js.map +0 -1
- package/dist/core/ui-adapter/types.cjs +0 -6
- package/dist/core/ui-adapter/types.cjs.map +0 -1
- package/dist/core/ui-adapter/types.d.ts +0 -24
- package/dist/core/ui-adapter/types.js +0 -3
- package/dist/core/ui-adapter/types.js.map +0 -1
package/dist/core/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/plugin.ts"],"sourcesContent":["import type { StartOptions } from './types';\nimport type { InitializationContext } from './initialization';\nimport { PluginSandbox, type PluginSandboxConfig } from './plugin/PluginSandbox';\nimport { pluginEventBus, type PluginEventBus } from './plugin/PluginEventBus';\n\n/**\n * 插件接口\n */\nexport interface Plugin {\n /**\n * 插件名称\n */\n name: string;\n\n /**\n * 插件版本\n */\n version?: string;\n\n /**\n * 插件依赖列表(插件名称数组)\n * 优化:支持插件依赖管理\n */\n dependencies?: string[];\n\n /**\n * 插件优先级(数字越小优先级越高)\n * 优化:支持插件加载顺序控制\n */\n priority?: number;\n\n /**\n * 插件沙箱配置(用于权限控制)\n */\n sandbox?: PluginSandboxConfig;\n\n /**\n * 初始化前钩子\n */\n beforeInit?: (options: Partial<StartOptions>, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 初始化钩子\n */\n init?: (options: Partial<StartOptions>, context: InitializationContext, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 初始化后钩子\n */\n afterInit?: (options: Partial<StartOptions>, context: InitializationContext, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 销毁钩子\n */\n destroy?: () => Promise<void> | void;\n}\n\n/**\n * 插件加载选项\n */\nexport interface PluginLoadOptions {\n /**\n * 插件URL(用于动态加载)\n */\n url?: string;\n /**\n * 插件模块路径(用于动态导入)\n */\n modulePath?: string;\n /**\n * 是否立即初始化\n */\n initialize?: boolean;\n /**\n * 初始化上下文(如果立即初始化)\n */\n initContext?: InitializationContext;\n /**\n * 启动选项(如果立即初始化)\n */\n startOptions?: StartOptions;\n}\n\n/**\n * 插件管理器\n * \n * 优化:\n * 1. 支持插件依赖管理\n * 2. 支持插件优先级控制\n * 3. 支持插件生命周期管理\n * 4. 支持插件热插拔(动态加载/卸载)\n */\nexport class PluginManager {\n private plugins: Map<string, Plugin> = new Map();\n private sandboxes: Map<string, PluginSandbox> = new Map();\n private pluginStatus: Map<string, 'registered' | 'initialized' | 'destroyed' | 'loading'> = new Map();\n private pluginLoaders: Map<string, () => Promise<Plugin>> = new Map();\n\n /**\n * 注册插件\n * \n * 优化:检查插件依赖是否已注册\n */\n register(plugin: Plugin): void {\n if (this.plugins.has(plugin.name)) {\n console.warn(`插件 ${plugin.name} 已存在,将被覆盖`);\n }\n\n // 检查依赖是否已注册\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n const missingDeps = plugin.dependencies.filter(\n (dep) => !this.plugins.has(dep)\n );\n if (missingDeps.length > 0) {\n console.warn(\n `插件 ${plugin.name} 的依赖未注册: ${missingDeps.join(', ')}`\n );\n }\n }\n\n this.plugins.set(plugin.name, plugin);\n this.pluginStatus.set(plugin.name, 'registered');\n\n // 创建插件沙箱\n if (plugin.sandbox) {\n const sandbox = new PluginSandbox({\n ...plugin.sandbox,\n name: plugin.name,\n });\n this.sandboxes.set(plugin.name, sandbox);\n } else {\n // 如果没有配置沙箱,创建默认沙箱(非严格模式)\n const sandbox = new PluginSandbox({\n strictMode: false,\n name: plugin.name,\n });\n this.sandboxes.set(plugin.name, sandbox);\n }\n }\n\n /**\n * 获取插件加载顺序(考虑依赖和优先级)\n * \n * @returns 插件名称数组,按加载顺序排列\n */\n private getLoadOrder(): string[] {\n const plugins = Array.from(this.plugins.values());\n \n // 按优先级排序\n const sortedPlugins = plugins.sort((a, b) => {\n const priorityA = a.priority ?? 100;\n const priorityB = b.priority ?? 100;\n return priorityA - priorityB;\n });\n\n // 构建依赖图并拓扑排序\n const visited = new Set<string>();\n const visiting = new Set<string>();\n const result: string[] = [];\n\n const visit = (pluginName: string): void => {\n if (visiting.has(pluginName)) {\n console.warn(`检测到循环依赖,涉及插件: ${pluginName}`);\n return;\n }\n if (visited.has(pluginName)) {\n return;\n }\n\n visiting.add(pluginName);\n const plugin = this.plugins.get(pluginName);\n if (plugin?.dependencies) {\n for (const dep of plugin.dependencies) {\n visit(dep);\n }\n }\n visiting.delete(pluginName);\n visited.add(pluginName);\n result.push(pluginName);\n };\n\n for (const plugin of sortedPlugins) {\n visit(plugin.name);\n }\n\n return result;\n }\n\n /**\n * 注销插件\n */\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (plugin && plugin.destroy) {\n plugin.destroy();\n }\n this.plugins.delete(name);\n this.sandboxes.delete(name);\n this.pluginStatus.delete(name);\n this.pluginLoaders.delete(name);\n }\n\n /**\n * 动态加载插件(热插拔)\n * \n * @param options - 插件加载选项\n * @returns 加载的插件\n */\n async loadPlugin(options: PluginLoadOptions): Promise<Plugin> {\n let plugin: Plugin;\n\n if (options.url) {\n // 从URL加载插件\n const response = await fetch(options.url);\n if (!response.ok) {\n throw new Error(`无法加载插件: ${options.url} (${response.status})`);\n }\n const pluginModule = await response.json();\n plugin = pluginModule.default || pluginModule;\n } else if (options.modulePath) {\n // 从模块路径动态导入\n const pluginModule = await import(/* @vite-ignore */ options.modulePath);\n plugin = pluginModule.default || pluginModule;\n } else {\n throw new Error('必须提供 url 或 modulePath');\n }\n\n if (!plugin || !plugin.name) {\n throw new Error('插件格式无效:必须包含 name 属性');\n }\n\n // 检查插件是否已加载\n if (this.plugins.has(plugin.name)) {\n throw new Error(`插件 ${plugin.name} 已加载`);\n }\n\n // 设置加载状态\n this.pluginStatus.set(plugin.name, 'loading');\n\n try {\n // 注册插件\n this.register(plugin);\n\n // 如果要求立即初始化\n if (options.initialize && options.initContext && options.startOptions) {\n await this.initializePlugin(plugin.name, options.startOptions, options.initContext);\n }\n\n return plugin;\n } catch (error) {\n this.pluginStatus.delete(plugin.name);\n throw error;\n }\n }\n\n /**\n * 初始化单个插件\n * \n * @param name - 插件名称\n * @param options - 启动选项\n * @param context - 初始化上下文\n */\n async initializePlugin(\n name: string,\n options: StartOptions,\n context: InitializationContext\n ): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n throw new Error(`插件 ${name} 未注册`);\n }\n\n const status = this.pluginStatus.get(name);\n if (status === 'initialized') {\n return; // 已经初始化\n }\n\n try {\n const sandbox = this.sandboxes.get(name);\n if (!sandbox) {\n throw new Error(`插件 ${name} 的沙箱未找到`);\n }\n\n // 执行初始化钩子\n if (plugin.init) {\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.init(filteredOptions, context, sandbox, pluginEventBus);\n }\n\n this.pluginStatus.set(name, 'initialized');\n } catch (error) {\n console.error(`插件 ${name} 初始化失败:`, error);\n throw error;\n }\n }\n\n /**\n * 卸载插件(热插拔)\n * \n * @param name - 插件名称\n * @param force - 是否强制卸载(即使有依赖)\n */\n async unloadPlugin(name: string, force: boolean = false): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n throw new Error(`插件 ${name} 未加载`);\n }\n\n // 检查是否有其他插件依赖此插件\n if (!force) {\n const dependents = Array.from(this.plugins.values()).filter(\n (p) => p.dependencies && p.dependencies.includes(name)\n );\n if (dependents.length > 0) {\n throw new Error(\n `无法卸载插件 ${name},以下插件依赖它: ${dependents.map((p) => p.name).join(', ')}`\n );\n }\n }\n\n // 执行销毁钩子\n if (plugin.destroy) {\n try {\n await plugin.destroy();\n } catch (error) {\n console.error(`插件 ${name} 的 destroy 钩子执行失败:`, error);\n }\n }\n\n // 从事件总线移除相关监听器(如果有)\n // 注意:事件总线是全局的,这里只移除插件相关的事件\n // 实际实现可能需要更细粒度的控制\n\n // 清理插件\n this.unregister(name);\n this.pluginStatus.set(name, 'destroyed');\n }\n\n /**\n * 检查插件是否可以热加载\n * \n * @param plugin - 插件\n * @returns 是否可以热加载\n */\n canHotLoad(plugin: Plugin): boolean {\n // 检查依赖是否都已加载\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n const missingDeps = plugin.dependencies.filter(\n (dep) => !this.plugins.has(dep)\n );\n if (missingDeps.length > 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * 注册插件加载器(用于延迟加载)\n * \n * @param name - 插件名称\n * @param loader - 加载器函数\n */\n registerLoader(name: string, loader: () => Promise<Plugin>): void {\n this.pluginLoaders.set(name, loader);\n }\n\n /**\n * 使用加载器加载插件\n * \n * @param name - 插件名称\n * @param options - 加载选项\n * @returns 加载的插件\n */\n async loadPluginByLoader(\n name: string,\n options?: Omit<PluginLoadOptions, 'url' | 'modulePath'>\n ): Promise<Plugin> {\n const loader = this.pluginLoaders.get(name);\n if (!loader) {\n throw new Error(`插件 ${name} 的加载器未注册`);\n }\n\n const plugin = await loader();\n\n if (!plugin || !plugin.name) {\n throw new Error('插件格式无效:必须包含 name 属性');\n }\n\n if (plugin.name !== name) {\n throw new Error(`插件名称不匹配: 期望 ${name},实际 ${plugin.name}`);\n }\n\n // 检查插件是否已加载\n if (this.plugins.has(plugin.name)) {\n return this.plugins.get(plugin.name)!;\n }\n\n // 设置加载状态\n this.pluginStatus.set(plugin.name, 'loading');\n\n try {\n // 注册插件\n this.register(plugin);\n\n // 如果要求立即初始化\n if (options?.initialize && options.initContext && options.startOptions) {\n await this.initializePlugin(plugin.name, options.startOptions, options.initContext);\n }\n\n return plugin;\n } catch (error) {\n this.pluginStatus.delete(plugin.name);\n throw error;\n }\n }\n\n /**\n * 获取插件\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * 获取所有插件\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * 执行初始化前钩子\n * \n * 优化:按依赖顺序执行\n */\n async executeBeforeInit(options: StartOptions): Promise<void> {\n const loadOrder = this.getLoadOrder();\n \n for (const pluginName of loadOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.beforeInit) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.beforeInit(filteredOptions, sandbox, pluginEventBus);\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 beforeInit 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 执行初始化钩子\n * \n * 优化:按依赖顺序执行,并更新插件状态\n */\n async executeInit(options: StartOptions, context: InitializationContext): Promise<void> {\n const loadOrder = this.getLoadOrder();\n \n for (const pluginName of loadOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.init) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.init(filteredOptions, context, sandbox, pluginEventBus);\n this.pluginStatus.set(plugin.name, 'initialized');\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 init 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 执行初始化后钩子\n * \n * 优化:按依赖顺序执行(逆序,确保依赖插件先执行)\n */\n async executeAfterInit(options: StartOptions, context: InitializationContext): Promise<void> {\n const loadOrder = this.getLoadOrder();\n // 逆序执行,确保依赖插件先执行\n const reverseOrder = [...loadOrder].reverse();\n \n for (const pluginName of reverseOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.afterInit) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.afterInit(filteredOptions, context, sandbox, pluginEventBus);\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 afterInit 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 获取插件状态\n * \n * @param name - 插件名称\n * @returns 插件状态\n */\n getPluginStatus(name: string): 'registered' | 'initialized' | 'destroyed' | 'loading' | undefined {\n return this.pluginStatus.get(name);\n }\n\n /**\n * 检查插件是否已加载\n * \n * @param name - 插件名称\n * @returns 是否已加载\n */\n isLoaded(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * 获取已加载的插件列表\n * \n * @returns 插件名称数组\n */\n getLoadedPlugins(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * 获取所有插件状态\n * \n * @returns 插件状态映射\n */\n getAllPluginStatus(): Map<string, 'registered' | 'initialized' | 'destroyed' | 'loading'> {\n return new Map(this.pluginStatus);\n }\n\n /**\n * 获取插件沙箱\n * \n * @param name - 插件名称\n * @returns 插件沙箱或undefined\n */\n getSandbox(name: string): PluginSandbox | undefined {\n return this.sandboxes.get(name);\n }\n\n /**\n * 获取事件总线\n */\n getEventBus(): PluginEventBus {\n return pluginEventBus;\n }\n\n /**\n * 销毁所有插件\n */\n async destroyAll(): Promise<void> {\n for (const plugin of this.plugins.values()) {\n if (plugin.destroy) {\n try {\n await plugin.destroy();\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 destroy 钩子执行失败:`, error);\n }\n }\n }\n this.plugins.clear();\n }\n}\n\n/**\n * 默认插件管理器\n */\nexport const pluginManager = new PluginManager();\n\n// 导出插件相关类型和工具\nexport { PluginSandbox, PluginPermission, type PluginSandboxConfig } from './plugin/PluginSandbox';\nexport { \n PluginEventBus, \n pluginEventBus, \n type EventListener,\n type EventMetadata,\n type EventWrapper,\n type PluginEventBusConfig,\n} from './plugin/PluginEventBus';\n"],"names":["PluginSandbox","pluginEventBus","PluginManager","register","plugin","plugins","has","name","console","warn","dependencies","length","missingDeps","filter","dep","join","set","pluginStatus","sandbox","sandboxes","strictMode","getLoadOrder","Array","from","values","sortedPlugins","sort","a","b","priorityA","priority","priorityB","visited","Set","visiting","result","visit","pluginName","add","get","delete","push","unregister","destroy","pluginLoaders","loadPlugin","options","url","response","fetch","ok","Error","status","pluginModule","json","default","modulePath","initialize","initContext","startOptions","initializePlugin","error","context","init","filteredOptions","filterConfig","unloadPlugin","force","dependents","p","includes","map","canHotLoad","registerLoader","loader","loadPluginByLoader","getAll","executeBeforeInit","loadOrder","beforeInit","executeInit","executeAfterInit","reverseOrder","reverse","afterInit","getPluginStatus","isLoaded","getLoadedPlugins","keys","getAllPluginStatus","Map","getSandbox","getEventBus","destroyAll","clear","pluginManager","PluginPermission","PluginEventBus"],"mappings":";;;;;;;;;;;;;AAEA,SAASA,aAAa,QAAkC,yBAAyB;AACjF,SAASC,cAAc,QAA6B,0BAA0B;AAgF9E;;;;;;;;CAQC,GACD,OAAO,MAAMC;IAMX;;;;GAIC,GACDC,SAASC,MAAc,EAAQ;QAC7B,IAAI,IAAI,CAACC,OAAO,CAACC,GAAG,CAACF,OAAOG,IAAI,GAAG;YACjCC,QAAQC,IAAI,CAAC,CAAC,GAAG,EAAEL,OAAOG,IAAI,CAAC,SAAS,CAAC;QAC3C;QAEA,YAAY;QACZ,IAAIH,OAAOM,YAAY,IAAIN,OAAOM,YAAY,CAACC,MAAM,GAAG,GAAG;YACzD,MAAMC,cAAcR,OAAOM,YAAY,CAACG,MAAM,CAC5C,CAACC,MAAQ,CAAC,IAAI,CAACT,OAAO,CAACC,GAAG,CAACQ;YAE7B,IAAIF,YAAYD,MAAM,GAAG,GAAG;gBAC1BH,QAAQC,IAAI,CACV,CAAC,GAAG,EAAEL,OAAOG,IAAI,CAAC,SAAS,EAAEK,YAAYG,IAAI,CAAC,OAAO;YAEzD;QACF;QAEA,IAAI,CAACV,OAAO,CAACW,GAAG,CAACZ,OAAOG,IAAI,EAAEH;QAC9B,IAAI,CAACa,YAAY,CAACD,GAAG,CAACZ,OAAOG,IAAI,EAAE;QAEnC,SAAS;QACT,IAAIH,OAAOc,OAAO,EAAE;YAClB,MAAMA,UAAU,IAAIlB,cAAc;gBAChC,GAAGI,OAAOc,OAAO;gBACjBX,MAAMH,OAAOG,IAAI;YACnB;YACA,IAAI,CAACY,SAAS,CAACH,GAAG,CAACZ,OAAOG,IAAI,EAAEW;QAClC,OAAO;YACL,yBAAyB;YACzB,MAAMA,UAAU,IAAIlB,cAAc;gBAChCoB,YAAY;gBACZb,MAAMH,OAAOG,IAAI;YACnB;YACA,IAAI,CAACY,SAAS,CAACH,GAAG,CAACZ,OAAOG,IAAI,EAAEW;QAClC;IACF;IAEA;;;;GAIC,GACD,AAAQG,eAAyB;QAC/B,MAAMhB,UAAUiB,MAAMC,IAAI,CAAC,IAAI,CAAClB,OAAO,CAACmB,MAAM;QAE9C,SAAS;QACT,MAAMC,gBAAgBpB,QAAQqB,IAAI,CAAC,CAACC,GAAGC;YACrC,MAAMC,YAAYF,EAAEG,QAAQ,IAAI;YAChC,MAAMC,YAAYH,EAAEE,QAAQ,IAAI;YAChC,OAAOD,YAAYE;QACrB;QAEA,aAAa;QACb,MAAMC,UAAU,IAAIC;QACpB,MAAMC,WAAW,IAAID;QACrB,MAAME,SAAmB,EAAE;QAE3B,MAAMC,QAAQ,CAACC;YACb,IAAIH,SAAS5B,GAAG,CAAC+B,aAAa;gBAC5B7B,QAAQC,IAAI,CAAC,CAAC,cAAc,EAAE4B,YAAY;gBAC1C;YACF;YACA,IAAIL,QAAQ1B,GAAG,CAAC+B,aAAa;gBAC3B;YACF;YAEAH,SAASI,GAAG,CAACD;YACb,MAAMjC,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAACF;YAChC,IAAIjC,QAAQM,cAAc;gBACxB,KAAK,MAAMI,OAAOV,OAAOM,YAAY,CAAE;oBACrC0B,MAAMtB;gBACR;YACF;YACAoB,SAASM,MAAM,CAACH;YAChBL,QAAQM,GAAG,CAACD;YACZF,OAAOM,IAAI,CAACJ;QACd;QAEA,KAAK,MAAMjC,UAAUqB,cAAe;YAClCW,MAAMhC,OAAOG,IAAI;QACnB;QAEA,OAAO4B;IACT;IAEA;;GAEC,GACDO,WAAWnC,IAAY,EAAQ;QAC7B,MAAMH,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAAChC;QAChC,IAAIH,UAAUA,OAAOuC,OAAO,EAAE;YAC5BvC,OAAOuC,OAAO;QAChB;QACA,IAAI,CAACtC,OAAO,CAACmC,MAAM,CAACjC;QACpB,IAAI,CAACY,SAAS,CAACqB,MAAM,CAACjC;QACtB,IAAI,CAACU,YAAY,CAACuB,MAAM,CAACjC;QACzB,IAAI,CAACqC,aAAa,CAACJ,MAAM,CAACjC;IAC5B;IAEA;;;;;GAKC,GACD,MAAMsC,WAAWC,OAA0B,EAAmB;QAC5D,IAAI1C;QAEJ,IAAI0C,QAAQC,GAAG,EAAE;YACf,WAAW;YACX,MAAMC,WAAW,MAAMC,MAAMH,QAAQC,GAAG;YACxC,IAAI,CAACC,SAASE,EAAE,EAAE;gBAChB,MAAM,IAAIC,MAAM,CAAC,QAAQ,EAAEL,QAAQC,GAAG,CAAC,EAAE,EAAEC,SAASI,MAAM,CAAC,CAAC,CAAC;YAC/D;YACA,MAAMC,eAAe,MAAML,SAASM,IAAI;YACxClD,SAASiD,aAAaE,OAAO,IAAIF;QACnC,OAAO,IAAIP,QAAQU,UAAU,EAAE;YAC7B,YAAY;YACZ,MAAMH,eAAe,MAAM,MAAM,CAAC,gBAAgB,GAAGP,QAAQU,UAAU;YACvEpD,SAASiD,aAAaE,OAAO,IAAIF;QACnC,OAAO;YACL,MAAM,IAAIF,MAAM;QAClB;QAEA,IAAI,CAAC/C,UAAU,CAACA,OAAOG,IAAI,EAAE;YAC3B,MAAM,IAAI4C,MAAM;QAClB;QAEA,YAAY;QACZ,IAAI,IAAI,CAAC9C,OAAO,CAACC,GAAG,CAACF,OAAOG,IAAI,GAAG;YACjC,MAAM,IAAI4C,MAAM,CAAC,GAAG,EAAE/C,OAAOG,IAAI,CAAC,IAAI,CAAC;QACzC;QAEA,SAAS;QACT,IAAI,CAACU,YAAY,CAACD,GAAG,CAACZ,OAAOG,IAAI,EAAE;QAEnC,IAAI;YACF,OAAO;YACP,IAAI,CAACJ,QAAQ,CAACC;YAEd,YAAY;YACZ,IAAI0C,QAAQW,UAAU,IAAIX,QAAQY,WAAW,IAAIZ,QAAQa,YAAY,EAAE;gBACrE,MAAM,IAAI,CAACC,gBAAgB,CAACxD,OAAOG,IAAI,EAAEuC,QAAQa,YAAY,EAAEb,QAAQY,WAAW;YACpF;YAEA,OAAOtD;QACT,EAAE,OAAOyD,OAAO;YACd,IAAI,CAAC5C,YAAY,CAACuB,MAAM,CAACpC,OAAOG,IAAI;YACpC,MAAMsD;QACR;IACF;IAEA;;;;;;GAMC,GACD,MAAMD,iBACJrD,IAAY,EACZuC,OAAqB,EACrBgB,OAA8B,EACf;QACf,MAAM1D,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAAChC;QAChC,IAAI,CAACH,QAAQ;YACX,MAAM,IAAI+C,MAAM,CAAC,GAAG,EAAE5C,KAAK,IAAI,CAAC;QAClC;QAEA,MAAM6C,SAAS,IAAI,CAACnC,YAAY,CAACsB,GAAG,CAAChC;QACrC,IAAI6C,WAAW,eAAe;YAC5B,QAAQ,QAAQ;QAClB;QAEA,IAAI;YACF,MAAMlC,UAAU,IAAI,CAACC,SAAS,CAACoB,GAAG,CAAChC;YACnC,IAAI,CAACW,SAAS;gBACZ,MAAM,IAAIiC,MAAM,CAAC,GAAG,EAAE5C,KAAK,OAAO,CAAC;YACrC;YAEA,UAAU;YACV,IAAIH,OAAO2D,IAAI,EAAE;gBACf,MAAMC,kBAAkB9C,QAAQ+C,YAAY,CAACnB;gBAC7C,MAAM1C,OAAO2D,IAAI,CAACC,iBAAiBF,SAAS5C,SAASjB;YACvD;YAEA,IAAI,CAACgB,YAAY,CAACD,GAAG,CAACT,MAAM;QAC9B,EAAE,OAAOsD,OAAO;YACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEtD,KAAK,OAAO,CAAC,EAAEsD;YACnC,MAAMA;QACR;IACF;IAEA;;;;;GAKC,GACD,MAAMK,aAAa3D,IAAY,EAAE4D,QAAiB,KAAK,EAAiB;QACtE,MAAM/D,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAAChC;QAChC,IAAI,CAACH,QAAQ;YACX,MAAM,IAAI+C,MAAM,CAAC,GAAG,EAAE5C,KAAK,IAAI,CAAC;QAClC;QAEA,iBAAiB;QACjB,IAAI,CAAC4D,OAAO;YACV,MAAMC,aAAa9C,MAAMC,IAAI,CAAC,IAAI,CAAClB,OAAO,CAACmB,MAAM,IAAIX,MAAM,CACzD,CAACwD,IAAMA,EAAE3D,YAAY,IAAI2D,EAAE3D,YAAY,CAAC4D,QAAQ,CAAC/D;YAEnD,IAAI6D,WAAWzD,MAAM,GAAG,GAAG;gBACzB,MAAM,IAAIwC,MACR,CAAC,OAAO,EAAE5C,KAAK,UAAU,EAAE6D,WAAWG,GAAG,CAAC,CAACF,IAAMA,EAAE9D,IAAI,EAAEQ,IAAI,CAAC,OAAO;YAEzE;QACF;QAEA,SAAS;QACT,IAAIX,OAAOuC,OAAO,EAAE;YAClB,IAAI;gBACF,MAAMvC,OAAOuC,OAAO;YACtB,EAAE,OAAOkB,OAAO;gBACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEtD,KAAK,kBAAkB,CAAC,EAAEsD;YAChD;QACF;QAEA,oBAAoB;QACpB,2BAA2B;QAC3B,kBAAkB;QAElB,OAAO;QACP,IAAI,CAACnB,UAAU,CAACnC;QAChB,IAAI,CAACU,YAAY,CAACD,GAAG,CAACT,MAAM;IAC9B;IAEA;;;;;GAKC,GACDiE,WAAWpE,MAAc,EAAW;QAClC,aAAa;QACb,IAAIA,OAAOM,YAAY,IAAIN,OAAOM,YAAY,CAACC,MAAM,GAAG,GAAG;YACzD,MAAMC,cAAcR,OAAOM,YAAY,CAACG,MAAM,CAC5C,CAACC,MAAQ,CAAC,IAAI,CAACT,OAAO,CAACC,GAAG,CAACQ;YAE7B,IAAIF,YAAYD,MAAM,GAAG,GAAG;gBAC1B,OAAO;YACT;QACF;QACA,OAAO;IACT;IAEA;;;;;GAKC,GACD8D,eAAelE,IAAY,EAAEmE,MAA6B,EAAQ;QAChE,IAAI,CAAC9B,aAAa,CAAC5B,GAAG,CAACT,MAAMmE;IAC/B;IAEA;;;;;;GAMC,GACD,MAAMC,mBACJpE,IAAY,EACZuC,OAAuD,EACtC;QACjB,MAAM4B,SAAS,IAAI,CAAC9B,aAAa,CAACL,GAAG,CAAChC;QACtC,IAAI,CAACmE,QAAQ;YACX,MAAM,IAAIvB,MAAM,CAAC,GAAG,EAAE5C,KAAK,QAAQ,CAAC;QACtC;QAEA,MAAMH,SAAS,MAAMsE;QAErB,IAAI,CAACtE,UAAU,CAACA,OAAOG,IAAI,EAAE;YAC3B,MAAM,IAAI4C,MAAM;QAClB;QAEA,IAAI/C,OAAOG,IAAI,KAAKA,MAAM;YACxB,MAAM,IAAI4C,MAAM,CAAC,YAAY,EAAE5C,KAAK,IAAI,EAAEH,OAAOG,IAAI,EAAE;QACzD;QAEA,YAAY;QACZ,IAAI,IAAI,CAACF,OAAO,CAACC,GAAG,CAACF,OAAOG,IAAI,GAAG;YACjC,OAAO,IAAI,CAACF,OAAO,CAACkC,GAAG,CAACnC,OAAOG,IAAI;QACrC;QAEA,SAAS;QACT,IAAI,CAACU,YAAY,CAACD,GAAG,CAACZ,OAAOG,IAAI,EAAE;QAEnC,IAAI;YACF,OAAO;YACP,IAAI,CAACJ,QAAQ,CAACC;YAEd,YAAY;YACZ,IAAI0C,SAASW,cAAcX,QAAQY,WAAW,IAAIZ,QAAQa,YAAY,EAAE;gBACtE,MAAM,IAAI,CAACC,gBAAgB,CAACxD,OAAOG,IAAI,EAAEuC,QAAQa,YAAY,EAAEb,QAAQY,WAAW;YACpF;YAEA,OAAOtD;QACT,EAAE,OAAOyD,OAAO;YACd,IAAI,CAAC5C,YAAY,CAACuB,MAAM,CAACpC,OAAOG,IAAI;YACpC,MAAMsD;QACR;IACF;IAEA;;GAEC,GACDtB,IAAIhC,IAAY,EAAsB;QACpC,OAAO,IAAI,CAACF,OAAO,CAACkC,GAAG,CAAChC;IAC1B;IAEA;;GAEC,GACDqE,SAAmB;QACjB,OAAOtD,MAAMC,IAAI,CAAC,IAAI,CAAClB,OAAO,CAACmB,MAAM;IACvC;IAEA;;;;GAIC,GACD,MAAMqD,kBAAkB/B,OAAqB,EAAiB;QAC5D,MAAMgC,YAAY,IAAI,CAACzD,YAAY;QAEnC,KAAK,MAAMgB,cAAcyC,UAAW;YAClC,MAAM1E,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAACF;YAChC,IAAI,CAACjC,UAAU,CAACA,OAAO2E,UAAU,EAAE;gBACjC;YACF;YAEA,IAAI;gBACF,MAAM7D,UAAU,IAAI,CAACC,SAAS,CAACoB,GAAG,CAACnC,OAAOG,IAAI;gBAC9C,IAAI,CAACW,SAAS;oBACZV,QAAQC,IAAI,CAAC,CAAC,GAAG,EAAEL,OAAOG,IAAI,CAAC,OAAO,CAAC;oBACvC;gBACF;gBAEA,aAAa;gBACb,MAAMyD,kBAAkB9C,QAAQ+C,YAAY,CAACnB;gBAC7C,MAAM1C,OAAO2E,UAAU,CAACf,iBAAiB9C,SAASjB;YACpD,EAAE,OAAO4D,OAAO;gBACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEzD,OAAOG,IAAI,CAAC,qBAAqB,CAAC,EAAEsD;YAC1D;QACF;IACF;IAEA;;;;GAIC,GACD,MAAMmB,YAAYlC,OAAqB,EAAEgB,OAA8B,EAAiB;QACtF,MAAMgB,YAAY,IAAI,CAACzD,YAAY;QAEnC,KAAK,MAAMgB,cAAcyC,UAAW;YAClC,MAAM1E,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAACF;YAChC,IAAI,CAACjC,UAAU,CAACA,OAAO2D,IAAI,EAAE;gBAC3B;YACF;YAEA,IAAI;gBACF,MAAM7C,UAAU,IAAI,CAACC,SAAS,CAACoB,GAAG,CAACnC,OAAOG,IAAI;gBAC9C,IAAI,CAACW,SAAS;oBACZV,QAAQC,IAAI,CAAC,CAAC,GAAG,EAAEL,OAAOG,IAAI,CAAC,OAAO,CAAC;oBACvC;gBACF;gBAEA,aAAa;gBACb,MAAMyD,kBAAkB9C,QAAQ+C,YAAY,CAACnB;gBAC7C,MAAM1C,OAAO2D,IAAI,CAACC,iBAAiBF,SAAS5C,SAASjB;gBACrD,IAAI,CAACgB,YAAY,CAACD,GAAG,CAACZ,OAAOG,IAAI,EAAE;YACrC,EAAE,OAAOsD,OAAO;gBACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEzD,OAAOG,IAAI,CAAC,eAAe,CAAC,EAAEsD;YACpD;QACF;IACF;IAEA;;;;GAIC,GACD,MAAMoB,iBAAiBnC,OAAqB,EAAEgB,OAA8B,EAAiB;QAC3F,MAAMgB,YAAY,IAAI,CAACzD,YAAY;QACnC,iBAAiB;QACjB,MAAM6D,eAAe;eAAIJ;SAAU,CAACK,OAAO;QAE3C,KAAK,MAAM9C,cAAc6C,aAAc;YACrC,MAAM9E,SAAS,IAAI,CAACC,OAAO,CAACkC,GAAG,CAACF;YAChC,IAAI,CAACjC,UAAU,CAACA,OAAOgF,SAAS,EAAE;gBAChC;YACF;YAEA,IAAI;gBACF,MAAMlE,UAAU,IAAI,CAACC,SAAS,CAACoB,GAAG,CAACnC,OAAOG,IAAI;gBAC9C,IAAI,CAACW,SAAS;oBACZV,QAAQC,IAAI,CAAC,CAAC,GAAG,EAAEL,OAAOG,IAAI,CAAC,OAAO,CAAC;oBACvC;gBACF;gBAEA,aAAa;gBACb,MAAMyD,kBAAkB9C,QAAQ+C,YAAY,CAACnB;gBAC7C,MAAM1C,OAAOgF,SAAS,CAACpB,iBAAiBF,SAAS5C,SAASjB;YAC5D,EAAE,OAAO4D,OAAO;gBACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEzD,OAAOG,IAAI,CAAC,oBAAoB,CAAC,EAAEsD;YACzD;QACF;IACF;IAEA;;;;;GAKC,GACDwB,gBAAgB9E,IAAY,EAAsE;QAChG,OAAO,IAAI,CAACU,YAAY,CAACsB,GAAG,CAAChC;IAC/B;IAEA;;;;;GAKC,GACD+E,SAAS/E,IAAY,EAAW;QAC9B,OAAO,IAAI,CAACF,OAAO,CAACC,GAAG,CAACC;IAC1B;IAEA;;;;GAIC,GACDgF,mBAA6B;QAC3B,OAAOjE,MAAMC,IAAI,CAAC,IAAI,CAAClB,OAAO,CAACmF,IAAI;IACrC;IAEA;;;;GAIC,GACDC,qBAA0F;QACxF,OAAO,IAAIC,IAAI,IAAI,CAACzE,YAAY;IAClC;IAEA;;;;;GAKC,GACD0E,WAAWpF,IAAY,EAA6B;QAClD,OAAO,IAAI,CAACY,SAAS,CAACoB,GAAG,CAAChC;IAC5B;IAEA;;GAEC,GACDqF,cAA8B;QAC5B,OAAO3F;IACT;IAEA;;GAEC,GACD,MAAM4F,aAA4B;QAChC,KAAK,MAAMzF,UAAU,IAAI,CAACC,OAAO,CAACmB,MAAM,GAAI;YAC1C,IAAIpB,OAAOuC,OAAO,EAAE;gBAClB,IAAI;oBACF,MAAMvC,OAAOuC,OAAO;gBACtB,EAAE,OAAOkB,OAAO;oBACdrD,QAAQqD,KAAK,CAAC,CAAC,GAAG,EAAEzD,OAAOG,IAAI,CAAC,kBAAkB,CAAC,EAAEsD;gBACvD;YACF;QACF;QACA,IAAI,CAACxD,OAAO,CAACyF,KAAK;IACpB;;QApfA,uBAAQzF,WAA+B,IAAIqF;QAC3C,uBAAQvE,aAAwC,IAAIuE;QACpD,uBAAQzE,gBAAoF,IAAIyE;QAChG,uBAAQ9C,iBAAoD,IAAI8C;;AAkflE;AAEA;;CAEC,GACD,OAAO,MAAMK,gBAAgB,IAAI7F,gBAAgB;AAEjD,cAAc;AACd,SAASF,aAAa,EAAEgG,gBAAgB,QAAkC,yBAAyB;AACnG,SACEC,cAAc,EACdhG,cAAc,QAKT,0BAA0B"}
|
|
1
|
+
{"version":3,"sources":["../../src/core/plugin.ts"],"sourcesContent":["import type { StartOptions } from './types';\nimport type { InitializationContext } from './initialization';\nimport { PluginSandbox, type PluginSandboxConfig } from './plugin/PluginSandbox';\nimport { pluginEventBus, type PluginEventBus } from './plugin/PluginEventBus';\n\n/**\n * 插件接口\n */\nexport interface Plugin<TOption = unknown> {\n /**\n * 插件名称\n */\n name: string;\n\n /**\n * 插件版本\n */\n version?: string;\n\n /**\n * 插件依赖列表(插件名称数组)\n * 优化:支持插件依赖管理\n */\n dependencies?: string[];\n\n /**\n * 插件优先级(数字越小优先级越高)\n * 优化:支持插件加载顺序控制\n */\n priority?: number;\n\n /**\n * 插件沙箱配置(用于权限控制)\n */\n sandbox?: PluginSandboxConfig;\n\n /**\n * 初始化前钩子\n */\n beforeInit?: (options: Partial<StartOptions>, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 初始化钩子\n */\n init?: (options: Partial<StartOptions>, context: InitializationContext, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 初始化后钩子\n */\n afterInit?: (options: Partial<StartOptions>, context: InitializationContext, sandbox: PluginSandbox, eventBus: PluginEventBus) => Promise<void> | void;\n\n /**\n * 销毁钩子\n */\n destroy?: () => Promise<void> | void;\n\n /**\n * 自定义属性\n */\n readonly option?: Readonly<TOption>;\n}\n\n/**\n * 插件加载选项\n */\nexport interface PluginLoadOptions {\n /**\n * 插件URL(用于动态加载)\n */\n url?: string;\n /**\n * 插件模块路径(用于动态导入)\n */\n modulePath?: string;\n /**\n * 是否立即初始化\n */\n initialize?: boolean;\n /**\n * 初始化上下文(如果立即初始化)\n */\n initContext?: InitializationContext;\n /**\n * 启动选项(如果立即初始化)\n */\n startOptions?: StartOptions;\n}\n\n/**\n * 插件管理器\n *\n * 优化:\n * 1. 支持插件依赖管理\n * 2. 支持插件优先级控制\n * 3. 支持插件生命周期管理\n * 4. 支持插件热插拔(动态加载/卸载)\n */\nexport class PluginManager {\n private plugins: Map<string, Plugin> = new Map();\n private sandboxes: Map<string, PluginSandbox> = new Map();\n private pluginStatus: Map<string, 'registered' | 'initialized' | 'destroyed' | 'loading'> = new Map();\n private pluginLoaders: Map<string, () => Promise<Plugin>> = new Map();\n\n /**\n * 注册插件\n *\n * 优化:检查插件依赖是否已注册\n */\n register(plugin: Plugin): void {\n if (this.plugins.has(plugin.name)) {\n console.warn(`插件 ${plugin.name} 已存在,将被覆盖`);\n }\n\n // 检查依赖是否已注册\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n const missingDeps = plugin.dependencies.filter(\n (dep) => !this.plugins.has(dep)\n );\n if (missingDeps.length > 0) {\n console.warn(\n `插件 ${plugin.name} 的依赖未注册: ${missingDeps.join(', ')}`\n );\n }\n }\n\n this.plugins.set(plugin.name, plugin);\n this.pluginStatus.set(plugin.name, 'registered');\n\n // 创建插件沙箱\n if (plugin.sandbox) {\n const sandbox = new PluginSandbox({\n ...plugin.sandbox,\n name: plugin.name,\n });\n this.sandboxes.set(plugin.name, sandbox);\n } else {\n // 如果没有配置沙箱,创建默认沙箱(非严格模式)\n const sandbox = new PluginSandbox({\n strictMode: false,\n name: plugin.name,\n });\n this.sandboxes.set(plugin.name, sandbox);\n }\n }\n\n /**\n * 获取插件加载顺序(考虑依赖和优先级)\n *\n * @returns 插件名称数组,按加载顺序排列\n */\n private getLoadOrder(): string[] {\n const plugins = Array.from(this.plugins.values());\n\n // 按优先级排序\n const sortedPlugins = plugins.sort((a, b) => {\n const priorityA = a.priority ?? 100;\n const priorityB = b.priority ?? 100;\n return priorityA - priorityB;\n });\n\n // 构建依赖图并拓扑排序\n const visited = new Set<string>();\n const visiting = new Set<string>();\n const result: string[] = [];\n\n const visit = (pluginName: string): void => {\n if (visiting.has(pluginName)) {\n console.warn(`检测到循环依赖,涉及插件: ${pluginName}`);\n return;\n }\n if (visited.has(pluginName)) {\n return;\n }\n\n visiting.add(pluginName);\n const plugin = this.plugins.get(pluginName);\n if (plugin?.dependencies) {\n for (const dep of plugin.dependencies) {\n visit(dep);\n }\n }\n visiting.delete(pluginName);\n visited.add(pluginName);\n result.push(pluginName);\n };\n\n for (const plugin of sortedPlugins) {\n visit(plugin.name);\n }\n\n return result;\n }\n\n /**\n * 注销插件\n */\n unregister(name: string): void {\n const plugin = this.plugins.get(name);\n if (plugin && plugin.destroy) {\n plugin.destroy();\n }\n this.plugins.delete(name);\n this.sandboxes.delete(name);\n this.pluginStatus.delete(name);\n this.pluginLoaders.delete(name);\n }\n\n /**\n * 动态加载插件(热插拔)\n *\n * @param options - 插件加载选项\n * @returns 加载的插件\n */\n async loadPlugin(options: PluginLoadOptions): Promise<Plugin> {\n let plugin: Plugin;\n\n if (options.url) {\n // 从URL加载插件\n const response = await fetch(options.url);\n if (!response.ok) {\n throw new Error(`无法加载插件: ${options.url} (${response.status})`);\n }\n const pluginModule = await response.json();\n plugin = pluginModule.default || pluginModule;\n } else if (options.modulePath) {\n // 从模块路径动态导入\n const pluginModule = await import(/* @vite-ignore */ options.modulePath);\n plugin = pluginModule.default || pluginModule;\n } else {\n throw new Error('必须提供 url 或 modulePath');\n }\n\n if (!plugin || !plugin.name) {\n throw new Error('插件格式无效:必须包含 name 属性');\n }\n\n // 检查插件是否已加载\n if (this.plugins.has(plugin.name)) {\n throw new Error(`插件 ${plugin.name} 已加载`);\n }\n\n // 设置加载状态\n this.pluginStatus.set(plugin.name, 'loading');\n\n try {\n // 注册插件\n this.register(plugin);\n\n // 如果要求立即初始化\n if (options.initialize && options.initContext && options.startOptions) {\n await this.initializePlugin(plugin.name, options.startOptions, options.initContext);\n }\n\n return plugin;\n } catch (error) {\n this.pluginStatus.delete(plugin.name);\n throw error;\n }\n }\n\n /**\n * 初始化单个插件\n *\n * @param name - 插件名称\n * @param options - 启动选项\n * @param context - 初始化上下文\n */\n async initializePlugin(\n name: string,\n options: StartOptions,\n context: InitializationContext\n ): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n throw new Error(`插件 ${name} 未注册`);\n }\n\n const status = this.pluginStatus.get(name);\n if (status === 'initialized') {\n return; // 已经初始化\n }\n\n try {\n const sandbox = this.sandboxes.get(name);\n if (!sandbox) {\n throw new Error(`插件 ${name} 的沙箱未找到`);\n }\n\n // 执行初始化钩子\n if (plugin.init) {\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.init(filteredOptions, context, sandbox, pluginEventBus);\n }\n\n this.pluginStatus.set(name, 'initialized');\n } catch (error) {\n console.error(`插件 ${name} 初始化失败:`, error);\n throw error;\n }\n }\n\n /**\n * 卸载插件(热插拔)\n *\n * @param name - 插件名称\n * @param force - 是否强制卸载(即使有依赖)\n */\n async unloadPlugin(name: string, force: boolean = false): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n throw new Error(`插件 ${name} 未加载`);\n }\n\n // 检查是否有其他插件依赖此插件\n if (!force) {\n const dependents = Array.from(this.plugins.values()).filter(\n (p) => p.dependencies && p.dependencies.includes(name)\n );\n if (dependents.length > 0) {\n throw new Error(\n `无法卸载插件 ${name},以下插件依赖它: ${dependents.map((p) => p.name).join(', ')}`\n );\n }\n }\n\n // 执行销毁钩子\n if (plugin.destroy) {\n try {\n await plugin.destroy();\n } catch (error) {\n console.error(`插件 ${name} 的 destroy 钩子执行失败:`, error);\n }\n }\n\n // 从事件总线移除相关监听器(如果有)\n // 注意:事件总线是全局的,这里只移除插件相关的事件\n // 实际实现可能需要更细粒度的控制\n\n // 清理插件\n this.unregister(name);\n this.pluginStatus.set(name, 'destroyed');\n }\n\n /**\n * 检查插件是否可以热加载\n *\n * @param plugin - 插件\n * @returns 是否可以热加载\n */\n canHotLoad(plugin: Plugin): boolean {\n // 检查依赖是否都已加载\n if (plugin.dependencies && plugin.dependencies.length > 0) {\n const missingDeps = plugin.dependencies.filter(\n (dep) => !this.plugins.has(dep)\n );\n if (missingDeps.length > 0) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * 注册插件加载器(用于延迟加载)\n *\n * @param name - 插件名称\n * @param loader - 加载器函数\n */\n registerLoader(name: string, loader: () => Promise<Plugin>): void {\n this.pluginLoaders.set(name, loader);\n }\n\n /**\n * 使用加载器加载插件\n *\n * @param name - 插件名称\n * @param options - 加载选项\n * @returns 加载的插件\n */\n async loadPluginByLoader(\n name: string,\n options?: Omit<PluginLoadOptions, 'url' | 'modulePath'>\n ): Promise<Plugin> {\n const loader = this.pluginLoaders.get(name);\n if (!loader) {\n throw new Error(`插件 ${name} 的加载器未注册`);\n }\n\n const plugin = await loader();\n\n if (!plugin || !plugin.name) {\n throw new Error('插件格式无效:必须包含 name 属性');\n }\n\n if (plugin.name !== name) {\n throw new Error(`插件名称不匹配: 期望 ${name},实际 ${plugin.name}`);\n }\n\n // 检查插件是否已加载\n if (this.plugins.has(plugin.name)) {\n return this.plugins.get(plugin.name)!;\n }\n\n // 设置加载状态\n this.pluginStatus.set(plugin.name, 'loading');\n\n try {\n // 注册插件\n this.register(plugin);\n\n // 如果要求立即初始化\n if (options?.initialize && options.initContext && options.startOptions) {\n await this.initializePlugin(plugin.name, options.startOptions, options.initContext);\n }\n\n return plugin;\n } catch (error) {\n this.pluginStatus.delete(plugin.name);\n throw error;\n }\n }\n\n /**\n * 获取插件\n */\n get(name: string): Plugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * 获取所有插件\n */\n getAll(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * 执行初始化前钩子\n *\n * 优化:按依赖顺序执行\n */\n async executeBeforeInit(options: StartOptions): Promise<void> {\n const loadOrder = this.getLoadOrder();\n\n for (const pluginName of loadOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.beforeInit) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.beforeInit(filteredOptions, sandbox, pluginEventBus);\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 beforeInit 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 执行初始化钩子\n *\n * 优化:按依赖顺序执行,并更新插件状态\n */\n async executeInit(options: StartOptions, context: InitializationContext): Promise<void> {\n const loadOrder = this.getLoadOrder();\n\n for (const pluginName of loadOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.init) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.init(filteredOptions, context, sandbox, pluginEventBus);\n this.pluginStatus.set(plugin.name, 'initialized');\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 init 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 执行初始化后钩子\n *\n * 优化:按依赖顺序执行(逆序,确保依赖插件先执行)\n */\n async executeAfterInit(options: StartOptions, context: InitializationContext): Promise<void> {\n const loadOrder = this.getLoadOrder();\n // 逆序执行,确保依赖插件先执行\n const reverseOrder = [...loadOrder].reverse();\n\n for (const pluginName of reverseOrder) {\n const plugin = this.plugins.get(pluginName);\n if (!plugin || !plugin.afterInit) {\n continue;\n }\n\n try {\n const sandbox = this.sandboxes.get(plugin.name);\n if (!sandbox) {\n console.warn(`插件 ${plugin.name} 的沙箱未找到`);\n continue;\n }\n\n // 根据沙箱配置过滤选项\n const filteredOptions = sandbox.filterConfig(options);\n await plugin.afterInit(filteredOptions, context, sandbox, pluginEventBus);\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 afterInit 钩子执行失败:`, error);\n }\n }\n }\n\n /**\n * 获取插件状态\n *\n * @param name - 插件名称\n * @returns 插件状态\n */\n getPluginStatus(name: string): 'registered' | 'initialized' | 'destroyed' | 'loading' | undefined {\n return this.pluginStatus.get(name);\n }\n\n /**\n * 检查插件是否已加载\n *\n * @param name - 插件名称\n * @returns 是否已加载\n */\n isLoaded(name: string): boolean {\n return this.plugins.has(name);\n }\n\n /**\n * 获取已加载的插件列表\n *\n * @returns 插件名称数组\n */\n getLoadedPlugins(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * 获取所有插件状态\n *\n * @returns 插件状态映射\n */\n getAllPluginStatus(): Map<string, 'registered' | 'initialized' | 'destroyed' | 'loading'> {\n return new Map(this.pluginStatus);\n }\n\n /**\n * 获取插件沙箱\n *\n * @param name - 插件名称\n * @returns 插件沙箱或undefined\n */\n getSandbox(name: string): PluginSandbox | undefined {\n return this.sandboxes.get(name);\n }\n\n /**\n * 获取事件总线\n */\n getEventBus(): PluginEventBus {\n return pluginEventBus;\n }\n\n /**\n * 销毁所有插件\n */\n async destroyAll(): Promise<void> {\n for (const plugin of this.plugins.values()) {\n if (plugin.destroy) {\n try {\n await plugin.destroy();\n } catch (error) {\n console.error(`插件 ${plugin.name} 的 destroy 钩子执行失败:`, error);\n }\n }\n }\n this.plugins.clear();\n }\n}\n\n/**\n * 默认插件管理器\n */\nexport const pluginManager = new PluginManager();\n\n// 导出插件相关类型和工具\nexport { PluginSandbox, PluginPermission, type PluginSandboxConfig } from './plugin/PluginSandbox';\nexport {\n PluginEventBus,\n pluginEventBus,\n type EventListener,\n type EventMetadata,\n type EventWrapper,\n type PluginEventBusConfig,\n} from './plugin/PluginEventBus';\n"],"names":["PluginSandbox","pluginEventBus","PluginManager","register","plugin","plugins","has","name","console","warn","dependencies","length","missingDeps","filter","dep","join","set","pluginStatus","sandbox","sandboxes","strictMode","getLoadOrder","Array","from","values","sortedPlugins","sort","a","b","priorityA","priority","priorityB","visited","Set","visiting","result","visit","pluginName","add","get","delete","push","unregister","destroy","pluginLoaders","loadPlugin","options","url","response","fetch","ok","Error","status","pluginModule","json","default","modulePath","initialize","initContext","startOptions","initializePlugin","error","context","init","filteredOptions","filterConfig","unloadPlugin","force","dependents","p","includes","map","canHotLoad","registerLoader","loader","loadPluginByLoader","getAll","executeBeforeInit","loadOrder","beforeInit","executeInit","executeAfterInit","reverseOrder","reverse","afterInit","getPluginStatus","isLoaded","getLoadedPlugins","keys","getAllPluginStatus","Map","getSandbox","getEventBus","destroyAll","clear","pluginManager","PluginPermission","PluginEventBus"],"mappings":"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"}
|
|
@@ -13,8 +13,13 @@ const _react = require("react");
|
|
|
13
13
|
const isDevelopment = process.env.NODE_ENV === 'development';
|
|
14
14
|
const RouteErrorBoundary = ({ error, resetErrorBoundary })=>{
|
|
15
15
|
const [showDetails, setShowDetails] = (0, _react.useState)(false);
|
|
16
|
-
const
|
|
17
|
-
const
|
|
16
|
+
const errorObject = error !== null && typeof error === 'object' ? error : null;
|
|
17
|
+
const errorMessage = typeof errorObject?.message === 'string' && errorObject.message !== '' ? errorObject.message : '未知错误';
|
|
18
|
+
const hasCause = errorObject?.cause !== undefined;
|
|
19
|
+
const isNotFoundError = errorObject?.status === 404 || typeof errorObject?.statusText === 'string' && /not\s*found/i.test(errorObject.statusText) || /no routes matched location|not found|404/i.test(errorMessage);
|
|
20
|
+
const title = isNotFoundError ? '页面不存在(404)' : '出错了,请稍后再试';
|
|
21
|
+
const friendlyMessage = isNotFoundError ? '访问的路由未注册或不存在,请检查访问地址。' : '请稍后再试或联系技术支持';
|
|
22
|
+
const displayMessage = isDevelopment ? errorMessage : friendlyMessage;
|
|
18
23
|
return /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
|
|
19
24
|
role: "alert",
|
|
20
25
|
style: {
|
|
@@ -37,10 +42,10 @@ const RouteErrorBoundary = ({ error, resetErrorBoundary })=>{
|
|
|
37
42
|
style: {
|
|
38
43
|
marginTop: 0
|
|
39
44
|
},
|
|
40
|
-
children:
|
|
45
|
+
children: title
|
|
41
46
|
}),
|
|
42
47
|
/*#__PURE__*/ (0, _jsxruntime.jsx)("p", {
|
|
43
|
-
children:
|
|
48
|
+
children: displayMessage
|
|
44
49
|
}),
|
|
45
50
|
/*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
|
|
46
51
|
style: {
|
|
@@ -91,10 +96,10 @@ const RouteErrorBoundary = ({ error, resetErrorBoundary })=>{
|
|
|
91
96
|
/*#__PURE__*/ (0, _jsxruntime.jsx)("strong", {
|
|
92
97
|
children: "错误信息:"
|
|
93
98
|
}),
|
|
94
|
-
|
|
99
|
+
errorMessage
|
|
95
100
|
]
|
|
96
101
|
}),
|
|
97
|
-
|
|
102
|
+
errorObject?.stack && /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
|
|
98
103
|
style: {
|
|
99
104
|
marginBottom: 10,
|
|
100
105
|
whiteSpace: 'pre-wrap',
|
|
@@ -105,7 +110,7 @@ const RouteErrorBoundary = ({ error, resetErrorBoundary })=>{
|
|
|
105
110
|
children: "堆栈:"
|
|
106
111
|
}),
|
|
107
112
|
/*#__PURE__*/ (0, _jsxruntime.jsx)("br", {}),
|
|
108
|
-
|
|
113
|
+
errorObject.stack
|
|
109
114
|
]
|
|
110
115
|
}),
|
|
111
116
|
hasCause && /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
|
|
@@ -113,7 +118,7 @@ const RouteErrorBoundary = ({ error, resetErrorBoundary })=>{
|
|
|
113
118
|
/*#__PURE__*/ (0, _jsxruntime.jsx)("strong", {
|
|
114
119
|
children: "原因:"
|
|
115
120
|
}),
|
|
116
|
-
|
|
121
|
+
errorObject?.cause instanceof Error ? errorObject.cause.message : String(errorObject?.cause)
|
|
117
122
|
]
|
|
118
123
|
})
|
|
119
124
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/RouteErrorBoundary.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { FallbackProps } from 'react-error-boundary';\n\nconst isDevelopment = process.env.NODE_ENV === 'development';\n\ninterface
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/RouteErrorBoundary.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { FallbackProps } from 'react-error-boundary';\n\nconst isDevelopment = process.env.NODE_ENV === 'development';\n\ninterface RouteErrorLike extends Error {\n status?: number;\n statusText?: string;\n data?: unknown;\n cause?: unknown;\n}\n\nexport const RouteErrorBoundary = ({ error, resetErrorBoundary }: FallbackProps) => {\n const [showDetails, setShowDetails] = useState(false);\n const errorObject: RouteErrorLike | null =\n error !== null && typeof error === 'object' ? (error as RouteErrorLike) : null;\n const errorMessage =\n typeof errorObject?.message === 'string' && errorObject.message !== ''\n ? errorObject.message\n : '未知错误';\n const hasCause = errorObject?.cause !== undefined;\n\n const isNotFoundError =\n errorObject?.status === 404 ||\n (typeof errorObject?.statusText === 'string' && /not\\s*found/i.test(errorObject.statusText)) ||\n /no routes matched location|not found|404/i.test(errorMessage);\n\n const title = isNotFoundError ? '页面不存在(404)' : '出错了,请稍后再试';\n const friendlyMessage = isNotFoundError\n ? '访问的路由未注册或不存在,请检查访问地址。'\n : '请稍后再试或联系技术支持';\n const displayMessage = isDevelopment ? errorMessage : friendlyMessage;\n\n return (\n <div\n role=\"alert\"\n style={{\n minHeight: '100vh',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: 24,\n }}\n >\n <div style={{ maxWidth: 760, width: '100%', border: '1px solid #dde5ec', borderRadius: 10, padding: 20 }}>\n <h2 style={{ marginTop: 0 }}>{title}</h2>\n <p>{displayMessage}</p>\n <div style={{ display: 'flex', gap: 8, marginBottom: 12 }}>\n <button\n onClick={resetErrorBoundary}\n style={{ border: 'none', background: '#2f80ed', color: '#fff', borderRadius: 6, padding: '8px 12px', cursor: 'pointer' }}\n >\n 刷新重试\n </button>\n {isDevelopment && (\n <button\n onClick={() => setShowDetails(!showDetails)}\n style={{ border: '1px solid #cfd7df', background: '#fff', borderRadius: 6, padding: '8px 12px', cursor: 'pointer' }}\n >\n {showDetails ? '收起详情' : '展开详情'}\n </button>\n )}\n </div>\n\n {isDevelopment && showDetails && (\n <div style={{ background: '#f7fafc', borderRadius: 8, padding: 12, fontSize: 12, fontFamily: 'monospace' }}>\n <div style={{ marginBottom: 10 }}><strong>错误信息:</strong>{errorMessage}</div>\n {errorObject?.stack && (\n <div style={{ marginBottom: 10, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n <strong>堆栈:</strong>\n <br />\n {errorObject.stack}\n </div>\n )}\n {hasCause && (\n <div>\n <strong>原因:</strong>\n {errorObject?.cause instanceof Error ? errorObject.cause.message : String(errorObject?.cause)}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["RouteErrorBoundary","isDevelopment","process","env","NODE_ENV","error","resetErrorBoundary","showDetails","setShowDetails","useState","errorObject","errorMessage","message","hasCause","cause","undefined","isNotFoundError","status","statusText","test","title","friendlyMessage","displayMessage","div","role","style","minHeight","display","justifyContent","alignItems","padding","maxWidth","width","border","borderRadius","h2","marginTop","p","gap","marginBottom","button","onClick","background","color","cursor","fontSize","fontFamily","strong","stack","whiteSpace","wordBreak","br","Error","String"],"mappings":";;;;+BAYaA;;;eAAAA;;;;uBAZY;AAGzB,MAAMC,gBAAgBC,QAAQC,GAAG,CAACC,QAAQ,KAAK;AASxC,MAAMJ,qBAAqB,CAAC,EAAEK,KAAK,EAAEC,kBAAkB,EAAiB;IAC7E,MAAM,CAACC,aAAaC,eAAe,GAAGC,IAAAA,eAAQ,EAAC;IAC/C,MAAMC,cACJL,UAAU,QAAQ,OAAOA,UAAU,WAAYA,QAA2B;IAC5E,MAAMM,eACJ,OAAOD,aAAaE,YAAY,YAAYF,YAAYE,OAAO,KAAK,KAChEF,YAAYE,OAAO,GACnB;IACN,MAAMC,WAAWH,aAAaI,UAAUC;IAExC,MAAMC,kBACJN,aAAaO,WAAW,OACvB,OAAOP,aAAaQ,eAAe,YAAY,eAAeC,IAAI,CAACT,YAAYQ,UAAU,KAC1F,4CAA4CC,IAAI,CAACR;IAEnD,MAAMS,QAAQJ,kBAAkB,eAAe;IAC/C,MAAMK,kBAAkBL,kBACpB,0BACA;IACJ,MAAMM,iBAAiBrB,gBAAgBU,eAAeU;IAEtD,qBACE,qBAACE;QACCC,MAAK;QACLC,OAAO;YACLC,WAAW;YACXC,SAAS;YACTC,gBAAgB;YAChBC,YAAY;YACZC,SAAS;QACX;kBAEA,cAAA,sBAACP;YAAIE,OAAO;gBAAEM,UAAU;gBAAKC,OAAO;gBAAQC,QAAQ;gBAAqBC,cAAc;gBAAIJ,SAAS;YAAG;;8BACrG,qBAACK;oBAAGV,OAAO;wBAAEW,WAAW;oBAAE;8BAAIhB;;8BAC9B,qBAACiB;8BAAGf;;8BACJ,sBAACC;oBAAIE,OAAO;wBAAEE,SAAS;wBAAQW,KAAK;wBAAGC,cAAc;oBAAG;;sCACtD,qBAACC;4BACCC,SAASnC;4BACTmB,OAAO;gCAAEQ,QAAQ;gCAAQS,YAAY;gCAAWC,OAAO;gCAAQT,cAAc;gCAAGJ,SAAS;gCAAYc,QAAQ;4BAAU;sCACxH;;wBAGA3C,+BACC,qBAACuC;4BACCC,SAAS,IAAMjC,eAAe,CAACD;4BAC/BkB,OAAO;gCAAEQ,QAAQ;gCAAqBS,YAAY;gCAAQR,cAAc;gCAAGJ,SAAS;gCAAYc,QAAQ;4BAAU;sCAEjHrC,cAAc,SAAS;;;;gBAK7BN,iBAAiBM,6BAChB,sBAACgB;oBAAIE,OAAO;wBAAEiB,YAAY;wBAAWR,cAAc;wBAAGJ,SAAS;wBAAIe,UAAU;wBAAIC,YAAY;oBAAY;;sCACvG,sBAACvB;4BAAIE,OAAO;gCAAEc,cAAc;4BAAG;;8CAAG,qBAACQ;8CAAO;;gCAAepC;;;wBACxDD,aAAasC,uBACZ,sBAACzB;4BAAIE,OAAO;gCAAEc,cAAc;gCAAIU,YAAY;gCAAYC,WAAW;4BAAa;;8CAC9E,qBAACH;8CAAO;;8CACR,qBAACI;gCACAzC,YAAYsC,KAAK;;;wBAGrBnC,0BACC,sBAACU;;8CACC,qBAACwB;8CAAO;;gCACPrC,aAAaI,iBAAiBsC,QAAQ1C,YAAYI,KAAK,CAACF,OAAO,GAAGyC,OAAO3C,aAAaI;;;;;;;;AAQvG"}
|
|
@@ -3,8 +3,13 @@ import { useState } from "react";
|
|
|
3
3
|
const isDevelopment = process.env.NODE_ENV === 'development';
|
|
4
4
|
export const RouteErrorBoundary = ({ error, resetErrorBoundary })=>{
|
|
5
5
|
const [showDetails, setShowDetails] = useState(false);
|
|
6
|
-
const
|
|
7
|
-
const
|
|
6
|
+
const errorObject = error !== null && typeof error === 'object' ? error : null;
|
|
7
|
+
const errorMessage = typeof errorObject?.message === 'string' && errorObject.message !== '' ? errorObject.message : '未知错误';
|
|
8
|
+
const hasCause = errorObject?.cause !== undefined;
|
|
9
|
+
const isNotFoundError = errorObject?.status === 404 || typeof errorObject?.statusText === 'string' && /not\s*found/i.test(errorObject.statusText) || /no routes matched location|not found|404/i.test(errorMessage);
|
|
10
|
+
const title = isNotFoundError ? '页面不存在(404)' : '出错了,请稍后再试';
|
|
11
|
+
const friendlyMessage = isNotFoundError ? '访问的路由未注册或不存在,请检查访问地址。' : '请稍后再试或联系技术支持';
|
|
12
|
+
const displayMessage = isDevelopment ? errorMessage : friendlyMessage;
|
|
8
13
|
return /*#__PURE__*/ _jsx("div", {
|
|
9
14
|
role: "alert",
|
|
10
15
|
style: {
|
|
@@ -27,10 +32,10 @@ export const RouteErrorBoundary = ({ error, resetErrorBoundary })=>{
|
|
|
27
32
|
style: {
|
|
28
33
|
marginTop: 0
|
|
29
34
|
},
|
|
30
|
-
children:
|
|
35
|
+
children: title
|
|
31
36
|
}),
|
|
32
37
|
/*#__PURE__*/ _jsx("p", {
|
|
33
|
-
children:
|
|
38
|
+
children: displayMessage
|
|
34
39
|
}),
|
|
35
40
|
/*#__PURE__*/ _jsxs("div", {
|
|
36
41
|
style: {
|
|
@@ -81,10 +86,10 @@ export const RouteErrorBoundary = ({ error, resetErrorBoundary })=>{
|
|
|
81
86
|
/*#__PURE__*/ _jsx("strong", {
|
|
82
87
|
children: "错误信息:"
|
|
83
88
|
}),
|
|
84
|
-
|
|
89
|
+
errorMessage
|
|
85
90
|
]
|
|
86
91
|
}),
|
|
87
|
-
|
|
92
|
+
errorObject?.stack && /*#__PURE__*/ _jsxs("div", {
|
|
88
93
|
style: {
|
|
89
94
|
marginBottom: 10,
|
|
90
95
|
whiteSpace: 'pre-wrap',
|
|
@@ -95,7 +100,7 @@ export const RouteErrorBoundary = ({ error, resetErrorBoundary })=>{
|
|
|
95
100
|
children: "堆栈:"
|
|
96
101
|
}),
|
|
97
102
|
/*#__PURE__*/ _jsx("br", {}),
|
|
98
|
-
|
|
103
|
+
errorObject.stack
|
|
99
104
|
]
|
|
100
105
|
}),
|
|
101
106
|
hasCause && /*#__PURE__*/ _jsxs("div", {
|
|
@@ -103,7 +108,7 @@ export const RouteErrorBoundary = ({ error, resetErrorBoundary })=>{
|
|
|
103
108
|
/*#__PURE__*/ _jsx("strong", {
|
|
104
109
|
children: "原因:"
|
|
105
110
|
}),
|
|
106
|
-
|
|
111
|
+
errorObject?.cause instanceof Error ? errorObject.cause.message : String(errorObject?.cause)
|
|
107
112
|
]
|
|
108
113
|
})
|
|
109
114
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/RouteErrorBoundary.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { FallbackProps } from 'react-error-boundary';\n\nconst isDevelopment = process.env.NODE_ENV === 'development';\n\ninterface
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/core/router/utils/adapters/react-router/RouteErrorBoundary.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { FallbackProps } from 'react-error-boundary';\n\nconst isDevelopment = process.env.NODE_ENV === 'development';\n\ninterface RouteErrorLike extends Error {\n status?: number;\n statusText?: string;\n data?: unknown;\n cause?: unknown;\n}\n\nexport const RouteErrorBoundary = ({ error, resetErrorBoundary }: FallbackProps) => {\n const [showDetails, setShowDetails] = useState(false);\n const errorObject: RouteErrorLike | null =\n error !== null && typeof error === 'object' ? (error as RouteErrorLike) : null;\n const errorMessage =\n typeof errorObject?.message === 'string' && errorObject.message !== ''\n ? errorObject.message\n : '未知错误';\n const hasCause = errorObject?.cause !== undefined;\n\n const isNotFoundError =\n errorObject?.status === 404 ||\n (typeof errorObject?.statusText === 'string' && /not\\s*found/i.test(errorObject.statusText)) ||\n /no routes matched location|not found|404/i.test(errorMessage);\n\n const title = isNotFoundError ? '页面不存在(404)' : '出错了,请稍后再试';\n const friendlyMessage = isNotFoundError\n ? '访问的路由未注册或不存在,请检查访问地址。'\n : '请稍后再试或联系技术支持';\n const displayMessage = isDevelopment ? errorMessage : friendlyMessage;\n\n return (\n <div\n role=\"alert\"\n style={{\n minHeight: '100vh',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: 24,\n }}\n >\n <div style={{ maxWidth: 760, width: '100%', border: '1px solid #dde5ec', borderRadius: 10, padding: 20 }}>\n <h2 style={{ marginTop: 0 }}>{title}</h2>\n <p>{displayMessage}</p>\n <div style={{ display: 'flex', gap: 8, marginBottom: 12 }}>\n <button\n onClick={resetErrorBoundary}\n style={{ border: 'none', background: '#2f80ed', color: '#fff', borderRadius: 6, padding: '8px 12px', cursor: 'pointer' }}\n >\n 刷新重试\n </button>\n {isDevelopment && (\n <button\n onClick={() => setShowDetails(!showDetails)}\n style={{ border: '1px solid #cfd7df', background: '#fff', borderRadius: 6, padding: '8px 12px', cursor: 'pointer' }}\n >\n {showDetails ? '收起详情' : '展开详情'}\n </button>\n )}\n </div>\n\n {isDevelopment && showDetails && (\n <div style={{ background: '#f7fafc', borderRadius: 8, padding: 12, fontSize: 12, fontFamily: 'monospace' }}>\n <div style={{ marginBottom: 10 }}><strong>错误信息:</strong>{errorMessage}</div>\n {errorObject?.stack && (\n <div style={{ marginBottom: 10, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n <strong>堆栈:</strong>\n <br />\n {errorObject.stack}\n </div>\n )}\n {hasCause && (\n <div>\n <strong>原因:</strong>\n {errorObject?.cause instanceof Error ? errorObject.cause.message : String(errorObject?.cause)}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"names":["useState","isDevelopment","process","env","NODE_ENV","RouteErrorBoundary","error","resetErrorBoundary","showDetails","setShowDetails","errorObject","errorMessage","message","hasCause","cause","undefined","isNotFoundError","status","statusText","test","title","friendlyMessage","displayMessage","div","role","style","minHeight","display","justifyContent","alignItems","padding","maxWidth","width","border","borderRadius","h2","marginTop","p","gap","marginBottom","button","onClick","background","color","cursor","fontSize","fontFamily","strong","stack","whiteSpace","wordBreak","br","Error","String"],"mappings":";AAAA,SAASA,QAAQ,QAAQ,QAAQ;AAGjC,MAAMC,gBAAgBC,QAAQC,GAAG,CAACC,QAAQ,KAAK;AAS/C,OAAO,MAAMC,qBAAqB,CAAC,EAAEC,KAAK,EAAEC,kBAAkB,EAAiB;IAC7E,MAAM,CAACC,aAAaC,eAAe,GAAGT,SAAS;IAC/C,MAAMU,cACJJ,UAAU,QAAQ,OAAOA,UAAU,WAAYA,QAA2B;IAC5E,MAAMK,eACJ,OAAOD,aAAaE,YAAY,YAAYF,YAAYE,OAAO,KAAK,KAChEF,YAAYE,OAAO,GACnB;IACN,MAAMC,WAAWH,aAAaI,UAAUC;IAExC,MAAMC,kBACJN,aAAaO,WAAW,OACvB,OAAOP,aAAaQ,eAAe,YAAY,eAAeC,IAAI,CAACT,YAAYQ,UAAU,KAC1F,4CAA4CC,IAAI,CAACR;IAEnD,MAAMS,QAAQJ,kBAAkB,eAAe;IAC/C,MAAMK,kBAAkBL,kBACpB,0BACA;IACJ,MAAMM,iBAAiBrB,gBAAgBU,eAAeU;IAEtD,qBACE,KAACE;QACCC,MAAK;QACLC,OAAO;YACLC,WAAW;YACXC,SAAS;YACTC,gBAAgB;YAChBC,YAAY;YACZC,SAAS;QACX;kBAEA,cAAA,MAACP;YAAIE,OAAO;gBAAEM,UAAU;gBAAKC,OAAO;gBAAQC,QAAQ;gBAAqBC,cAAc;gBAAIJ,SAAS;YAAG;;8BACrG,KAACK;oBAAGV,OAAO;wBAAEW,WAAW;oBAAE;8BAAIhB;;8BAC9B,KAACiB;8BAAGf;;8BACJ,MAACC;oBAAIE,OAAO;wBAAEE,SAAS;wBAAQW,KAAK;wBAAGC,cAAc;oBAAG;;sCACtD,KAACC;4BACCC,SAASlC;4BACTkB,OAAO;gCAAEQ,QAAQ;gCAAQS,YAAY;gCAAWC,OAAO;gCAAQT,cAAc;gCAAGJ,SAAS;gCAAYc,QAAQ;4BAAU;sCACxH;;wBAGA3C,+BACC,KAACuC;4BACCC,SAAS,IAAMhC,eAAe,CAACD;4BAC/BiB,OAAO;gCAAEQ,QAAQ;gCAAqBS,YAAY;gCAAQR,cAAc;gCAAGJ,SAAS;gCAAYc,QAAQ;4BAAU;sCAEjHpC,cAAc,SAAS;;;;gBAK7BP,iBAAiBO,6BAChB,MAACe;oBAAIE,OAAO;wBAAEiB,YAAY;wBAAWR,cAAc;wBAAGJ,SAAS;wBAAIe,UAAU;wBAAIC,YAAY;oBAAY;;sCACvG,MAACvB;4BAAIE,OAAO;gCAAEc,cAAc;4BAAG;;8CAAG,KAACQ;8CAAO;;gCAAepC;;;wBACxDD,aAAasC,uBACZ,MAACzB;4BAAIE,OAAO;gCAAEc,cAAc;gCAAIU,YAAY;gCAAYC,WAAW;4BAAa;;8CAC9E,KAACH;8CAAO;;8CACR,KAACI;gCACAzC,YAAYsC,KAAK;;;wBAGrBnC,0BACC,MAACU;;8CACC,KAACwB;8CAAO;;gCACPrC,aAAaI,iBAAiBsC,QAAQ1C,YAAYI,KAAK,CAACF,OAAO,GAAGyC,OAAO3C,aAAaI;;;;;;;;AAQvG,EAAE"}
|
|
@@ -74,8 +74,6 @@ async function startApp(options = {}, instanceId) {
|
|
|
74
74
|
// 3. 使用无 UI Kernel 管理启动阶段(配置、主题、i18n、服务注入、统一错误处理)
|
|
75
75
|
const kernelRuntime = await (0, _kernel.startKernel)({
|
|
76
76
|
loggerLevel: options.loggerLevel,
|
|
77
|
-
configLoader: options.configStrategy?.loadCriticalConfig,
|
|
78
|
-
configFallback: options.configStrategy?.fallbackConfig,
|
|
79
77
|
locale: {
|
|
80
78
|
locale: (options.locale ? Object.keys(options.locale)[0] : 'zh-CN') || 'zh-CN',
|
|
81
79
|
resources: options.locale
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/startup/startApp.ts"],"sourcesContent":["/**\n * 应用启动主函数\n * 重构后的启动逻辑,集成所有新功能\n */\n\nimport { logger } from '../../utils';\nimport { ErrorCode, InitializationError } from '../../utils/errors';\nimport { initTraceIdGenerator, generateTraceId, setCurrentTraceId } from '../../utils/traceId';\nimport type { StartOptions } from '../types';\nimport { shouldShowSplashScreen } from '../splash';\nimport { initialization, initializationErrorState } from '../initialization/index';\nimport { middlewareManager } from '../middleware';\nimport { initializeServices } from './initializeServices';\nimport type { ServicesInitResult } from './initializeServices';\nimport { AppInstanceManager, getAppInstanceManager } from './AppInstance';\nimport { getEnvironmentDetector } from './environment';\nimport { getRouterManager } from '../router/RouterManager';\nimport { FrameworkEventManager } from '../event/frameworkEvents';\nimport { startKernel } from '../kernel';\n\n/**\n * 启动应用\n * \n * @param options - 启动配置选项\n * @param instanceId - 应用实例ID(可选,用于多实例场景)\n * @returns 应用实例\n */\nexport async function startApp(\n options: StartOptions = {},\n instanceId?: string\n): Promise<AppInstanceManager> {\n const startTime = performance.now();\n const envDetector = getEnvironmentDetector();\n const instanceManager = getAppInstanceManager();\n\n // 初始化追踪 ID 生成器\n initTraceIdGenerator('app');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n // 框架事件管理器(在服务初始化后创建)\n let frameworkEventManager: FrameworkEventManager | null = null;\n let kernelTraceId: string | null = null;\n\n try {\n // 1. 环境检测和容器获取\n const container = options.container || envDetector.safeGetElement('#root');\n if (!container) {\n throw new InitializationError(\n '未找到挂载容器',\n undefined,\n { container: options.container },\n ErrorCode.CONTAINER_NOT_FOUND\n );\n }\n\n logger.info('框架启动中...');\n\n if (options.antd && !options.uiProvider) {\n logger.warn('[deprecated] StartOptions.antd 即将废弃,请迁移到 StartOptions.uiProvider');\n }\n if (options.antdApp && !options.uiApp) {\n logger.warn('[deprecated] StartOptions.antdApp 即将废弃,请迁移到 StartOptions.uiApp');\n }\n\n // 2. 创建应用实例\n const appInstance = instanceManager.createInstance(instanceId, options);\n const finalInstanceId = appInstance.id;\n let services: ServicesInitResult | null = null;\n\n // 使用单次 Promise 防止重复初始化,提升加载速度并保证可观测数据一致。\n let servicesInitPromise: Promise<ServicesInitResult> | null = null;\n const ensureServicesInitialized = async (): Promise<ServicesInitResult> => {\n if (services) {\n return services;\n }\n if (!servicesInitPromise) {\n servicesInitPromise = initializeServices({\n ...options,\n eventBus: {\n ...options.eventBus,\n instanceId: finalInstanceId,\n },\n });\n }\n services = await servicesInitPromise;\n return services;\n };\n\n // 3. 使用无 UI Kernel 管理启动阶段(配置、主题、i18n、服务注入、统一错误处理)\n const kernelRuntime = await startKernel({\n loggerLevel: options.loggerLevel,\n configLoader: options.configStrategy?.loadCriticalConfig,\n configFallback: options.configStrategy?.fallbackConfig,\n locale: {\n locale: (options.locale ? (Object.keys(options.locale)[0] as any) : 'zh-CN') || 'zh-CN',\n resources: options.locale as any,\n },\n theme: {\n mode: options.theme?.mode || 'light',\n primaryColor: options.theme?.primaryColor,\n compatibility: {\n antd: (options.uiProvider || options.antd) as unknown as Record<string, unknown> | undefined,\n },\n },\n adapters: {\n monitoring: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n captureError: (error, metadata) => {\n if (services) {\n services.monitoring.captureError(error, metadata);\n } else {\n logger.error('Kernel 监控上报失败(服务尚未初始化):', error, metadata);\n }\n },\n reportMetric: (name, value, tags) => {\n logger.debug(`[kernel.metric] ${name}`, { value, tags, instanceId: finalInstanceId });\n },\n },\n state: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n getInstance: () => services?.stateManager ?? null,\n },\n eventBus: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n emit: (event, payload) => {\n if (services) {\n services.eventBus.emit(event as any, payload as any);\n }\n },\n on: (event, handler) => {\n if (!services) {\n return () => {};\n }\n return services.eventBus.on(event as any, handler as any);\n },\n },\n errorHandler: {\n async handle(error) {\n logger.error('Kernel 启动阶段失败:', error);\n return { handled: true, shouldThrow: true };\n },\n },\n },\n enabledPhases: {\n init: false,\n },\n enablePostReady: false,\n });\n kernelTraceId = kernelRuntime.traceId;\n\n const servicesInitStart = performance.now();\n const resolvedServices = await ensureServicesInitialized();\n const servicesInitDuration = performance.now() - servicesInitStart;\n\n // 创建框架事件管理器\n frameworkEventManager = new FrameworkEventManager(resolvedServices.eventBus);\n \n // 触发应用启动事件(使用真实的事件总线)\n frameworkEventManager.emitAppStart(finalInstanceId);\n \n // 触发实例创建事件\n frameworkEventManager.emitInstanceCreated(finalInstanceId);\n\n // 4. 初始化应用实例\n appInstance.initialize(container, resolvedServices);\n\n // 5. 初始化路由管理器\n const routerManager = getRouterManager();\n if (options.router) {\n await routerManager.initialize(options.router);\n }\n\n // 6. 性能追踪\n const performanceTracker = appInstance.getPerformanceTracker();\n if (performanceTracker) {\n performanceTracker.recordServiceInit(servicesInitDuration);\n }\n\n // 6. 是否显示启动页\n const shouldShowSplash = shouldShowSplashScreen(options.showSplashScreen);\n\n const renderer = appInstance.getRenderer();\n\n // 8. 渲染应用函数\n const renderApp = async (context?: Awaited<ReturnType<typeof initialization>>) => {\n const renderStart = performance.now();\n \n // 触发渲染开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderStart(finalInstanceId);\n }\n \n await renderer.renderApp(options, resolvedServices, context);\n const renderDuration = performance.now() - renderStart;\n\n // 触发渲染完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderComplete(finalInstanceId, renderDuration);\n }\n\n // 优化:在应用渲染完成后,延迟初始化非关键服务\n // 使用 requestIdleCallback 在浏览器空闲时初始化,不影响用户体验\n if (resolvedServices.initializeNonCriticalServices) {\n resolvedServices.initializeNonCriticalServices().catch((error) => {\n logger.warn('非关键服务初始化失败(不影响应用运行):', error);\n });\n }\n\n if (performanceTracker) {\n performanceTracker.recordFirstRender(renderDuration);\n const totalDuration = performance.now() - startTime;\n performanceTracker.recordTotalStartup(totalDuration);\n performanceTracker.report();\n }\n \n // 触发应用启动完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppStarted(finalInstanceId, performance.now() - startTime);\n }\n\n // 统一发出 Kernel post-ready 事件,供可观测系统消费。\n kernelRuntime.getEventBus().emit('kernel.postReady', {\n traceId: kernelRuntime.traceId,\n instanceId: finalInstanceId,\n startupDuration: performance.now() - startTime,\n });\n\n // 开发模式下显示开发工具\n if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {\n // 延迟显示开发工具,避免影响首次渲染\n setTimeout(() => {\n const devToolsContainer = document.createElement('div');\n devToolsContainer.id = '__framework_dev_tools__';\n document.body.appendChild(devToolsContainer);\n \n // 这里需要动态导入React来渲染开发工具\n // 为了简化,暂时注释掉,后续可以完善\n // import('react-dom/client').then(({ createRoot }) => {\n // const root = createRoot(devToolsContainer);\n // root.render(<DevToolsTrigger appInstance={appInstance} />);\n // });\n }, 1000);\n }\n };\n\n if (shouldShowSplash) {\n // 场景1: 显示启动页,初始化在启动页中完成\n const onSplashComplete = (context: Awaited<ReturnType<typeof initialization>>) => {\n logger.info('启动页初始化完成');\n\n // 触发初始化完成事件\n if (frameworkEventManager) {\n const initDuration = context.duration || 0;\n frameworkEventManager.emitAppInitComplete(finalInstanceId, context, initDuration);\n }\n\n if (options.onSplashComplete) {\n Promise.resolve(\n options.onSplashComplete(() => {\n logger.info('框架加载完成');\n renderApp(context);\n }, context)\n ).catch((error) => {\n logger.error('onSplashComplete 回调执行失败:', error);\n initializationErrorState.setError(error);\n renderApp(context);\n });\n } else {\n logger.info('框架加载完成');\n renderApp(context);\n }\n };\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n // 渲染启动页\n renderer.renderSplashScreen(options, resolvedServices, onSplashComplete);\n } else {\n // 场景2: 不显示启动页,直接执行初始化\n logger.info('开始执行初始化(无启动页)');\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n try {\n const initStart = performance.now();\n\n // 使用中间件包装初始化函数\n const initContext = await middlewareManager.execute(\n options,\n async () => {\n return await initialization(options, (progress, step) => {\n logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);\n });\n }\n );\n\n const initDuration = performance.now() - initStart;\n \n // 触发初始化完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitComplete(finalInstanceId, initContext, initDuration);\n }\n \n if (performanceTracker) {\n performanceTracker.recordInitialization(initDuration);\n }\n\n logger.info('初始化完成(无启动页)', initContext);\n logger.info('框架加载完成');\n renderApp(initContext);\n } catch (error) {\n logger.error('初始化失败:', error);\n \n // 触发初始化错误事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitError(\n finalInstanceId,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n \n initializationErrorState.setError(error);\n renderApp();\n }\n }\n\n return instanceManager;\n } catch (error) {\n logger.error('框架启动失败:', error);\n\n // 触发错误事件\n if (frameworkEventManager) {\n const errorInstanceId = instanceId || instanceManager.getInstance()?.id;\n if (errorInstanceId) {\n frameworkEventManager.emitErrorOccurred(\n error instanceof Error ? error : new Error(String(error)),\n { phase: 'startup' }\n );\n }\n }\n\n if (kernelTraceId) {\n logger.error('Kernel Trace 失败上下文', { traceId: kernelTraceId });\n }\n\n // 如果容器存在,尝试渲染错误页面\n const container = options.container || envDetector.safeGetElement('#root');\n if (container) {\n const errorInstance = instanceManager.getInstance();\n if (errorInstance && errorInstance.isInitialized()) {\n const renderer = errorInstance.getRenderer();\n const services = errorInstance.getServices();\n initializationErrorState.setError(error);\n renderer.renderError(options, services);\n }\n }\n\n throw error;\n }\n}\n"],"names":["startApp","options","instanceId","startTime","performance","now","envDetector","getEnvironmentDetector","instanceManager","getAppInstanceManager","initTraceIdGenerator","traceId","generateTraceId","setCurrentTraceId","frameworkEventManager","kernelTraceId","container","safeGetElement","InitializationError","undefined","ErrorCode","CONTAINER_NOT_FOUND","logger","info","antd","uiProvider","warn","antdApp","uiApp","appInstance","createInstance","finalInstanceId","id","services","servicesInitPromise","ensureServicesInitialized","initializeServices","eventBus","kernelRuntime","startKernel","loggerLevel","configLoader","configStrategy","loadCriticalConfig","configFallback","fallbackConfig","locale","Object","keys","resources","theme","mode","primaryColor","compatibility","adapters","monitoring","initialize","captureError","error","metadata","reportMetric","name","value","tags","debug","state","getInstance","stateManager","emit","event","payload","on","handler","errorHandler","handle","handled","shouldThrow","enabledPhases","init","enablePostReady","servicesInitStart","resolvedServices","servicesInitDuration","FrameworkEventManager","emitAppStart","emitInstanceCreated","routerManager","getRouterManager","router","performanceTracker","getPerformanceTracker","recordServiceInit","shouldShowSplash","shouldShowSplashScreen","showSplashScreen","renderer","getRenderer","renderApp","context","renderStart","emitAppRenderStart","renderDuration","emitAppRenderComplete","initializeNonCriticalServices","catch","recordFirstRender","totalDuration","recordTotalStartup","report","emitAppStarted","getEventBus","startupDuration","process","env","NODE_ENV","window","setTimeout","devToolsContainer","document","createElement","body","appendChild","onSplashComplete","initDuration","duration","emitAppInitComplete","Promise","resolve","initializationErrorState","setError","emitAppInitStart","renderSplashScreen","initStart","initContext","middlewareManager","execute","initialization","progress","step","recordInitialization","emitAppInitError","Error","String","errorInstanceId","emitErrorOccurred","phase","errorInstance","isInitialized","getServices","renderError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/startup/startApp.ts"],"sourcesContent":["/**\n * 应用启动主函数\n * 重构后的启动逻辑,集成所有新功能\n */\n\nimport { logger } from '../../utils';\nimport { ErrorCode, InitializationError } from '../../utils/errors';\nimport { initTraceIdGenerator, generateTraceId, setCurrentTraceId } from '../../utils/traceId';\nimport type { StartOptions } from '../types';\nimport { shouldShowSplashScreen } from '../splash';\nimport { initialization, initializationErrorState } from '../initialization/index';\nimport { middlewareManager } from '../middleware';\nimport { initializeServices } from './initializeServices';\nimport type { ServicesInitResult } from './initializeServices';\nimport { AppInstanceManager, getAppInstanceManager } from './AppInstance';\nimport { getEnvironmentDetector } from './environment';\nimport { getRouterManager } from '../router/RouterManager';\nimport { FrameworkEventManager } from '../event/frameworkEvents';\nimport { startKernel } from '../kernel';\n\n/**\n * 启动应用\n * \n * @param options - 启动配置选项\n * @param instanceId - 应用实例ID(可选,用于多实例场景)\n * @returns 应用实例\n */\nexport async function startApp(\n options: StartOptions = {},\n instanceId?: string\n): Promise<AppInstanceManager> {\n const startTime = performance.now();\n const envDetector = getEnvironmentDetector();\n const instanceManager = getAppInstanceManager();\n\n // 初始化追踪 ID 生成器\n initTraceIdGenerator('app');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n // 框架事件管理器(在服务初始化后创建)\n let frameworkEventManager: FrameworkEventManager | null = null;\n let kernelTraceId: string | null = null;\n\n try {\n // 1. 环境检测和容器获取\n const container = options.container || envDetector.safeGetElement('#root');\n if (!container) {\n throw new InitializationError(\n '未找到挂载容器',\n undefined,\n { container: options.container },\n ErrorCode.CONTAINER_NOT_FOUND\n );\n }\n\n logger.info('框架启动中...');\n\n if (options.antd && !options.uiProvider) {\n logger.warn('[deprecated] StartOptions.antd 即将废弃,请迁移到 StartOptions.uiProvider');\n }\n if (options.antdApp && !options.uiApp) {\n logger.warn('[deprecated] StartOptions.antdApp 即将废弃,请迁移到 StartOptions.uiApp');\n }\n\n // 2. 创建应用实例\n const appInstance = instanceManager.createInstance(instanceId, options);\n const finalInstanceId = appInstance.id;\n let services: ServicesInitResult | null = null;\n\n // 使用单次 Promise 防止重复初始化,提升加载速度并保证可观测数据一致。\n let servicesInitPromise: Promise<ServicesInitResult> | null = null;\n const ensureServicesInitialized = async (): Promise<ServicesInitResult> => {\n if (services) {\n return services;\n }\n if (!servicesInitPromise) {\n servicesInitPromise = initializeServices({\n ...options,\n eventBus: {\n ...options.eventBus,\n instanceId: finalInstanceId,\n },\n });\n }\n services = await servicesInitPromise;\n return services;\n };\n\n // 3. 使用无 UI Kernel 管理启动阶段(配置、主题、i18n、服务注入、统一错误处理)\n const kernelRuntime = await startKernel({\n loggerLevel: options.loggerLevel,\n locale: {\n locale: (options.locale ? (Object.keys(options.locale)[0] as any) : 'zh-CN') || 'zh-CN',\n resources: options.locale as any,\n },\n theme: {\n mode: options.theme?.mode || 'light',\n primaryColor: options.theme?.primaryColor,\n compatibility: {\n antd: (options.uiProvider || options.antd) as unknown as Record<string, unknown> | undefined,\n },\n },\n adapters: {\n monitoring: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n captureError: (error, metadata) => {\n if (services) {\n services.monitoring.captureError(error, metadata);\n } else {\n logger.error('Kernel 监控上报失败(服务尚未初始化):', error, metadata);\n }\n },\n reportMetric: (name, value, tags) => {\n logger.debug(`[kernel.metric] ${name}`, { value, tags, instanceId: finalInstanceId });\n },\n },\n state: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n getInstance: () => services?.stateManager ?? null,\n },\n eventBus: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n emit: (event, payload) => {\n if (services) {\n services.eventBus.emit(event as any, payload as any);\n }\n },\n on: (event, handler) => {\n if (!services) {\n return () => {};\n }\n return services.eventBus.on(event as any, handler as any);\n },\n },\n errorHandler: {\n async handle(error) {\n logger.error('Kernel 启动阶段失败:', error);\n return { handled: true, shouldThrow: true };\n },\n },\n },\n enabledPhases: {\n init: false,\n },\n enablePostReady: false,\n });\n kernelTraceId = kernelRuntime.traceId;\n\n const servicesInitStart = performance.now();\n const resolvedServices = await ensureServicesInitialized();\n const servicesInitDuration = performance.now() - servicesInitStart;\n\n // 创建框架事件管理器\n frameworkEventManager = new FrameworkEventManager(resolvedServices.eventBus);\n \n // 触发应用启动事件(使用真实的事件总线)\n frameworkEventManager.emitAppStart(finalInstanceId);\n \n // 触发实例创建事件\n frameworkEventManager.emitInstanceCreated(finalInstanceId);\n\n // 4. 初始化应用实例\n appInstance.initialize(container, resolvedServices);\n\n // 5. 初始化路由管理器\n const routerManager = getRouterManager();\n if (options.router) {\n await routerManager.initialize(options.router);\n }\n\n // 6. 性能追踪\n const performanceTracker = appInstance.getPerformanceTracker();\n if (performanceTracker) {\n performanceTracker.recordServiceInit(servicesInitDuration);\n }\n\n // 6. 是否显示启动页\n const shouldShowSplash = shouldShowSplashScreen(options.showSplashScreen);\n\n const renderer = appInstance.getRenderer();\n\n // 8. 渲染应用函数\n const renderApp = async (context?: Awaited<ReturnType<typeof initialization>>) => {\n const renderStart = performance.now();\n \n // 触发渲染开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderStart(finalInstanceId);\n }\n \n await renderer.renderApp(options, resolvedServices, context);\n const renderDuration = performance.now() - renderStart;\n\n // 触发渲染完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderComplete(finalInstanceId, renderDuration);\n }\n\n // 优化:在应用渲染完成后,延迟初始化非关键服务\n // 使用 requestIdleCallback 在浏览器空闲时初始化,不影响用户体验\n if (resolvedServices.initializeNonCriticalServices) {\n resolvedServices.initializeNonCriticalServices().catch((error) => {\n logger.warn('非关键服务初始化失败(不影响应用运行):', error);\n });\n }\n\n if (performanceTracker) {\n performanceTracker.recordFirstRender(renderDuration);\n const totalDuration = performance.now() - startTime;\n performanceTracker.recordTotalStartup(totalDuration);\n performanceTracker.report();\n }\n \n // 触发应用启动完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppStarted(finalInstanceId, performance.now() - startTime);\n }\n\n // 统一发出 Kernel post-ready 事件,供可观测系统消费。\n kernelRuntime.getEventBus().emit('kernel.postReady', {\n traceId: kernelRuntime.traceId,\n instanceId: finalInstanceId,\n startupDuration: performance.now() - startTime,\n });\n\n // 开发模式下显示开发工具\n if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {\n // 延迟显示开发工具,避免影响首次渲染\n setTimeout(() => {\n const devToolsContainer = document.createElement('div');\n devToolsContainer.id = '__framework_dev_tools__';\n document.body.appendChild(devToolsContainer);\n \n // 这里需要动态导入React来渲染开发工具\n // 为了简化,暂时注释掉,后续可以完善\n // import('react-dom/client').then(({ createRoot }) => {\n // const root = createRoot(devToolsContainer);\n // root.render(<DevToolsTrigger appInstance={appInstance} />);\n // });\n }, 1000);\n }\n };\n\n if (shouldShowSplash) {\n // 场景1: 显示启动页,初始化在启动页中完成\n const onSplashComplete = (context: Awaited<ReturnType<typeof initialization>>) => {\n logger.info('启动页初始化完成');\n\n // 触发初始化完成事件\n if (frameworkEventManager) {\n const initDuration = context.duration || 0;\n frameworkEventManager.emitAppInitComplete(finalInstanceId, context, initDuration);\n }\n\n if (options.onSplashComplete) {\n Promise.resolve(\n options.onSplashComplete(() => {\n logger.info('框架加载完成');\n renderApp(context);\n }, context)\n ).catch((error) => {\n logger.error('onSplashComplete 回调执行失败:', error);\n initializationErrorState.setError(error);\n renderApp(context);\n });\n } else {\n logger.info('框架加载完成');\n renderApp(context);\n }\n };\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n // 渲染启动页\n renderer.renderSplashScreen(options, resolvedServices, onSplashComplete);\n } else {\n // 场景2: 不显示启动页,直接执行初始化\n logger.info('开始执行初始化(无启动页)');\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n try {\n const initStart = performance.now();\n\n // 使用中间件包装初始化函数\n const initContext = await middlewareManager.execute(\n options,\n async () => {\n return await initialization(options, (progress, step) => {\n logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);\n });\n }\n );\n\n const initDuration = performance.now() - initStart;\n \n // 触发初始化完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitComplete(finalInstanceId, initContext, initDuration);\n }\n \n if (performanceTracker) {\n performanceTracker.recordInitialization(initDuration);\n }\n\n logger.info('初始化完成(无启动页)', initContext);\n logger.info('框架加载完成');\n renderApp(initContext);\n } catch (error) {\n logger.error('初始化失败:', error);\n \n // 触发初始化错误事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitError(\n finalInstanceId,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n \n initializationErrorState.setError(error);\n renderApp();\n }\n }\n\n return instanceManager;\n } catch (error) {\n logger.error('框架启动失败:', error);\n\n // 触发错误事件\n if (frameworkEventManager) {\n const errorInstanceId = instanceId || instanceManager.getInstance()?.id;\n if (errorInstanceId) {\n frameworkEventManager.emitErrorOccurred(\n error instanceof Error ? error : new Error(String(error)),\n { phase: 'startup' }\n );\n }\n }\n\n if (kernelTraceId) {\n logger.error('Kernel Trace 失败上下文', { traceId: kernelTraceId });\n }\n\n // 如果容器存在,尝试渲染错误页面\n const container = options.container || envDetector.safeGetElement('#root');\n if (container) {\n const errorInstance = instanceManager.getInstance();\n if (errorInstance && errorInstance.isInitialized()) {\n const renderer = errorInstance.getRenderer();\n const services = errorInstance.getServices();\n initializationErrorState.setError(error);\n renderer.renderError(options, services);\n }\n }\n\n throw error;\n }\n}\n"],"names":["startApp","options","instanceId","startTime","performance","now","envDetector","getEnvironmentDetector","instanceManager","getAppInstanceManager","initTraceIdGenerator","traceId","generateTraceId","setCurrentTraceId","frameworkEventManager","kernelTraceId","container","safeGetElement","InitializationError","undefined","ErrorCode","CONTAINER_NOT_FOUND","logger","info","antd","uiProvider","warn","antdApp","uiApp","appInstance","createInstance","finalInstanceId","id","services","servicesInitPromise","ensureServicesInitialized","initializeServices","eventBus","kernelRuntime","startKernel","loggerLevel","locale","Object","keys","resources","theme","mode","primaryColor","compatibility","adapters","monitoring","initialize","captureError","error","metadata","reportMetric","name","value","tags","debug","state","getInstance","stateManager","emit","event","payload","on","handler","errorHandler","handle","handled","shouldThrow","enabledPhases","init","enablePostReady","servicesInitStart","resolvedServices","servicesInitDuration","FrameworkEventManager","emitAppStart","emitInstanceCreated","routerManager","getRouterManager","router","performanceTracker","getPerformanceTracker","recordServiceInit","shouldShowSplash","shouldShowSplashScreen","showSplashScreen","renderer","getRenderer","renderApp","context","renderStart","emitAppRenderStart","renderDuration","emitAppRenderComplete","initializeNonCriticalServices","catch","recordFirstRender","totalDuration","recordTotalStartup","report","emitAppStarted","getEventBus","startupDuration","process","env","NODE_ENV","window","setTimeout","devToolsContainer","document","createElement","body","appendChild","onSplashComplete","initDuration","duration","emitAppInitComplete","Promise","resolve","initializationErrorState","setError","emitAppInitStart","renderSplashScreen","initStart","initContext","middlewareManager","execute","initialization","progress","step","recordInitialization","emitAppInitError","Error","String","errorInstanceId","emitErrorOccurred","phase","errorInstance","isInitialized","getServices","renderError"],"mappings":"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"}
|
|
@@ -70,8 +70,6 @@ import { startKernel } from "../kernel";
|
|
|
70
70
|
// 3. 使用无 UI Kernel 管理启动阶段(配置、主题、i18n、服务注入、统一错误处理)
|
|
71
71
|
const kernelRuntime = await startKernel({
|
|
72
72
|
loggerLevel: options.loggerLevel,
|
|
73
|
-
configLoader: options.configStrategy?.loadCriticalConfig,
|
|
74
|
-
configFallback: options.configStrategy?.fallbackConfig,
|
|
75
73
|
locale: {
|
|
76
74
|
locale: (options.locale ? Object.keys(options.locale)[0] : 'zh-CN') || 'zh-CN',
|
|
77
75
|
resources: options.locale
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/startup/startApp.ts"],"sourcesContent":["/**\n * 应用启动主函数\n * 重构后的启动逻辑,集成所有新功能\n */\n\nimport { logger } from '../../utils';\nimport { ErrorCode, InitializationError } from '../../utils/errors';\nimport { initTraceIdGenerator, generateTraceId, setCurrentTraceId } from '../../utils/traceId';\nimport type { StartOptions } from '../types';\nimport { shouldShowSplashScreen } from '../splash';\nimport { initialization, initializationErrorState } from '../initialization/index';\nimport { middlewareManager } from '../middleware';\nimport { initializeServices } from './initializeServices';\nimport type { ServicesInitResult } from './initializeServices';\nimport { AppInstanceManager, getAppInstanceManager } from './AppInstance';\nimport { getEnvironmentDetector } from './environment';\nimport { getRouterManager } from '../router/RouterManager';\nimport { FrameworkEventManager } from '../event/frameworkEvents';\nimport { startKernel } from '../kernel';\n\n/**\n * 启动应用\n * \n * @param options - 启动配置选项\n * @param instanceId - 应用实例ID(可选,用于多实例场景)\n * @returns 应用实例\n */\nexport async function startApp(\n options: StartOptions = {},\n instanceId?: string\n): Promise<AppInstanceManager> {\n const startTime = performance.now();\n const envDetector = getEnvironmentDetector();\n const instanceManager = getAppInstanceManager();\n\n // 初始化追踪 ID 生成器\n initTraceIdGenerator('app');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n // 框架事件管理器(在服务初始化后创建)\n let frameworkEventManager: FrameworkEventManager | null = null;\n let kernelTraceId: string | null = null;\n\n try {\n // 1. 环境检测和容器获取\n const container = options.container || envDetector.safeGetElement('#root');\n if (!container) {\n throw new InitializationError(\n '未找到挂载容器',\n undefined,\n { container: options.container },\n ErrorCode.CONTAINER_NOT_FOUND\n );\n }\n\n logger.info('框架启动中...');\n\n if (options.antd && !options.uiProvider) {\n logger.warn('[deprecated] StartOptions.antd 即将废弃,请迁移到 StartOptions.uiProvider');\n }\n if (options.antdApp && !options.uiApp) {\n logger.warn('[deprecated] StartOptions.antdApp 即将废弃,请迁移到 StartOptions.uiApp');\n }\n\n // 2. 创建应用实例\n const appInstance = instanceManager.createInstance(instanceId, options);\n const finalInstanceId = appInstance.id;\n let services: ServicesInitResult | null = null;\n\n // 使用单次 Promise 防止重复初始化,提升加载速度并保证可观测数据一致。\n let servicesInitPromise: Promise<ServicesInitResult> | null = null;\n const ensureServicesInitialized = async (): Promise<ServicesInitResult> => {\n if (services) {\n return services;\n }\n if (!servicesInitPromise) {\n servicesInitPromise = initializeServices({\n ...options,\n eventBus: {\n ...options.eventBus,\n instanceId: finalInstanceId,\n },\n });\n }\n services = await servicesInitPromise;\n return services;\n };\n\n // 3. 使用无 UI Kernel 管理启动阶段(配置、主题、i18n、服务注入、统一错误处理)\n const kernelRuntime = await startKernel({\n loggerLevel: options.loggerLevel,\n configLoader: options.configStrategy?.loadCriticalConfig,\n configFallback: options.configStrategy?.fallbackConfig,\n locale: {\n locale: (options.locale ? (Object.keys(options.locale)[0] as any) : 'zh-CN') || 'zh-CN',\n resources: options.locale as any,\n },\n theme: {\n mode: options.theme?.mode || 'light',\n primaryColor: options.theme?.primaryColor,\n compatibility: {\n antd: (options.uiProvider || options.antd) as unknown as Record<string, unknown> | undefined,\n },\n },\n adapters: {\n monitoring: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n captureError: (error, metadata) => {\n if (services) {\n services.monitoring.captureError(error, metadata);\n } else {\n logger.error('Kernel 监控上报失败(服务尚未初始化):', error, metadata);\n }\n },\n reportMetric: (name, value, tags) => {\n logger.debug(`[kernel.metric] ${name}`, { value, tags, instanceId: finalInstanceId });\n },\n },\n state: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n getInstance: () => services?.stateManager ?? null,\n },\n eventBus: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n emit: (event, payload) => {\n if (services) {\n services.eventBus.emit(event as any, payload as any);\n }\n },\n on: (event, handler) => {\n if (!services) {\n return () => {};\n }\n return services.eventBus.on(event as any, handler as any);\n },\n },\n errorHandler: {\n async handle(error) {\n logger.error('Kernel 启动阶段失败:', error);\n return { handled: true, shouldThrow: true };\n },\n },\n },\n enabledPhases: {\n init: false,\n },\n enablePostReady: false,\n });\n kernelTraceId = kernelRuntime.traceId;\n\n const servicesInitStart = performance.now();\n const resolvedServices = await ensureServicesInitialized();\n const servicesInitDuration = performance.now() - servicesInitStart;\n\n // 创建框架事件管理器\n frameworkEventManager = new FrameworkEventManager(resolvedServices.eventBus);\n \n // 触发应用启动事件(使用真实的事件总线)\n frameworkEventManager.emitAppStart(finalInstanceId);\n \n // 触发实例创建事件\n frameworkEventManager.emitInstanceCreated(finalInstanceId);\n\n // 4. 初始化应用实例\n appInstance.initialize(container, resolvedServices);\n\n // 5. 初始化路由管理器\n const routerManager = getRouterManager();\n if (options.router) {\n await routerManager.initialize(options.router);\n }\n\n // 6. 性能追踪\n const performanceTracker = appInstance.getPerformanceTracker();\n if (performanceTracker) {\n performanceTracker.recordServiceInit(servicesInitDuration);\n }\n\n // 6. 是否显示启动页\n const shouldShowSplash = shouldShowSplashScreen(options.showSplashScreen);\n\n const renderer = appInstance.getRenderer();\n\n // 8. 渲染应用函数\n const renderApp = async (context?: Awaited<ReturnType<typeof initialization>>) => {\n const renderStart = performance.now();\n \n // 触发渲染开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderStart(finalInstanceId);\n }\n \n await renderer.renderApp(options, resolvedServices, context);\n const renderDuration = performance.now() - renderStart;\n\n // 触发渲染完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderComplete(finalInstanceId, renderDuration);\n }\n\n // 优化:在应用渲染完成后,延迟初始化非关键服务\n // 使用 requestIdleCallback 在浏览器空闲时初始化,不影响用户体验\n if (resolvedServices.initializeNonCriticalServices) {\n resolvedServices.initializeNonCriticalServices().catch((error) => {\n logger.warn('非关键服务初始化失败(不影响应用运行):', error);\n });\n }\n\n if (performanceTracker) {\n performanceTracker.recordFirstRender(renderDuration);\n const totalDuration = performance.now() - startTime;\n performanceTracker.recordTotalStartup(totalDuration);\n performanceTracker.report();\n }\n \n // 触发应用启动完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppStarted(finalInstanceId, performance.now() - startTime);\n }\n\n // 统一发出 Kernel post-ready 事件,供可观测系统消费。\n kernelRuntime.getEventBus().emit('kernel.postReady', {\n traceId: kernelRuntime.traceId,\n instanceId: finalInstanceId,\n startupDuration: performance.now() - startTime,\n });\n\n // 开发模式下显示开发工具\n if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {\n // 延迟显示开发工具,避免影响首次渲染\n setTimeout(() => {\n const devToolsContainer = document.createElement('div');\n devToolsContainer.id = '__framework_dev_tools__';\n document.body.appendChild(devToolsContainer);\n \n // 这里需要动态导入React来渲染开发工具\n // 为了简化,暂时注释掉,后续可以完善\n // import('react-dom/client').then(({ createRoot }) => {\n // const root = createRoot(devToolsContainer);\n // root.render(<DevToolsTrigger appInstance={appInstance} />);\n // });\n }, 1000);\n }\n };\n\n if (shouldShowSplash) {\n // 场景1: 显示启动页,初始化在启动页中完成\n const onSplashComplete = (context: Awaited<ReturnType<typeof initialization>>) => {\n logger.info('启动页初始化完成');\n\n // 触发初始化完成事件\n if (frameworkEventManager) {\n const initDuration = context.duration || 0;\n frameworkEventManager.emitAppInitComplete(finalInstanceId, context, initDuration);\n }\n\n if (options.onSplashComplete) {\n Promise.resolve(\n options.onSplashComplete(() => {\n logger.info('框架加载完成');\n renderApp(context);\n }, context)\n ).catch((error) => {\n logger.error('onSplashComplete 回调执行失败:', error);\n initializationErrorState.setError(error);\n renderApp(context);\n });\n } else {\n logger.info('框架加载完成');\n renderApp(context);\n }\n };\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n // 渲染启动页\n renderer.renderSplashScreen(options, resolvedServices, onSplashComplete);\n } else {\n // 场景2: 不显示启动页,直接执行初始化\n logger.info('开始执行初始化(无启动页)');\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n try {\n const initStart = performance.now();\n\n // 使用中间件包装初始化函数\n const initContext = await middlewareManager.execute(\n options,\n async () => {\n return await initialization(options, (progress, step) => {\n logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);\n });\n }\n );\n\n const initDuration = performance.now() - initStart;\n \n // 触发初始化完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitComplete(finalInstanceId, initContext, initDuration);\n }\n \n if (performanceTracker) {\n performanceTracker.recordInitialization(initDuration);\n }\n\n logger.info('初始化完成(无启动页)', initContext);\n logger.info('框架加载完成');\n renderApp(initContext);\n } catch (error) {\n logger.error('初始化失败:', error);\n \n // 触发初始化错误事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitError(\n finalInstanceId,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n \n initializationErrorState.setError(error);\n renderApp();\n }\n }\n\n return instanceManager;\n } catch (error) {\n logger.error('框架启动失败:', error);\n\n // 触发错误事件\n if (frameworkEventManager) {\n const errorInstanceId = instanceId || instanceManager.getInstance()?.id;\n if (errorInstanceId) {\n frameworkEventManager.emitErrorOccurred(\n error instanceof Error ? error : new Error(String(error)),\n { phase: 'startup' }\n );\n }\n }\n\n if (kernelTraceId) {\n logger.error('Kernel Trace 失败上下文', { traceId: kernelTraceId });\n }\n\n // 如果容器存在,尝试渲染错误页面\n const container = options.container || envDetector.safeGetElement('#root');\n if (container) {\n const errorInstance = instanceManager.getInstance();\n if (errorInstance && errorInstance.isInitialized()) {\n const renderer = errorInstance.getRenderer();\n const services = errorInstance.getServices();\n initializationErrorState.setError(error);\n renderer.renderError(options, services);\n }\n }\n\n throw error;\n }\n}\n"],"names":["logger","ErrorCode","InitializationError","initTraceIdGenerator","generateTraceId","setCurrentTraceId","shouldShowSplashScreen","initialization","initializationErrorState","middlewareManager","initializeServices","getAppInstanceManager","getEnvironmentDetector","getRouterManager","FrameworkEventManager","startKernel","startApp","options","instanceId","startTime","performance","now","envDetector","instanceManager","traceId","frameworkEventManager","kernelTraceId","container","safeGetElement","undefined","CONTAINER_NOT_FOUND","info","antd","uiProvider","warn","antdApp","uiApp","appInstance","createInstance","finalInstanceId","id","services","servicesInitPromise","ensureServicesInitialized","eventBus","kernelRuntime","loggerLevel","configLoader","configStrategy","loadCriticalConfig","configFallback","fallbackConfig","locale","Object","keys","resources","theme","mode","primaryColor","compatibility","adapters","monitoring","initialize","captureError","error","metadata","reportMetric","name","value","tags","debug","state","getInstance","stateManager","emit","event","payload","on","handler","errorHandler","handle","handled","shouldThrow","enabledPhases","init","enablePostReady","servicesInitStart","resolvedServices","servicesInitDuration","emitAppStart","emitInstanceCreated","routerManager","router","performanceTracker","getPerformanceTracker","recordServiceInit","shouldShowSplash","showSplashScreen","renderer","getRenderer","renderApp","context","renderStart","emitAppRenderStart","renderDuration","emitAppRenderComplete","initializeNonCriticalServices","catch","recordFirstRender","totalDuration","recordTotalStartup","report","emitAppStarted","getEventBus","startupDuration","process","env","NODE_ENV","window","setTimeout","devToolsContainer","document","createElement","body","appendChild","onSplashComplete","initDuration","duration","emitAppInitComplete","Promise","resolve","setError","emitAppInitStart","renderSplashScreen","initStart","initContext","execute","progress","step","recordInitialization","emitAppInitError","Error","String","errorInstanceId","emitErrorOccurred","phase","errorInstance","isInitialized","getServices","renderError"],"mappings":"AAAA;;;CAGC,GAED,SAASA,MAAM,QAAQ,cAAc;AACrC,SAASC,SAAS,EAAEC,mBAAmB,QAAQ,qBAAqB;AACpE,SAASC,oBAAoB,EAAEC,eAAe,EAAEC,iBAAiB,QAAQ,sBAAsB;AAE/F,SAASC,sBAAsB,QAAQ,YAAY;AACnD,SAASC,cAAc,EAAEC,wBAAwB,QAAQ,0BAA0B;AACnF,SAASC,iBAAiB,QAAQ,gBAAgB;AAClD,SAASC,kBAAkB,QAAQ,uBAAuB;AAE1D,SAA6BC,qBAAqB,QAAQ,gBAAgB;AAC1E,SAASC,sBAAsB,QAAQ,gBAAgB;AACvD,SAASC,gBAAgB,QAAQ,0BAA0B;AAC3D,SAASC,qBAAqB,QAAQ,2BAA2B;AACjE,SAASC,WAAW,QAAQ,YAAY;AAExC;;;;;;CAMC,GACD,OAAO,eAAeC,SACpBC,UAAwB,CAAC,CAAC,EAC1BC,UAAmB;IAEnB,MAAMC,YAAYC,YAAYC,GAAG;IACjC,MAAMC,cAAcV;IACpB,MAAMW,kBAAkBZ;IAExB,eAAe;IACfR,qBAAqB;IACrB,MAAMqB,UAAUpB;IAChBC,kBAAkBmB;IAElB,qBAAqB;IACrB,IAAIC,wBAAsD;IAC1D,IAAIC,gBAA+B;IAEnC,IAAI;QACF,eAAe;QACf,MAAMC,YAAYV,QAAQU,SAAS,IAAIL,YAAYM,cAAc,CAAC;QAClE,IAAI,CAACD,WAAW;YACd,MAAM,IAAIzB,oBACR,WACA2B,WACA;gBAAEF,WAAWV,QAAQU,SAAS;YAAC,GAC/B1B,UAAU6B,mBAAmB;QAEjC;QAEA9B,OAAO+B,IAAI,CAAC;QAEZ,IAAId,QAAQe,IAAI,IAAI,CAACf,QAAQgB,UAAU,EAAE;YACvCjC,OAAOkC,IAAI,CAAC;QACd;QACA,IAAIjB,QAAQkB,OAAO,IAAI,CAAClB,QAAQmB,KAAK,EAAE;YACrCpC,OAAOkC,IAAI,CAAC;QACd;QAEA,YAAY;QACZ,MAAMG,cAAcd,gBAAgBe,cAAc,CAACpB,YAAYD;QAC/D,MAAMsB,kBAAkBF,YAAYG,EAAE;QACtC,IAAIC,WAAsC;QAE1C,yCAAyC;QACzC,IAAIC,sBAA0D;QAC9D,MAAMC,4BAA4B;YAChC,IAAIF,UAAU;gBACZ,OAAOA;YACT;YACA,IAAI,CAACC,qBAAqB;gBACxBA,sBAAsBhC,mBAAmB;oBACvC,GAAGO,OAAO;oBACV2B,UAAU;wBACR,GAAG3B,QAAQ2B,QAAQ;wBACnB1B,YAAYqB;oBACd;gBACF;YACF;YACAE,WAAW,MAAMC;YACjB,OAAOD;QACT;QAEA,kDAAkD;QAClD,MAAMI,gBAAgB,MAAM9B,YAAY;YACtC+B,aAAa7B,QAAQ6B,WAAW;YAChCC,cAAc9B,QAAQ+B,cAAc,EAAEC;YACtCC,gBAAgBjC,QAAQ+B,cAAc,EAAEG;YACxCC,QAAQ;gBACNA,QAAQ,AAACnC,CAAAA,QAAQmC,MAAM,GAAIC,OAAOC,IAAI,CAACrC,QAAQmC,MAAM,CAAC,CAAC,EAAE,GAAW,OAAM,KAAM;gBAChFG,WAAWtC,QAAQmC,MAAM;YAC3B;YACAI,OAAO;gBACLC,MAAMxC,QAAQuC,KAAK,EAAEC,QAAQ;gBAC7BC,cAAczC,QAAQuC,KAAK,EAAEE;gBAC7BC,eAAe;oBACb3B,MAAOf,QAAQgB,UAAU,IAAIhB,QAAQe,IAAI;gBAC3C;YACF;YACA4B,UAAU;gBACRC,YAAY;oBACVC,YAAY;wBACV,MAAMnB;oBACR;oBACAoB,cAAc,CAACC,OAAOC;wBACpB,IAAIxB,UAAU;4BACZA,SAASoB,UAAU,CAACE,YAAY,CAACC,OAAOC;wBAC1C,OAAO;4BACLjE,OAAOgE,KAAK,CAAC,2BAA2BA,OAAOC;wBACjD;oBACF;oBACAC,cAAc,CAACC,MAAMC,OAAOC;wBAC1BrE,OAAOsE,KAAK,CAAC,CAAC,gBAAgB,EAAEH,MAAM,EAAE;4BAAEC;4BAAOC;4BAAMnD,YAAYqB;wBAAgB;oBACrF;gBACF;gBACAgC,OAAO;oBACLT,YAAY;wBACV,MAAMnB;oBACR;oBACA6B,aAAa,IAAM/B,UAAUgC,gBAAgB;gBAC/C;gBACA7B,UAAU;oBACRkB,YAAY;wBACV,MAAMnB;oBACR;oBACA+B,MAAM,CAACC,OAAOC;wBACZ,IAAInC,UAAU;4BACZA,SAASG,QAAQ,CAAC8B,IAAI,CAACC,OAAcC;wBACvC;oBACF;oBACAC,IAAI,CAACF,OAAOG;wBACV,IAAI,CAACrC,UAAU;4BACb,OAAO,KAAO;wBAChB;wBACA,OAAOA,SAASG,QAAQ,CAACiC,EAAE,CAACF,OAAcG;oBAC5C;gBACF;gBACAC,cAAc;oBACZ,MAAMC,QAAOhB,KAAK;wBAChBhE,OAAOgE,KAAK,CAAC,kBAAkBA;wBAC/B,OAAO;4BAAEiB,SAAS;4BAAMC,aAAa;wBAAK;oBAC5C;gBACF;YACF;YACAC,eAAe;gBACbC,MAAM;YACR;YACAC,iBAAiB;QACnB;QACA3D,gBAAgBmB,cAAcrB,OAAO;QAErC,MAAM8D,oBAAoBlE,YAAYC,GAAG;QACzC,MAAMkE,mBAAmB,MAAM5C;QAC/B,MAAM6C,uBAAuBpE,YAAYC,GAAG,KAAKiE;QAEjD,YAAY;QACZ7D,wBAAwB,IAAIX,sBAAsByE,iBAAiB3C,QAAQ;QAE3E,sBAAsB;QACtBnB,sBAAsBgE,YAAY,CAAClD;QAEnC,WAAW;QACXd,sBAAsBiE,mBAAmB,CAACnD;QAE1C,aAAa;QACbF,YAAYyB,UAAU,CAACnC,WAAW4D;QAElC,cAAc;QACd,MAAMI,gBAAgB9E;QACtB,IAAII,QAAQ2E,MAAM,EAAE;YAClB,MAAMD,cAAc7B,UAAU,CAAC7C,QAAQ2E,MAAM;QAC/C;QAEA,UAAU;QACV,MAAMC,qBAAqBxD,YAAYyD,qBAAqB;QAC5D,IAAID,oBAAoB;YACtBA,mBAAmBE,iBAAiB,CAACP;QACvC;QAEA,aAAa;QACb,MAAMQ,mBAAmB1F,uBAAuBW,QAAQgF,gBAAgB;QAExE,MAAMC,WAAW7D,YAAY8D,WAAW;QAExC,YAAY;QACZ,MAAMC,YAAY,OAAOC;YACvB,MAAMC,cAAclF,YAAYC,GAAG;YAEnC,WAAW;YACX,IAAII,uBAAuB;gBACzBA,sBAAsB8E,kBAAkB,CAAChE;YAC3C;YAEA,MAAM2D,SAASE,SAAS,CAACnF,SAASsE,kBAAkBc;YACpD,MAAMG,iBAAiBpF,YAAYC,GAAG,KAAKiF;YAE3C,WAAW;YACX,IAAI7E,uBAAuB;gBACzBA,sBAAsBgF,qBAAqB,CAAClE,iBAAiBiE;YAC/D;YAEA,yBAAyB;YACzB,4CAA4C;YAC5C,IAAIjB,iBAAiBmB,6BAA6B,EAAE;gBAClDnB,iBAAiBmB,6BAA6B,GAAGC,KAAK,CAAC,CAAC3C;oBACtDhE,OAAOkC,IAAI,CAAC,wBAAwB8B;gBACtC;YACF;YAEA,IAAI6B,oBAAoB;gBACtBA,mBAAmBe,iBAAiB,CAACJ;gBACrC,MAAMK,gBAAgBzF,YAAYC,GAAG,KAAKF;gBAC1C0E,mBAAmBiB,kBAAkB,CAACD;gBACtChB,mBAAmBkB,MAAM;YAC3B;YAEA,aAAa;YACb,IAAItF,uBAAuB;gBACzBA,sBAAsBuF,cAAc,CAACzE,iBAAiBnB,YAAYC,GAAG,KAAKF;YAC5E;YAEA,sCAAsC;YACtC0B,cAAcoE,WAAW,GAAGvC,IAAI,CAAC,oBAAoB;gBACnDlD,SAASqB,cAAcrB,OAAO;gBAC9BN,YAAYqB;gBACZ2E,iBAAiB9F,YAAYC,GAAG,KAAKF;YACvC;YAEA,cAAc;YACd,IAAIgG,QAAQC,GAAG,CAACC,QAAQ,KAAK,iBAAiB,OAAOC,WAAW,aAAa;gBAC3E,oBAAoB;gBACpBC,WAAW;oBACT,MAAMC,oBAAoBC,SAASC,aAAa,CAAC;oBACjDF,kBAAkBhF,EAAE,GAAG;oBACvBiF,SAASE,IAAI,CAACC,WAAW,CAACJ;gBAE1B,uBAAuB;gBACvB,oBAAoB;gBACpB,wDAAwD;gBACxD,gDAAgD;gBAChD,gEAAgE;gBAChE,MAAM;gBACR,GAAG;YACL;QACF;QAEA,IAAIxB,kBAAkB;YACpB,wBAAwB;YACxB,MAAM6B,mBAAmB,CAACxB;gBACxBrG,OAAO+B,IAAI,CAAC;gBAEZ,YAAY;gBACZ,IAAIN,uBAAuB;oBACzB,MAAMqG,eAAezB,QAAQ0B,QAAQ,IAAI;oBACzCtG,sBAAsBuG,mBAAmB,CAACzF,iBAAiB8D,SAASyB;gBACtE;gBAEA,IAAI7G,QAAQ4G,gBAAgB,EAAE;oBAC5BI,QAAQC,OAAO,CACbjH,QAAQ4G,gBAAgB,CAAC;wBACvB7H,OAAO+B,IAAI,CAAC;wBACZqE,UAAUC;oBACZ,GAAGA,UACHM,KAAK,CAAC,CAAC3C;wBACPhE,OAAOgE,KAAK,CAAC,4BAA4BA;wBACzCxD,yBAAyB2H,QAAQ,CAACnE;wBAClCoC,UAAUC;oBACZ;gBACF,OAAO;oBACLrG,OAAO+B,IAAI,CAAC;oBACZqE,UAAUC;gBACZ;YACF;YAEA,YAAY;YACZ,IAAI5E,uBAAuB;gBACzBA,sBAAsB2G,gBAAgB,CAAC7F;YACzC;YAEA,QAAQ;YACR2D,SAASmC,kBAAkB,CAACpH,SAASsE,kBAAkBsC;QACzD,OAAO;YACL,sBAAsB;YACtB7H,OAAO+B,IAAI,CAAC;YAEZ,YAAY;YACZ,IAAIN,uBAAuB;gBACzBA,sBAAsB2G,gBAAgB,CAAC7F;YACzC;YAEA,IAAI;gBACF,MAAM+F,YAAYlH,YAAYC,GAAG;gBAEjC,eAAe;gBACf,MAAMkH,cAAc,MAAM9H,kBAAkB+H,OAAO,CACjDvH,SACA;oBACE,OAAO,MAAMV,eAAeU,SAAS,CAACwH,UAAUC;wBAC9C1I,OAAOsE,KAAK,CAAC,CAAC,OAAO,EAAEmE,SAAS,CAAC,EAAEC,OAAO,CAAC,GAAG,EAAEA,MAAM,GAAG,IAAI;oBAC/D;gBACF;gBAGF,MAAMZ,eAAe1G,YAAYC,GAAG,KAAKiH;gBAEzC,YAAY;gBACZ,IAAI7G,uBAAuB;oBACzBA,sBAAsBuG,mBAAmB,CAACzF,iBAAiBgG,aAAaT;gBAC1E;gBAEA,IAAIjC,oBAAoB;oBACtBA,mBAAmB8C,oBAAoB,CAACb;gBAC1C;gBAEA9H,OAAO+B,IAAI,CAAC,eAAewG;gBAC3BvI,OAAO+B,IAAI,CAAC;gBACZqE,UAAUmC;YACZ,EAAE,OAAOvE,OAAO;gBACdhE,OAAOgE,KAAK,CAAC,UAAUA;gBAEvB,YAAY;gBACZ,IAAIvC,uBAAuB;oBACzBA,sBAAsBmH,gBAAgB,CACpCrG,iBACAyB,iBAAiB6E,QAAQ7E,QAAQ,IAAI6E,MAAMC,OAAO9E;gBAEtD;gBAEAxD,yBAAyB2H,QAAQ,CAACnE;gBAClCoC;YACF;QACF;QAEA,OAAO7E;IACT,EAAE,OAAOyC,OAAO;QACdhE,OAAOgE,KAAK,CAAC,WAAWA;QAExB,SAAS;QACT,IAAIvC,uBAAuB;YACzB,MAAMsH,kBAAkB7H,cAAcK,gBAAgBiD,WAAW,IAAIhC;YACrE,IAAIuG,iBAAiB;gBACnBtH,sBAAsBuH,iBAAiB,CACrChF,iBAAiB6E,QAAQ7E,QAAQ,IAAI6E,MAAMC,OAAO9E,SAClD;oBAAEiF,OAAO;gBAAU;YAEvB;QACF;QAEA,IAAIvH,eAAe;YACjB1B,OAAOgE,KAAK,CAAC,sBAAsB;gBAAExC,SAASE;YAAc;QAC9D;QAEA,kBAAkB;QAClB,MAAMC,YAAYV,QAAQU,SAAS,IAAIL,YAAYM,cAAc,CAAC;QAClE,IAAID,WAAW;YACb,MAAMuH,gBAAgB3H,gBAAgBiD,WAAW;YACjD,IAAI0E,iBAAiBA,cAAcC,aAAa,IAAI;gBAClD,MAAMjD,WAAWgD,cAAc/C,WAAW;gBAC1C,MAAM1D,WAAWyG,cAAcE,WAAW;gBAC1C5I,yBAAyB2H,QAAQ,CAACnE;gBAClCkC,SAASmD,WAAW,CAACpI,SAASwB;YAChC;QACF;QAEA,MAAMuB;IACR;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/startup/startApp.ts"],"sourcesContent":["/**\n * 应用启动主函数\n * 重构后的启动逻辑,集成所有新功能\n */\n\nimport { logger } from '../../utils';\nimport { ErrorCode, InitializationError } from '../../utils/errors';\nimport { initTraceIdGenerator, generateTraceId, setCurrentTraceId } from '../../utils/traceId';\nimport type { StartOptions } from '../types';\nimport { shouldShowSplashScreen } from '../splash';\nimport { initialization, initializationErrorState } from '../initialization/index';\nimport { middlewareManager } from '../middleware';\nimport { initializeServices } from './initializeServices';\nimport type { ServicesInitResult } from './initializeServices';\nimport { AppInstanceManager, getAppInstanceManager } from './AppInstance';\nimport { getEnvironmentDetector } from './environment';\nimport { getRouterManager } from '../router/RouterManager';\nimport { FrameworkEventManager } from '../event/frameworkEvents';\nimport { startKernel } from '../kernel';\n\n/**\n * 启动应用\n * \n * @param options - 启动配置选项\n * @param instanceId - 应用实例ID(可选,用于多实例场景)\n * @returns 应用实例\n */\nexport async function startApp(\n options: StartOptions = {},\n instanceId?: string\n): Promise<AppInstanceManager> {\n const startTime = performance.now();\n const envDetector = getEnvironmentDetector();\n const instanceManager = getAppInstanceManager();\n\n // 初始化追踪 ID 生成器\n initTraceIdGenerator('app');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n // 框架事件管理器(在服务初始化后创建)\n let frameworkEventManager: FrameworkEventManager | null = null;\n let kernelTraceId: string | null = null;\n\n try {\n // 1. 环境检测和容器获取\n const container = options.container || envDetector.safeGetElement('#root');\n if (!container) {\n throw new InitializationError(\n '未找到挂载容器',\n undefined,\n { container: options.container },\n ErrorCode.CONTAINER_NOT_FOUND\n );\n }\n\n logger.info('框架启动中...');\n\n if (options.antd && !options.uiProvider) {\n logger.warn('[deprecated] StartOptions.antd 即将废弃,请迁移到 StartOptions.uiProvider');\n }\n if (options.antdApp && !options.uiApp) {\n logger.warn('[deprecated] StartOptions.antdApp 即将废弃,请迁移到 StartOptions.uiApp');\n }\n\n // 2. 创建应用实例\n const appInstance = instanceManager.createInstance(instanceId, options);\n const finalInstanceId = appInstance.id;\n let services: ServicesInitResult | null = null;\n\n // 使用单次 Promise 防止重复初始化,提升加载速度并保证可观测数据一致。\n let servicesInitPromise: Promise<ServicesInitResult> | null = null;\n const ensureServicesInitialized = async (): Promise<ServicesInitResult> => {\n if (services) {\n return services;\n }\n if (!servicesInitPromise) {\n servicesInitPromise = initializeServices({\n ...options,\n eventBus: {\n ...options.eventBus,\n instanceId: finalInstanceId,\n },\n });\n }\n services = await servicesInitPromise;\n return services;\n };\n\n // 3. 使用无 UI Kernel 管理启动阶段(配置、主题、i18n、服务注入、统一错误处理)\n const kernelRuntime = await startKernel({\n loggerLevel: options.loggerLevel,\n locale: {\n locale: (options.locale ? (Object.keys(options.locale)[0] as any) : 'zh-CN') || 'zh-CN',\n resources: options.locale as any,\n },\n theme: {\n mode: options.theme?.mode || 'light',\n primaryColor: options.theme?.primaryColor,\n compatibility: {\n antd: (options.uiProvider || options.antd) as unknown as Record<string, unknown> | undefined,\n },\n },\n adapters: {\n monitoring: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n captureError: (error, metadata) => {\n if (services) {\n services.monitoring.captureError(error, metadata);\n } else {\n logger.error('Kernel 监控上报失败(服务尚未初始化):', error, metadata);\n }\n },\n reportMetric: (name, value, tags) => {\n logger.debug(`[kernel.metric] ${name}`, { value, tags, instanceId: finalInstanceId });\n },\n },\n state: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n getInstance: () => services?.stateManager ?? null,\n },\n eventBus: {\n initialize: async () => {\n await ensureServicesInitialized();\n },\n emit: (event, payload) => {\n if (services) {\n services.eventBus.emit(event as any, payload as any);\n }\n },\n on: (event, handler) => {\n if (!services) {\n return () => {};\n }\n return services.eventBus.on(event as any, handler as any);\n },\n },\n errorHandler: {\n async handle(error) {\n logger.error('Kernel 启动阶段失败:', error);\n return { handled: true, shouldThrow: true };\n },\n },\n },\n enabledPhases: {\n init: false,\n },\n enablePostReady: false,\n });\n kernelTraceId = kernelRuntime.traceId;\n\n const servicesInitStart = performance.now();\n const resolvedServices = await ensureServicesInitialized();\n const servicesInitDuration = performance.now() - servicesInitStart;\n\n // 创建框架事件管理器\n frameworkEventManager = new FrameworkEventManager(resolvedServices.eventBus);\n \n // 触发应用启动事件(使用真实的事件总线)\n frameworkEventManager.emitAppStart(finalInstanceId);\n \n // 触发实例创建事件\n frameworkEventManager.emitInstanceCreated(finalInstanceId);\n\n // 4. 初始化应用实例\n appInstance.initialize(container, resolvedServices);\n\n // 5. 初始化路由管理器\n const routerManager = getRouterManager();\n if (options.router) {\n await routerManager.initialize(options.router);\n }\n\n // 6. 性能追踪\n const performanceTracker = appInstance.getPerformanceTracker();\n if (performanceTracker) {\n performanceTracker.recordServiceInit(servicesInitDuration);\n }\n\n // 6. 是否显示启动页\n const shouldShowSplash = shouldShowSplashScreen(options.showSplashScreen);\n\n const renderer = appInstance.getRenderer();\n\n // 8. 渲染应用函数\n const renderApp = async (context?: Awaited<ReturnType<typeof initialization>>) => {\n const renderStart = performance.now();\n \n // 触发渲染开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderStart(finalInstanceId);\n }\n \n await renderer.renderApp(options, resolvedServices, context);\n const renderDuration = performance.now() - renderStart;\n\n // 触发渲染完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderComplete(finalInstanceId, renderDuration);\n }\n\n // 优化:在应用渲染完成后,延迟初始化非关键服务\n // 使用 requestIdleCallback 在浏览器空闲时初始化,不影响用户体验\n if (resolvedServices.initializeNonCriticalServices) {\n resolvedServices.initializeNonCriticalServices().catch((error) => {\n logger.warn('非关键服务初始化失败(不影响应用运行):', error);\n });\n }\n\n if (performanceTracker) {\n performanceTracker.recordFirstRender(renderDuration);\n const totalDuration = performance.now() - startTime;\n performanceTracker.recordTotalStartup(totalDuration);\n performanceTracker.report();\n }\n \n // 触发应用启动完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppStarted(finalInstanceId, performance.now() - startTime);\n }\n\n // 统一发出 Kernel post-ready 事件,供可观测系统消费。\n kernelRuntime.getEventBus().emit('kernel.postReady', {\n traceId: kernelRuntime.traceId,\n instanceId: finalInstanceId,\n startupDuration: performance.now() - startTime,\n });\n\n // 开发模式下显示开发工具\n if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {\n // 延迟显示开发工具,避免影响首次渲染\n setTimeout(() => {\n const devToolsContainer = document.createElement('div');\n devToolsContainer.id = '__framework_dev_tools__';\n document.body.appendChild(devToolsContainer);\n \n // 这里需要动态导入React来渲染开发工具\n // 为了简化,暂时注释掉,后续可以完善\n // import('react-dom/client').then(({ createRoot }) => {\n // const root = createRoot(devToolsContainer);\n // root.render(<DevToolsTrigger appInstance={appInstance} />);\n // });\n }, 1000);\n }\n };\n\n if (shouldShowSplash) {\n // 场景1: 显示启动页,初始化在启动页中完成\n const onSplashComplete = (context: Awaited<ReturnType<typeof initialization>>) => {\n logger.info('启动页初始化完成');\n\n // 触发初始化完成事件\n if (frameworkEventManager) {\n const initDuration = context.duration || 0;\n frameworkEventManager.emitAppInitComplete(finalInstanceId, context, initDuration);\n }\n\n if (options.onSplashComplete) {\n Promise.resolve(\n options.onSplashComplete(() => {\n logger.info('框架加载完成');\n renderApp(context);\n }, context)\n ).catch((error) => {\n logger.error('onSplashComplete 回调执行失败:', error);\n initializationErrorState.setError(error);\n renderApp(context);\n });\n } else {\n logger.info('框架加载完成');\n renderApp(context);\n }\n };\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n // 渲染启动页\n renderer.renderSplashScreen(options, resolvedServices, onSplashComplete);\n } else {\n // 场景2: 不显示启动页,直接执行初始化\n logger.info('开始执行初始化(无启动页)');\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n try {\n const initStart = performance.now();\n\n // 使用中间件包装初始化函数\n const initContext = await middlewareManager.execute(\n options,\n async () => {\n return await initialization(options, (progress, step) => {\n logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);\n });\n }\n );\n\n const initDuration = performance.now() - initStart;\n \n // 触发初始化完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitComplete(finalInstanceId, initContext, initDuration);\n }\n \n if (performanceTracker) {\n performanceTracker.recordInitialization(initDuration);\n }\n\n logger.info('初始化完成(无启动页)', initContext);\n logger.info('框架加载完成');\n renderApp(initContext);\n } catch (error) {\n logger.error('初始化失败:', error);\n \n // 触发初始化错误事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitError(\n finalInstanceId,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n \n initializationErrorState.setError(error);\n renderApp();\n }\n }\n\n return instanceManager;\n } catch (error) {\n logger.error('框架启动失败:', error);\n\n // 触发错误事件\n if (frameworkEventManager) {\n const errorInstanceId = instanceId || instanceManager.getInstance()?.id;\n if (errorInstanceId) {\n frameworkEventManager.emitErrorOccurred(\n error instanceof Error ? error : new Error(String(error)),\n { phase: 'startup' }\n );\n }\n }\n\n if (kernelTraceId) {\n logger.error('Kernel Trace 失败上下文', { traceId: kernelTraceId });\n }\n\n // 如果容器存在,尝试渲染错误页面\n const container = options.container || envDetector.safeGetElement('#root');\n if (container) {\n const errorInstance = instanceManager.getInstance();\n if (errorInstance && errorInstance.isInitialized()) {\n const renderer = errorInstance.getRenderer();\n const services = errorInstance.getServices();\n initializationErrorState.setError(error);\n renderer.renderError(options, services);\n }\n }\n\n throw error;\n }\n}\n"],"names":["logger","ErrorCode","InitializationError","initTraceIdGenerator","generateTraceId","setCurrentTraceId","shouldShowSplashScreen","initialization","initializationErrorState","middlewareManager","initializeServices","getAppInstanceManager","getEnvironmentDetector","getRouterManager","FrameworkEventManager","startKernel","startApp","options","instanceId","startTime","performance","now","envDetector","instanceManager","traceId","frameworkEventManager","kernelTraceId","container","safeGetElement","undefined","CONTAINER_NOT_FOUND","info","antd","uiProvider","warn","antdApp","uiApp","appInstance","createInstance","finalInstanceId","id","services","servicesInitPromise","ensureServicesInitialized","eventBus","kernelRuntime","loggerLevel","locale","Object","keys","resources","theme","mode","primaryColor","compatibility","adapters","monitoring","initialize","captureError","error","metadata","reportMetric","name","value","tags","debug","state","getInstance","stateManager","emit","event","payload","on","handler","errorHandler","handle","handled","shouldThrow","enabledPhases","init","enablePostReady","servicesInitStart","resolvedServices","servicesInitDuration","emitAppStart","emitInstanceCreated","routerManager","router","performanceTracker","getPerformanceTracker","recordServiceInit","shouldShowSplash","showSplashScreen","renderer","getRenderer","renderApp","context","renderStart","emitAppRenderStart","renderDuration","emitAppRenderComplete","initializeNonCriticalServices","catch","recordFirstRender","totalDuration","recordTotalStartup","report","emitAppStarted","getEventBus","startupDuration","process","env","NODE_ENV","window","setTimeout","devToolsContainer","document","createElement","body","appendChild","onSplashComplete","initDuration","duration","emitAppInitComplete","Promise","resolve","setError","emitAppInitStart","renderSplashScreen","initStart","initContext","execute","progress","step","recordInitialization","emitAppInitError","Error","String","errorInstanceId","emitErrorOccurred","phase","errorInstance","isInitialized","getServices","renderError"],"mappings":"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"}
|