@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/analytics.umd.js
CHANGED
package/dist/core/index.cjs
CHANGED
|
@@ -84,7 +84,6 @@ const _plugin = require("./plugin");
|
|
|
84
84
|
_export_star(require("./startup"), exports);
|
|
85
85
|
_export_star(require("./config"), exports);
|
|
86
86
|
_export_star(require("./kernel"), exports);
|
|
87
|
-
_export_star(require("./ui-adapter"), exports);
|
|
88
87
|
_export_star(require("./router"), exports);
|
|
89
88
|
_export_star(require("./event"), exports);
|
|
90
89
|
const _DevTools = require("./dev/DevTools");
|
package/dist/core/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/index.tsx"],"sourcesContent":["import type { StartOptions } from \"./types\";\nimport { storage } from '../library';\nimport { StateManager } from '../state';\nimport { startApp } from './startup/startApp';\nimport { getAppInstanceManager } from './startup/AppInstance';\n\n\n/**\n * 启动框架\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * loggerLevel: LogLevel.DEBUG,\n * lifecycle: {\n * beforeInitialization: async () => {\n * console.log('初始化前执行');\n * },\n * },\n * });\n * ```\n */\n/**\n * 启动框架(向后兼容的API)\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @deprecated 建议使用 startApp 函数,支持多实例\n */\nconst start = async (options: StartOptions = {}): Promise<void> => {\n // 使用新的启动函数,保持向后兼容\n await startApp(options);\n};\n\n// 导出新的启动函数\nexport { startApp } from './startup/startApp';\nexport { getAppInstanceManager } from './startup/AppInstance';\nexport type { AppInstance } from './startup/AppInstance';\n\n// 导出向后兼容的start函数\nexport {\n start,\n storage,\n};\n\n// 导出getStateManager(向后兼容)\nexport const getStateManager = (): StateManager | null => {\n const instanceManager = getAppInstanceManager();\n const instance = instanceManager.getInstance();\n if (instance) {\n return instance.getServices().stateManager;\n }\n return null;\n};\n\n// 导出应用上下文相关功能\nexport {\n AppContextProvider,\n useAppContext,\n useTheme,\n useLocale,\n useConfig,\n useStateManager,\n} from './app';\n\n// 导出错误边界\nexport { ErrorBoundary, withErrorBoundary, useErrorHandler } from './error';\nexport type { ErrorBoundaryProps } from './error';\n\n// 导出应用配置单例\nexport { appConfig } from './config/AppConfig';\n\n// 导出初始化相关类型\nexport type {\n InitializationContext,\n
|
|
1
|
+
{"version":3,"sources":["../../src/core/index.tsx"],"sourcesContent":["import type { StartOptions } from \"./types\";\nimport { storage } from '../library';\nimport { StateManager } from '../state';\nimport { startApp } from './startup/startApp';\nimport { getAppInstanceManager } from './startup/AppInstance';\n\n\n/**\n * 启动框架\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * loggerLevel: LogLevel.DEBUG,\n * lifecycle: {\n * beforeInitialization: async () => {\n * console.log('初始化前执行');\n * },\n * },\n * });\n * ```\n */\n/**\n * 启动框架(向后兼容的API)\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @deprecated 建议使用 startApp 函数,支持多实例\n */\nconst start = async (options: StartOptions = {}): Promise<void> => {\n // 使用新的启动函数,保持向后兼容\n await startApp(options);\n};\n\n// 导出新的启动函数\nexport { startApp } from './startup/startApp';\nexport { getAppInstanceManager } from './startup/AppInstance';\nexport type { AppInstance } from './startup/AppInstance';\n\n// 导出向后兼容的start函数\nexport {\n start,\n storage,\n};\n\n// 导出getStateManager(向后兼容)\nexport const getStateManager = (): StateManager | null => {\n const instanceManager = getAppInstanceManager();\n const instance = instanceManager.getInstance();\n if (instance) {\n return instance.getServices().stateManager;\n }\n return null;\n};\n\n// 导出应用上下文相关功能\nexport {\n AppContextProvider,\n useAppContext,\n useTheme,\n useLocale,\n useConfig,\n useStateManager,\n} from './app';\n\n// 导出错误边界\nexport { ErrorBoundary, withErrorBoundary, useErrorHandler } from './error';\nexport type { ErrorBoundaryProps } from './error';\n\n// 导出应用配置单例\nexport { appConfig } from './config/AppConfig';\n\n// 导出初始化相关类型\nexport type {\n InitializationContext,\n InitializationOptions,\n ProgressCallback,\n} from './initialization';\n\n// 导出中间件\nexport { MiddlewareManager, middlewareManager } from './middleware';\nexport type { Middleware } from './middleware';\n\n// 导出插件\nexport { PluginManager, pluginManager } from './plugin';\nexport type { Plugin } from './plugin';\n\n// 导出应用上下文相关类型\nexport type {\n AppContextValue,\n ThemeContextValue,\n LocaleContextValue,\n ConfigContextValue,\n StateManagerContextValue,\n ThemeConfig,\n AppConfig,\n AppContextProviderProps,\n} from './app';\n\n// 导出启动配置相关类型\nexport type { StartOptions, ManagerLifecycle, SplashScreenCustomProps } from './types';\n\n// 导出启动相关模块\nexport * from './startup';\nexport * from './config';\nexport * from './kernel';\n\n// 导出路由相关模块\nexport * from './router';\n\n// 导出事件系统\nexport * from './event';\n\n// 导出开发工具\nexport { DevTools, DevToolsTrigger } from './dev/DevTools';\n"],"names":["AppContextProvider","DevTools","DevToolsTrigger","ErrorBoundary","MiddlewareManager","PluginManager","appConfig","getAppInstanceManager","getStateManager","middlewareManager","pluginManager","start","startApp","storage","useAppContext","useConfig","useErrorHandler","useLocale","useStateManager","useTheme","withErrorBoundary","options","instanceManager","instance","getInstance","getServices","stateManager"],"mappings":";;;;;;;;;;;QA+DIA;eAAAA,uBAAkB;;QAyDbC;eAAAA,kBAAQ;;QAAEC;eAAAA,yBAAe;;QAhDzBC;eAAAA,oBAAa;;QAcbC;eAAAA,6BAAiB;;QAIjBC;eAAAA,qBAAa;;QAdbC;eAAAA,oBAAS;;QAlCTC;eAAAA,kCAAqB;;QAUjBC;eAAAA;;QAkCeC;eAAAA,6BAAiB;;QAIrBC;eAAAA,qBAAa;;QA3CjCC;eAAAA;;QANKC;eAAAA,kBAAQ;;QAObC;eAAAA,gBAAO;;QAgBPC;eAAAA,kBAAa;;QAGbC;eAAAA,cAAS;;QAK8BC;eAAAA,sBAAe;;QANtDC;eAAAA,cAAS;;QAETC;eAAAA,oBAAe;;QAHfC;eAAAA,aAAQ;;QAOYC;eAAAA,wBAAiB;;;yBAvEjB;0BAEC;6BACa;qBAiE/B;uBAG2D;2BAIxC;4BAU2B;wBAIR;qBAmB/B;qBACA;qBACA;qBAGA;qBAGA;0BAG4B;;;;;;;;;;;;;;AAjH1C;;;;;;;;;;;;;;;;;;;CAmBC,GACD;;;;;;;CAOC,GACD,MAAMT,QAAQ,OAAOU,UAAwB,CAAC,CAAC;IAC3C,kBAAkB;IAClB,MAAMT,IAAAA,kBAAQ,EAACS;AACnB;AAcO,MAAMb,kBAAkB;IAC3B,MAAMc,kBAAkBf,IAAAA,kCAAqB;IAC7C,MAAMgB,WAAWD,gBAAgBE,WAAW;IAC5C,IAAID,UAAU;QACV,OAAOA,SAASE,WAAW,GAAGC,YAAY;IAC9C;IACA,OAAO;AACX"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -39,7 +39,7 @@ export { AppContextProvider, useAppContext, useTheme, useLocale, useConfig, useS
|
|
|
39
39
|
export { ErrorBoundary, withErrorBoundary, useErrorHandler } from './error';
|
|
40
40
|
export type { ErrorBoundaryProps } from './error';
|
|
41
41
|
export { appConfig } from './config/AppConfig';
|
|
42
|
-
export type { InitializationContext,
|
|
42
|
+
export type { InitializationContext, InitializationOptions, ProgressCallback, } from './initialization';
|
|
43
43
|
export { MiddlewareManager, middlewareManager } from './middleware';
|
|
44
44
|
export type { Middleware } from './middleware';
|
|
45
45
|
export { PluginManager, pluginManager } from './plugin';
|
|
@@ -49,7 +49,6 @@ export type { StartOptions, ManagerLifecycle, SplashScreenCustomProps } from './
|
|
|
49
49
|
export * from './startup';
|
|
50
50
|
export * from './config';
|
|
51
51
|
export * from './kernel';
|
|
52
|
-
export * from './ui-adapter';
|
|
53
52
|
export * from './router';
|
|
54
53
|
export * from './event';
|
|
55
54
|
export { DevTools, DevToolsTrigger } from './dev/DevTools';
|
package/dist/core/index.js
CHANGED
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/index.tsx"],"sourcesContent":["import type { StartOptions } from \"./types\";\nimport { storage } from '../library';\nimport { StateManager } from '../state';\nimport { startApp } from './startup/startApp';\nimport { getAppInstanceManager } from './startup/AppInstance';\n\n\n/**\n * 启动框架\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * loggerLevel: LogLevel.DEBUG,\n * lifecycle: {\n * beforeInitialization: async () => {\n * console.log('初始化前执行');\n * },\n * },\n * });\n * ```\n */\n/**\n * 启动框架(向后兼容的API)\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @deprecated 建议使用 startApp 函数,支持多实例\n */\nconst start = async (options: StartOptions = {}): Promise<void> => {\n // 使用新的启动函数,保持向后兼容\n await startApp(options);\n};\n\n// 导出新的启动函数\nexport { startApp } from './startup/startApp';\nexport { getAppInstanceManager } from './startup/AppInstance';\nexport type { AppInstance } from './startup/AppInstance';\n\n// 导出向后兼容的start函数\nexport {\n start,\n storage,\n};\n\n// 导出getStateManager(向后兼容)\nexport const getStateManager = (): StateManager | null => {\n const instanceManager = getAppInstanceManager();\n const instance = instanceManager.getInstance();\n if (instance) {\n return instance.getServices().stateManager;\n }\n return null;\n};\n\n// 导出应用上下文相关功能\nexport {\n AppContextProvider,\n useAppContext,\n useTheme,\n useLocale,\n useConfig,\n useStateManager,\n} from './app';\n\n// 导出错误边界\nexport { ErrorBoundary, withErrorBoundary, useErrorHandler } from './error';\nexport type { ErrorBoundaryProps } from './error';\n\n// 导出应用配置单例\nexport { appConfig } from './config/AppConfig';\n\n// 导出初始化相关类型\nexport type {\n InitializationContext,\n
|
|
1
|
+
{"version":3,"sources":["../../src/core/index.tsx"],"sourcesContent":["import type { StartOptions } from \"./types\";\nimport { storage } from '../library';\nimport { StateManager } from '../state';\nimport { startApp } from './startup/startApp';\nimport { getAppInstanceManager } from './startup/AppInstance';\n\n\n/**\n * 启动框架\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * loggerLevel: LogLevel.DEBUG,\n * lifecycle: {\n * beforeInitialization: async () => {\n * console.log('初始化前执行');\n * },\n * },\n * });\n * ```\n */\n/**\n * 启动框架(向后兼容的API)\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @deprecated 建议使用 startApp 函数,支持多实例\n */\nconst start = async (options: StartOptions = {}): Promise<void> => {\n // 使用新的启动函数,保持向后兼容\n await startApp(options);\n};\n\n// 导出新的启动函数\nexport { startApp } from './startup/startApp';\nexport { getAppInstanceManager } from './startup/AppInstance';\nexport type { AppInstance } from './startup/AppInstance';\n\n// 导出向后兼容的start函数\nexport {\n start,\n storage,\n};\n\n// 导出getStateManager(向后兼容)\nexport const getStateManager = (): StateManager | null => {\n const instanceManager = getAppInstanceManager();\n const instance = instanceManager.getInstance();\n if (instance) {\n return instance.getServices().stateManager;\n }\n return null;\n};\n\n// 导出应用上下文相关功能\nexport {\n AppContextProvider,\n useAppContext,\n useTheme,\n useLocale,\n useConfig,\n useStateManager,\n} from './app';\n\n// 导出错误边界\nexport { ErrorBoundary, withErrorBoundary, useErrorHandler } from './error';\nexport type { ErrorBoundaryProps } from './error';\n\n// 导出应用配置单例\nexport { appConfig } from './config/AppConfig';\n\n// 导出初始化相关类型\nexport type {\n InitializationContext,\n InitializationOptions,\n ProgressCallback,\n} from './initialization';\n\n// 导出中间件\nexport { MiddlewareManager, middlewareManager } from './middleware';\nexport type { Middleware } from './middleware';\n\n// 导出插件\nexport { PluginManager, pluginManager } from './plugin';\nexport type { Plugin } from './plugin';\n\n// 导出应用上下文相关类型\nexport type {\n AppContextValue,\n ThemeContextValue,\n LocaleContextValue,\n ConfigContextValue,\n StateManagerContextValue,\n ThemeConfig,\n AppConfig,\n AppContextProviderProps,\n} from './app';\n\n// 导出启动配置相关类型\nexport type { StartOptions, ManagerLifecycle, SplashScreenCustomProps } from './types';\n\n// 导出启动相关模块\nexport * from './startup';\nexport * from './config';\nexport * from './kernel';\n\n// 导出路由相关模块\nexport * from './router';\n\n// 导出事件系统\nexport * from './event';\n\n// 导出开发工具\nexport { DevTools, DevToolsTrigger } from './dev/DevTools';\n"],"names":["storage","startApp","getAppInstanceManager","start","options","getStateManager","instanceManager","instance","getInstance","getServices","stateManager","AppContextProvider","useAppContext","useTheme","useLocale","useConfig","useStateManager","ErrorBoundary","withErrorBoundary","useErrorHandler","appConfig","MiddlewareManager","middlewareManager","PluginManager","pluginManager","DevTools","DevToolsTrigger"],"mappings":"AACA,SAASA,OAAO,QAAQ,aAAa;AAErC,SAASC,QAAQ,QAAQ,qBAAqB;AAC9C,SAASC,qBAAqB,QAAQ,wBAAwB;AAG9D;;;;;;;;;;;;;;;;;;;CAmBC,GACD;;;;;;;CAOC,GACD,MAAMC,QAAQ,OAAOC,UAAwB,CAAC,CAAC;IAC3C,kBAAkB;IAClB,MAAMH,SAASG;AACnB;AAEA,WAAW;AACX,SAASH,QAAQ,QAAQ,qBAAqB;AAC9C,SAASC,qBAAqB,QAAQ,wBAAwB;AAG9D,iBAAiB;AACjB,SACIC,KAAK,EACLH,OAAO,GACT;AAEF,0BAA0B;AAC1B,OAAO,MAAMK,kBAAkB;IAC3B,MAAMC,kBAAkBJ;IACxB,MAAMK,WAAWD,gBAAgBE,WAAW;IAC5C,IAAID,UAAU;QACV,OAAOA,SAASE,WAAW,GAAGC,YAAY;IAC9C;IACA,OAAO;AACX,EAAE;AAEF,cAAc;AACd,SACIC,kBAAkB,EAClBC,aAAa,EACbC,QAAQ,EACRC,SAAS,EACTC,SAAS,EACTC,eAAe,QACZ,QAAQ;AAEf,SAAS;AACT,SAASC,aAAa,EAAEC,iBAAiB,EAAEC,eAAe,QAAQ,UAAU;AAG5E,WAAW;AACX,SAASC,SAAS,QAAQ,qBAAqB;AAS/C,QAAQ;AACR,SAASC,iBAAiB,EAAEC,iBAAiB,QAAQ,eAAe;AAGpE,OAAO;AACP,SAASC,aAAa,EAAEC,aAAa,QAAQ,WAAW;AAkBxD,WAAW;AACX,cAAc,YAAY;AAC1B,cAAc,WAAW;AACzB,cAAc,WAAW;AAEzB,WAAW;AACX,cAAc,WAAW;AAEzB,SAAS;AACT,cAAc,UAAU;AAExB,SAAS;AACT,SAASC,QAAQ,EAAEC,eAAe,QAAQ,iBAAiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/initialization/index.ts"],"sourcesContent":["/**\n * 初始化模块统一导出\n */\n\nexport { initialization } from './initialization';\nexport type {\n InitializationContext,\n
|
|
1
|
+
{"version":3,"sources":["../../../src/core/initialization/index.ts"],"sourcesContent":["/**\n * 初始化模块统一导出\n */\n\nexport { initialization } from './initialization';\nexport type {\n InitializationContext,\n InitializationOptions,\n ProgressCallback,\n} from './initialization';\nexport { InitializationErrorThrower } from './InitializationErrorThrower';\nexport { initializationErrorState } from './initializationErrorState';\n"],"names":["InitializationErrorThrower","initialization","initializationErrorState"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAQQA;eAAAA,sDAA0B;;QAN1BC;eAAAA,8BAAc;;QAOdC;eAAAA,kDAAwB;;;gCAPF;4CAMY;0CACF"}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* 初始化模块统一导出
|
|
3
3
|
*/
|
|
4
4
|
export { initialization } from './initialization';
|
|
5
|
-
export type { InitializationContext,
|
|
5
|
+
export type { InitializationContext, InitializationOptions, ProgressCallback, } from './initialization';
|
|
6
6
|
export { InitializationErrorThrower } from './InitializationErrorThrower';
|
|
7
7
|
export { initializationErrorState } from './initializationErrorState';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/initialization/index.ts"],"sourcesContent":["/**\n * 初始化模块统一导出\n */\n\nexport { initialization } from './initialization';\nexport type {\n InitializationContext,\n
|
|
1
|
+
{"version":3,"sources":["../../../src/core/initialization/index.ts"],"sourcesContent":["/**\n * 初始化模块统一导出\n */\n\nexport { initialization } from './initialization';\nexport type {\n InitializationContext,\n InitializationOptions,\n ProgressCallback,\n} from './initialization';\nexport { InitializationErrorThrower } from './InitializationErrorThrower';\nexport { initializationErrorState } from './initializationErrorState';\n"],"names":["initialization","InitializationErrorThrower","initializationErrorState"],"mappings":"AAAA;;CAEC,GAED,SAASA,cAAc,QAAQ,mBAAmB;AAMlD,SAASC,0BAA0B,QAAQ,+BAA+B;AAC1E,SAASC,wBAAwB,QAAQ,6BAA6B"}
|
|
@@ -10,71 +10,7 @@ Object.defineProperty(exports, "initialization", {
|
|
|
10
10
|
});
|
|
11
11
|
const _utils = require("../../utils");
|
|
12
12
|
const _library = require("../../library");
|
|
13
|
-
const _errors = require("../../utils/errors");
|
|
14
|
-
const _configSecurity = require("../../utils/configSecurity");
|
|
15
13
|
const _plugin = require("../plugin");
|
|
16
|
-
/**
|
|
17
|
-
* 配置缓存键
|
|
18
|
-
*/ const CONFIG_CACHE_KEY = '__framework_config_cache__';
|
|
19
|
-
/**
|
|
20
|
-
* 加载配置(带超时、重试和缓存)
|
|
21
|
-
*/ async function loadConfigWithRetry(loadConfig, strategy, fallbackConfig) {
|
|
22
|
-
const timeout = strategy.configTimeout ?? 5000;
|
|
23
|
-
const retryCount = strategy.retryCount ?? 3;
|
|
24
|
-
const retryDelay = strategy.retryDelay ?? 1000;
|
|
25
|
-
const enableCache = strategy.enableCache ?? true;
|
|
26
|
-
const cacheTTL = strategy.cacheTTL ?? 5 * 60 * 1000; // 5分钟
|
|
27
|
-
const configVersion = strategy.configVersion;
|
|
28
|
-
// 检查缓存
|
|
29
|
-
if (enableCache && _library.storage.localCache) {
|
|
30
|
-
try {
|
|
31
|
-
const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;
|
|
32
|
-
const cached = await _library.storage.localCache.get(cacheKey);
|
|
33
|
-
if (cached && (!configVersion || cached.version === configVersion)) {
|
|
34
|
-
_utils.logger.debug('使用缓存的配置');
|
|
35
|
-
return cached.data;
|
|
36
|
-
}
|
|
37
|
-
} catch (error) {
|
|
38
|
-
_utils.logger.warn('读取配置缓存失败:', error);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
// 重试加载配置
|
|
42
|
-
let lastError = null;
|
|
43
|
-
for(let attempt = 0; attempt <= retryCount; attempt++){
|
|
44
|
-
try {
|
|
45
|
-
if (attempt > 0) {
|
|
46
|
-
_utils.logger.debug(`配置加载重试 ${attempt}/${retryCount}`);
|
|
47
|
-
// 指数退避
|
|
48
|
-
await new Promise((resolve)=>setTimeout(resolve, retryDelay * Math.pow(2, attempt - 1)));
|
|
49
|
-
}
|
|
50
|
-
const configPromise = loadConfig();
|
|
51
|
-
const timeoutPromise = new Promise((_, reject)=>setTimeout(()=>reject(new _errors.NetworkError('配置加载超时')), timeout));
|
|
52
|
-
const config = await Promise.race([
|
|
53
|
-
configPromise,
|
|
54
|
-
timeoutPromise
|
|
55
|
-
]);
|
|
56
|
-
// 保存到缓存
|
|
57
|
-
if (enableCache && _library.storage.localCache) {
|
|
58
|
-
try {
|
|
59
|
-
const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;
|
|
60
|
-
await _library.storage.localCache.set(cacheKey, {
|
|
61
|
-
data: config,
|
|
62
|
-
version: configVersion
|
|
63
|
-
}, cacheTTL);
|
|
64
|
-
} catch (error) {
|
|
65
|
-
_utils.logger.warn('保存配置缓存失败:', error);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return config;
|
|
69
|
-
} catch (error) {
|
|
70
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
71
|
-
_utils.logger.warn(`配置加载失败 (尝试 ${attempt + 1}/${retryCount + 1}):`, lastError);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// 所有重试都失败,使用降级配置
|
|
75
|
-
_utils.logger.warn('配置加载失败,使用降级配置:', lastError);
|
|
76
|
-
return fallbackConfig || {};
|
|
77
|
-
}
|
|
78
14
|
async function initialization(options, onProgress) {
|
|
79
15
|
const startTime = Date.now();
|
|
80
16
|
let config = {};
|
|
@@ -84,89 +20,8 @@ async function initialization(options, onProgress) {
|
|
|
84
20
|
// 1. 设置日志级别
|
|
85
21
|
onProgress?.(5, '初始化日志系统...');
|
|
86
22
|
_utils.logger.setLevel(options.loggerLevel ?? _utils.LogLevel.INFO);
|
|
87
|
-
// 2.
|
|
88
|
-
|
|
89
|
-
onProgress?.(10, '加载关键配置...');
|
|
90
|
-
try {
|
|
91
|
-
config = await loadConfigWithRetry(options.configStrategy.loadCriticalConfig, options.configStrategy, options.configStrategy.fallbackConfig);
|
|
92
|
-
// 验证配置安全性
|
|
93
|
-
if (options.configSecurity) {
|
|
94
|
-
const securityResult = await _configSecurity.ConfigSecurity.validateConfigSecurity(config, options.configSecurity);
|
|
95
|
-
if (!securityResult.valid) {
|
|
96
|
-
_utils.logger.warn('配置安全验证失败:', securityResult.errors);
|
|
97
|
-
// 根据安全策略决定是否继续
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
options.configStrategy.onConfigLoaded?.(config);
|
|
101
|
-
onProgress?.(30, '关键配置加载完成');
|
|
102
|
-
} catch (error) {
|
|
103
|
-
_utils.logger.warn('关键配置加载失败,使用默认配置:', error);
|
|
104
|
-
config = options.configStrategy.fallbackConfig || {};
|
|
105
|
-
options.configStrategy.onConfigLoaded?.(config);
|
|
106
|
-
onProgress?.(30, '使用默认配置');
|
|
107
|
-
}
|
|
108
|
-
} else {
|
|
109
|
-
onProgress?.(30);
|
|
110
|
-
}
|
|
111
|
-
// 2.5. 渐进式加载非关键配置(在应用渲染后异步加载)
|
|
112
|
-
if (options.configStrategy?.loadNonCriticalConfig) {
|
|
113
|
-
// 智能延迟加载:根据网络状况动态调整延迟时间
|
|
114
|
-
const getDelayTime = ()=>{
|
|
115
|
-
if (typeof navigator === 'undefined' || !('connection' in navigator)) {
|
|
116
|
-
return 1000; // 默认延迟
|
|
117
|
-
}
|
|
118
|
-
const connection = navigator.connection;
|
|
119
|
-
if (!connection) {
|
|
120
|
-
return 1000;
|
|
121
|
-
}
|
|
122
|
-
// 根据网络类型调整延迟
|
|
123
|
-
const effectiveType = connection.effectiveType;
|
|
124
|
-
switch(effectiveType){
|
|
125
|
-
case 'slow-2g':
|
|
126
|
-
case '2g':
|
|
127
|
-
return 3000; // 慢网络延迟更久
|
|
128
|
-
case '3g':
|
|
129
|
-
return 2000;
|
|
130
|
-
case '4g':
|
|
131
|
-
default:
|
|
132
|
-
return 500; // 快网络可以更快加载
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
// 使用 requestIdleCallback 在空闲时加载
|
|
136
|
-
if (typeof requestIdleCallback !== 'undefined') {
|
|
137
|
-
requestIdleCallback(async ()=>{
|
|
138
|
-
try {
|
|
139
|
-
const nonCriticalConfig = await loadConfigWithRetry(options.configStrategy.loadNonCriticalConfig, options.configStrategy, {});
|
|
140
|
-
// 合并到主配置
|
|
141
|
-
config = {
|
|
142
|
-
...config,
|
|
143
|
-
...nonCriticalConfig
|
|
144
|
-
};
|
|
145
|
-
options.configStrategy?.onConfigLoaded?.(config);
|
|
146
|
-
_utils.logger.debug('非关键配置加载完成');
|
|
147
|
-
} catch (error) {
|
|
148
|
-
_utils.logger.warn('非关键配置加载失败:', error);
|
|
149
|
-
}
|
|
150
|
-
}, {
|
|
151
|
-
timeout: getDelayTime()
|
|
152
|
-
});
|
|
153
|
-
} else {
|
|
154
|
-
// 降级方案:智能延迟加载
|
|
155
|
-
setTimeout(async ()=>{
|
|
156
|
-
try {
|
|
157
|
-
const nonCriticalConfig = await loadConfigWithRetry(options.configStrategy.loadNonCriticalConfig, options.configStrategy, {});
|
|
158
|
-
config = {
|
|
159
|
-
...config,
|
|
160
|
-
...nonCriticalConfig
|
|
161
|
-
};
|
|
162
|
-
options.configStrategy?.onConfigLoaded?.(config);
|
|
163
|
-
_utils.logger.debug('非关键配置加载完成');
|
|
164
|
-
} catch (error) {
|
|
165
|
-
_utils.logger.warn('非关键配置加载失败:', error);
|
|
166
|
-
}
|
|
167
|
-
}, getDelayTime());
|
|
168
|
-
}
|
|
169
|
-
}
|
|
23
|
+
// 2. 预留配置阶段
|
|
24
|
+
onProgress?.(30);
|
|
170
25
|
// 3. 初始化之前回调
|
|
171
26
|
if (options.lifecycle?.beforeInitialization) {
|
|
172
27
|
onProgress?.(35, '执行初始化前回调...');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/initialization/initialization.ts"],"sourcesContent":["import { logger, LogLevel } from '../../utils';\nimport { setupI18n } from '../../library';\nimport { storage } from '../../library';\nimport type { LangType } from '../../library/locale/types';\nimport type { ManagerLifecycle, StartOptions } from '../types';\nimport { NetworkError } from '../../utils/errors';\nimport { ConfigSecurity } from '../../utils/configSecurity';\nimport { pluginManager } from '../plugin';\n\n/**\n * 初始化上下文\n */\nexport interface InitializationContext {\n /**\n * 已加载的配置\n */\n config: Record<string, unknown>;\n\n /**\n * 初始化进度(0-100)\n */\n progress: number;\n\n /**\n * 是否准备就绪\n */\n isReady: boolean;\n\n /**\n * 初始化耗时(毫秒)\n */\n duration: number;\n}\n\n/**\n * 配置加载策略\n */\nexport interface ConfigStrategy {\n /**\n * 加载关键配置\n * 这些配置必须在应用渲染前加载完成\n */\n loadCriticalConfig?: () => Promise<Record<string, unknown>>;\n\n /**\n * 加载非关键配置\n * 这些配置可以在应用渲染后异步加载\n */\n loadNonCriticalConfig?: () => Promise<Record<string, unknown>>;\n\n /**\n * 配置降级方案\n * 当配置加载失败时使用的默认配置\n */\n fallbackConfig?: Record<string, unknown>;\n\n /**\n * 配置超时时间(毫秒)\n * 默认 5000ms,超时后使用降级配置\n */\n configTimeout?: number;\n\n /**\n * 配置版本号(用于缓存失效)\n */\n configVersion?: string;\n\n /**\n * 配置加载完成回调\n */\n onConfigLoaded?: (config: Record<string, unknown>) => void;\n\n /**\n * 是否启用缓存\n * @default true\n */\n enableCache?: boolean;\n\n /**\n * 缓存过期时间(毫秒)\n * @default 5 * 60 * 1000 (5分钟)\n */\n cacheTTL?: number;\n\n /**\n * 重试次数\n * @default 3\n */\n retryCount?: number;\n\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n}\n\n/**\n * 初始化选项\n */\nexport interface InitializationOptions {\n /**\n * 日志级别\n */\n loggerLevel?: LogLevel;\n\n /**\n * 国际化配置\n */\n locale?: Record<LangType, Record<string, unknown>>;\n\n /**\n * 生命周期钩子\n */\n lifecycle?: ManagerLifecycle;\n\n /**\n * 配置加载策略\n */\n configStrategy?: ConfigStrategy;\n}\n\n/**\n * 进度回调函数\n */\nexport type ProgressCallback = (progress: number, step?: string) => void;\n\n/**\n * 配置缓存键\n */\nconst CONFIG_CACHE_KEY = '__framework_config_cache__';\n\n/**\n * 加载配置(带超时、重试和缓存)\n */\nasync function loadConfigWithRetry(\n loadConfig: () => Promise<Record<string, unknown>>,\n strategy: ConfigStrategy,\n fallbackConfig?: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const timeout = strategy.configTimeout ?? 5000;\n const retryCount = strategy.retryCount ?? 3;\n const retryDelay = strategy.retryDelay ?? 1000;\n const enableCache = strategy.enableCache ?? true;\n const cacheTTL = strategy.cacheTTL ?? 5 * 60 * 1000; // 5分钟\n const configVersion = strategy.configVersion;\n\n // 检查缓存\n if (enableCache && storage.localCache) {\n try {\n const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;\n const cached = await storage.localCache.get<{ data: Record<string, unknown>; version?: string }>(cacheKey);\n if (cached && (!configVersion || cached.version === configVersion)) {\n logger.debug('使用缓存的配置');\n return cached.data;\n }\n } catch (error) {\n logger.warn('读取配置缓存失败:', error);\n }\n }\n\n // 重试加载配置\n let lastError: Error | null = null;\n for (let attempt = 0; attempt <= retryCount; attempt++) {\n try {\n if (attempt > 0) {\n logger.debug(`配置加载重试 ${attempt}/${retryCount}`);\n // 指数退避\n await new Promise((resolve) => setTimeout(resolve, retryDelay * Math.pow(2, attempt - 1)));\n }\n\n const configPromise = loadConfig();\n const timeoutPromise = new Promise<Record<string, unknown>>((_, reject) =>\n setTimeout(() => reject(new NetworkError('配置加载超时')), timeout)\n );\n\n const config = await Promise.race([configPromise, timeoutPromise]);\n\n // 保存到缓存\n if (enableCache && storage.localCache) {\n try {\n const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;\n await storage.localCache.set(cacheKey, { data: config, version: configVersion }, cacheTTL);\n } catch (error) {\n logger.warn('保存配置缓存失败:', error);\n }\n }\n\n return config;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n logger.warn(`配置加载失败 (尝试 ${attempt + 1}/${retryCount + 1}):`, lastError);\n }\n }\n\n // 所有重试都失败,使用降级配置\n logger.warn('配置加载失败,使用降级配置:', lastError);\n return fallbackConfig || {};\n}\n\n/**\n * 初始化方法\n * \n * 这是核心的初始化逻辑,可被启动页或直接调用\n * \n * @param options - 初始化选项\n * @param onProgress - 进度回调函数(可选)\n * @returns Promise<InitializationContext>\n * \n * @example\n * ```typescript\n * const context = await initialization({\n * loggerLevel: LogLevel.INFO,\n * lifecycle: {\n * initialization: async () => {\n * // 初始化逻辑\n * },\n * },\n * }, (progress, step) => {\n * console.log(`进度: ${progress}%, 步骤: ${step}`);\n * });\n * ```\n */\nexport async function initialization(\n options: StartOptions,\n onProgress?: ProgressCallback\n): Promise<InitializationContext> {\n const startTime = Date.now();\n let config: Record<string, unknown> = {};\n\n try {\n // 0. 执行插件初始化前钩子\n await pluginManager.executeBeforeInit(options);\n\n // 1. 设置日志级别\n onProgress?.(5, '初始化日志系统...');\n logger.setLevel(options.loggerLevel ?? LogLevel.INFO);\n\n // 2. 加载关键配置\n if (options.configStrategy?.loadCriticalConfig) {\n onProgress?.(10, '加载关键配置...');\n try {\n config = await loadConfigWithRetry(\n options.configStrategy.loadCriticalConfig,\n options.configStrategy,\n options.configStrategy.fallbackConfig\n );\n\n // 验证配置安全性\n if (options.configSecurity) {\n const securityResult = await ConfigSecurity.validateConfigSecurity(\n config,\n options.configSecurity\n );\n if (!securityResult.valid) {\n logger.warn('配置安全验证失败:', securityResult.errors);\n // 根据安全策略决定是否继续\n }\n }\n\n options.configStrategy.onConfigLoaded?.(config);\n onProgress?.(30, '关键配置加载完成');\n } catch (error) {\n logger.warn('关键配置加载失败,使用默认配置:', error);\n config = options.configStrategy.fallbackConfig || {};\n options.configStrategy.onConfigLoaded?.(config);\n onProgress?.(30, '使用默认配置');\n }\n } else {\n onProgress?.(30);\n }\n\n // 2.5. 渐进式加载非关键配置(在应用渲染后异步加载)\n if (options.configStrategy?.loadNonCriticalConfig) {\n // 智能延迟加载:根据网络状况动态调整延迟时间\n const getDelayTime = (): number => {\n if (typeof navigator === 'undefined' || !('connection' in navigator)) {\n return 1000; // 默认延迟\n }\n\n const connection = (navigator as any).connection;\n if (!connection) {\n return 1000;\n }\n\n // 根据网络类型调整延迟\n const effectiveType = connection.effectiveType;\n switch (effectiveType) {\n case 'slow-2g':\n case '2g':\n return 3000; // 慢网络延迟更久\n case '3g':\n return 2000;\n case '4g':\n default:\n return 500; // 快网络可以更快加载\n }\n };\n\n // 使用 requestIdleCallback 在空闲时加载\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(\n async () => {\n try {\n const nonCriticalConfig = await loadConfigWithRetry(\n options.configStrategy!.loadNonCriticalConfig!,\n options.configStrategy!,\n {}\n );\n // 合并到主配置\n config = { ...config, ...nonCriticalConfig };\n options.configStrategy?.onConfigLoaded?.(config);\n logger.debug('非关键配置加载完成');\n } catch (error) {\n logger.warn('非关键配置加载失败:', error);\n }\n },\n { timeout: getDelayTime() }\n );\n } else {\n // 降级方案:智能延迟加载\n setTimeout(async () => {\n try {\n const nonCriticalConfig = await loadConfigWithRetry(\n options.configStrategy!.loadNonCriticalConfig!,\n options.configStrategy!,\n {}\n );\n config = { ...config, ...nonCriticalConfig };\n options.configStrategy?.onConfigLoaded?.(config);\n logger.debug('非关键配置加载完成');\n } catch (error) {\n logger.warn('非关键配置加载失败:', error);\n }\n }, getDelayTime());\n }\n }\n\n // 3. 初始化之前回调\n if (options.lifecycle?.beforeInitialization) {\n onProgress?.(35, '执行初始化前回调...');\n await options.lifecycle.beforeInitialization();\n }\n\n // 4. 国际化设置\n onProgress?.(40, '设置国际化...');\n setupI18n(options.locale || undefined);\n\n // 5. 核心初始化\n if (options.lifecycle?.initialization) {\n onProgress?.(50, '初始化核心功能...');\n await options.lifecycle.initialization();\n onProgress?.(70, '核心功能初始化完成');\n } else {\n onProgress?.(70);\n }\n\n onProgress?.(80, '准备完成...');\n\n const duration = Date.now() - startTime;\n\n const context: InitializationContext = {\n config,\n progress: 100,\n isReady: true,\n duration,\n };\n\n // 执行插件初始化钩子\n await pluginManager.executeInit(options, context);\n\n // 执行插件初始化后钩子\n await pluginManager.executeAfterInit(options, context);\n\n // 6. 初始化之后回调(在 context 创建后执行,可以访问完整的初始化上下文)\n if (options.lifecycle?.afterInitialization) {\n onProgress?.(90, '执行初始化后回调...');\n await options.lifecycle.afterInitialization(context);\n }\n\n onProgress?.(100, '初始化完成');\n\n return context;\n } catch (error) {\n logger.error('初始化失败:', error);\n throw error;\n }\n}\n"],"names":["initialization","CONFIG_CACHE_KEY","loadConfigWithRetry","loadConfig","strategy","fallbackConfig","timeout","configTimeout","retryCount","retryDelay","enableCache","cacheTTL","configVersion","storage","localCache","cacheKey","cached","get","version","logger","debug","data","error","warn","lastError","attempt","Promise","resolve","setTimeout","Math","pow","configPromise","timeoutPromise","_","reject","NetworkError","config","race","set","Error","String","options","onProgress","startTime","Date","now","pluginManager","executeBeforeInit","setLevel","loggerLevel","LogLevel","INFO","configStrategy","loadCriticalConfig","configSecurity","securityResult","ConfigSecurity","validateConfigSecurity","valid","errors","onConfigLoaded","loadNonCriticalConfig","getDelayTime","navigator","connection","effectiveType","requestIdleCallback","nonCriticalConfig","lifecycle","beforeInitialization","setupI18n","locale","undefined","duration","context","progress","isReady","executeInit","executeAfterInit","afterInitialization"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/initialization/initialization.ts"],"sourcesContent":["import { logger, LogLevel } from '../../utils';\nimport { setupI18n } from '../../library';\nimport type { LangType } from '../../library/locale/types';\nimport type { ManagerLifecycle, StartOptions } from '../types';\nimport { pluginManager } from '../plugin';\n\n/**\n * 初始化上下文\n */\nexport interface InitializationContext {\n /**\n * 已加载的配置\n */\n config: Record<string, unknown>;\n\n /**\n * 初始化进度(0-100)\n */\n progress: number;\n\n /**\n * 是否准备就绪\n */\n isReady: boolean;\n\n /**\n * 初始化耗时(毫秒)\n */\n duration: number;\n}\n\n/**\n * 初始化选项\n */\nexport interface InitializationOptions {\n /**\n * 日志级别\n */\n loggerLevel?: LogLevel;\n\n /**\n * 国际化配置\n */\n locale?: Record<LangType, Record<string, unknown>>;\n\n /**\n * 生命周期钩子\n */\n lifecycle?: ManagerLifecycle;\n}\n\n/**\n * 进度回调函数\n */\nexport type ProgressCallback = (progress: number, step?: string) => void;\n\n/**\n * 初始化方法\n * \n * 这是核心的初始化逻辑,可被启动页或直接调用\n * \n * @param options - 初始化选项\n * @param onProgress - 进度回调函数(可选)\n * @returns Promise<InitializationContext>\n * \n * @example\n * ```typescript\n * const context = await initialization({\n * loggerLevel: LogLevel.INFO,\n * lifecycle: {\n * initialization: async () => {\n * // 初始化逻辑\n * },\n * },\n * }, (progress, step) => {\n * console.log(`进度: ${progress}%, 步骤: ${step}`);\n * });\n * ```\n */\nexport async function initialization(\n options: StartOptions,\n onProgress?: ProgressCallback\n): Promise<InitializationContext> {\n const startTime = Date.now();\n let config: Record<string, unknown> = {};\n\n try {\n // 0. 执行插件初始化前钩子\n await pluginManager.executeBeforeInit(options);\n\n // 1. 设置日志级别\n onProgress?.(5, '初始化日志系统...');\n logger.setLevel(options.loggerLevel ?? LogLevel.INFO);\n\n // 2. 预留配置阶段\n onProgress?.(30);\n\n // 3. 初始化之前回调\n if (options.lifecycle?.beforeInitialization) {\n onProgress?.(35, '执行初始化前回调...');\n await options.lifecycle.beforeInitialization();\n }\n\n // 4. 国际化设置\n onProgress?.(40, '设置国际化...');\n setupI18n(options.locale || undefined);\n\n // 5. 核心初始化\n if (options.lifecycle?.initialization) {\n onProgress?.(50, '初始化核心功能...');\n await options.lifecycle.initialization();\n onProgress?.(70, '核心功能初始化完成');\n } else {\n onProgress?.(70);\n }\n\n onProgress?.(80, '准备完成...');\n\n const duration = Date.now() - startTime;\n\n const context: InitializationContext = {\n config,\n progress: 100,\n isReady: true,\n duration,\n };\n\n // 执行插件初始化钩子\n await pluginManager.executeInit(options, context);\n\n // 执行插件初始化后钩子\n await pluginManager.executeAfterInit(options, context);\n\n // 6. 初始化之后回调(在 context 创建后执行,可以访问完整的初始化上下文)\n if (options.lifecycle?.afterInitialization) {\n onProgress?.(90, '执行初始化后回调...');\n await options.lifecycle.afterInitialization(context);\n }\n\n onProgress?.(100, '初始化完成');\n\n return context;\n } catch (error) {\n logger.error('初始化失败:', error);\n throw error;\n }\n}\n"],"names":["initialization","options","onProgress","startTime","Date","now","config","pluginManager","executeBeforeInit","logger","setLevel","loggerLevel","LogLevel","INFO","lifecycle","beforeInitialization","setupI18n","locale","undefined","duration","context","progress","isReady","executeInit","executeAfterInit","afterInitialization","error"],"mappings":";;;;+BA+EsBA;;;eAAAA;;;uBA/EW;yBACP;wBAGI;AA2EvB,eAAeA,eACpBC,OAAqB,EACrBC,UAA6B;IAE7B,MAAMC,YAAYC,KAAKC,GAAG;IAC1B,IAAIC,SAAkC,CAAC;IAEvC,IAAI;QACF,gBAAgB;QAChB,MAAMC,qBAAa,CAACC,iBAAiB,CAACP;QAEtC,YAAY;QACZC,aAAa,GAAG;QAChBO,aAAM,CAACC,QAAQ,CAACT,QAAQU,WAAW,IAAIC,eAAQ,CAACC,IAAI;QAEpD,YAAY;QACZX,aAAa;QAEb,aAAa;QACb,IAAID,QAAQa,SAAS,EAAEC,sBAAsB;YAC3Cb,aAAa,IAAI;YACjB,MAAMD,QAAQa,SAAS,CAACC,oBAAoB;QAC9C;QAEA,WAAW;QACXb,aAAa,IAAI;QACjBc,IAAAA,kBAAS,EAACf,QAAQgB,MAAM,IAAIC;QAE5B,WAAW;QACX,IAAIjB,QAAQa,SAAS,EAAEd,gBAAgB;YACrCE,aAAa,IAAI;YACjB,MAAMD,QAAQa,SAAS,CAACd,cAAc;YACtCE,aAAa,IAAI;QACnB,OAAO;YACLA,aAAa;QACf;QAEAA,aAAa,IAAI;QAEjB,MAAMiB,WAAWf,KAAKC,GAAG,KAAKF;QAE9B,MAAMiB,UAAiC;YACrCd;YACAe,UAAU;YACVC,SAAS;YACTH;QACF;QAEA,YAAY;QACZ,MAAMZ,qBAAa,CAACgB,WAAW,CAACtB,SAASmB;QAEzC,aAAa;QACb,MAAMb,qBAAa,CAACiB,gBAAgB,CAACvB,SAASmB;QAE9C,4CAA4C;QAC5C,IAAInB,QAAQa,SAAS,EAAEW,qBAAqB;YAC1CvB,aAAa,IAAI;YACjB,MAAMD,QAAQa,SAAS,CAACW,mBAAmB,CAACL;QAC9C;QAEAlB,aAAa,KAAK;QAElB,OAAOkB;IACT,EAAE,OAAOM,OAAO;QACdjB,aAAM,CAACiB,KAAK,CAAC,UAAUA;QACvB,MAAMA;IACR;AACF"}
|
|
@@ -22,59 +22,6 @@ export interface InitializationContext {
|
|
|
22
22
|
*/
|
|
23
23
|
duration: number;
|
|
24
24
|
}
|
|
25
|
-
/**
|
|
26
|
-
* 配置加载策略
|
|
27
|
-
*/
|
|
28
|
-
export interface ConfigStrategy {
|
|
29
|
-
/**
|
|
30
|
-
* 加载关键配置
|
|
31
|
-
* 这些配置必须在应用渲染前加载完成
|
|
32
|
-
*/
|
|
33
|
-
loadCriticalConfig?: () => Promise<Record<string, unknown>>;
|
|
34
|
-
/**
|
|
35
|
-
* 加载非关键配置
|
|
36
|
-
* 这些配置可以在应用渲染后异步加载
|
|
37
|
-
*/
|
|
38
|
-
loadNonCriticalConfig?: () => Promise<Record<string, unknown>>;
|
|
39
|
-
/**
|
|
40
|
-
* 配置降级方案
|
|
41
|
-
* 当配置加载失败时使用的默认配置
|
|
42
|
-
*/
|
|
43
|
-
fallbackConfig?: Record<string, unknown>;
|
|
44
|
-
/**
|
|
45
|
-
* 配置超时时间(毫秒)
|
|
46
|
-
* 默认 5000ms,超时后使用降级配置
|
|
47
|
-
*/
|
|
48
|
-
configTimeout?: number;
|
|
49
|
-
/**
|
|
50
|
-
* 配置版本号(用于缓存失效)
|
|
51
|
-
*/
|
|
52
|
-
configVersion?: string;
|
|
53
|
-
/**
|
|
54
|
-
* 配置加载完成回调
|
|
55
|
-
*/
|
|
56
|
-
onConfigLoaded?: (config: Record<string, unknown>) => void;
|
|
57
|
-
/**
|
|
58
|
-
* 是否启用缓存
|
|
59
|
-
* @default true
|
|
60
|
-
*/
|
|
61
|
-
enableCache?: boolean;
|
|
62
|
-
/**
|
|
63
|
-
* 缓存过期时间(毫秒)
|
|
64
|
-
* @default 5 * 60 * 1000 (5分钟)
|
|
65
|
-
*/
|
|
66
|
-
cacheTTL?: number;
|
|
67
|
-
/**
|
|
68
|
-
* 重试次数
|
|
69
|
-
* @default 3
|
|
70
|
-
*/
|
|
71
|
-
retryCount?: number;
|
|
72
|
-
/**
|
|
73
|
-
* 重试延迟(毫秒)
|
|
74
|
-
* @default 1000
|
|
75
|
-
*/
|
|
76
|
-
retryDelay?: number;
|
|
77
|
-
}
|
|
78
25
|
/**
|
|
79
26
|
* 初始化选项
|
|
80
27
|
*/
|
|
@@ -91,10 +38,6 @@ export interface InitializationOptions {
|
|
|
91
38
|
* 生命周期钩子
|
|
92
39
|
*/
|
|
93
40
|
lifecycle?: ManagerLifecycle;
|
|
94
|
-
/**
|
|
95
|
-
* 配置加载策略
|
|
96
|
-
*/
|
|
97
|
-
configStrategy?: ConfigStrategy;
|
|
98
41
|
}
|
|
99
42
|
/**
|
|
100
43
|
* 进度回调函数
|
|
@@ -1,71 +1,6 @@
|
|
|
1
1
|
import { logger, LogLevel } from "../../utils";
|
|
2
2
|
import { setupI18n } from "../../library";
|
|
3
|
-
import { storage } from "../../library";
|
|
4
|
-
import { NetworkError } from "../../utils/errors";
|
|
5
|
-
import { ConfigSecurity } from "../../utils/configSecurity";
|
|
6
3
|
import { pluginManager } from "../plugin";
|
|
7
|
-
/**
|
|
8
|
-
* 配置缓存键
|
|
9
|
-
*/ const CONFIG_CACHE_KEY = '__framework_config_cache__';
|
|
10
|
-
/**
|
|
11
|
-
* 加载配置(带超时、重试和缓存)
|
|
12
|
-
*/ async function loadConfigWithRetry(loadConfig, strategy, fallbackConfig) {
|
|
13
|
-
const timeout = strategy.configTimeout ?? 5000;
|
|
14
|
-
const retryCount = strategy.retryCount ?? 3;
|
|
15
|
-
const retryDelay = strategy.retryDelay ?? 1000;
|
|
16
|
-
const enableCache = strategy.enableCache ?? true;
|
|
17
|
-
const cacheTTL = strategy.cacheTTL ?? 5 * 60 * 1000; // 5分钟
|
|
18
|
-
const configVersion = strategy.configVersion;
|
|
19
|
-
// 检查缓存
|
|
20
|
-
if (enableCache && storage.localCache) {
|
|
21
|
-
try {
|
|
22
|
-
const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;
|
|
23
|
-
const cached = await storage.localCache.get(cacheKey);
|
|
24
|
-
if (cached && (!configVersion || cached.version === configVersion)) {
|
|
25
|
-
logger.debug('使用缓存的配置');
|
|
26
|
-
return cached.data;
|
|
27
|
-
}
|
|
28
|
-
} catch (error) {
|
|
29
|
-
logger.warn('读取配置缓存失败:', error);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
// 重试加载配置
|
|
33
|
-
let lastError = null;
|
|
34
|
-
for(let attempt = 0; attempt <= retryCount; attempt++){
|
|
35
|
-
try {
|
|
36
|
-
if (attempt > 0) {
|
|
37
|
-
logger.debug(`配置加载重试 ${attempt}/${retryCount}`);
|
|
38
|
-
// 指数退避
|
|
39
|
-
await new Promise((resolve)=>setTimeout(resolve, retryDelay * Math.pow(2, attempt - 1)));
|
|
40
|
-
}
|
|
41
|
-
const configPromise = loadConfig();
|
|
42
|
-
const timeoutPromise = new Promise((_, reject)=>setTimeout(()=>reject(new NetworkError('配置加载超时')), timeout));
|
|
43
|
-
const config = await Promise.race([
|
|
44
|
-
configPromise,
|
|
45
|
-
timeoutPromise
|
|
46
|
-
]);
|
|
47
|
-
// 保存到缓存
|
|
48
|
-
if (enableCache && storage.localCache) {
|
|
49
|
-
try {
|
|
50
|
-
const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;
|
|
51
|
-
await storage.localCache.set(cacheKey, {
|
|
52
|
-
data: config,
|
|
53
|
-
version: configVersion
|
|
54
|
-
}, cacheTTL);
|
|
55
|
-
} catch (error) {
|
|
56
|
-
logger.warn('保存配置缓存失败:', error);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return config;
|
|
60
|
-
} catch (error) {
|
|
61
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
62
|
-
logger.warn(`配置加载失败 (尝试 ${attempt + 1}/${retryCount + 1}):`, lastError);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// 所有重试都失败,使用降级配置
|
|
66
|
-
logger.warn('配置加载失败,使用降级配置:', lastError);
|
|
67
|
-
return fallbackConfig || {};
|
|
68
|
-
}
|
|
69
4
|
/**
|
|
70
5
|
* 初始化方法
|
|
71
6
|
*
|
|
@@ -97,89 +32,8 @@ import { pluginManager } from "../plugin";
|
|
|
97
32
|
// 1. 设置日志级别
|
|
98
33
|
onProgress?.(5, '初始化日志系统...');
|
|
99
34
|
logger.setLevel(options.loggerLevel ?? LogLevel.INFO);
|
|
100
|
-
// 2.
|
|
101
|
-
|
|
102
|
-
onProgress?.(10, '加载关键配置...');
|
|
103
|
-
try {
|
|
104
|
-
config = await loadConfigWithRetry(options.configStrategy.loadCriticalConfig, options.configStrategy, options.configStrategy.fallbackConfig);
|
|
105
|
-
// 验证配置安全性
|
|
106
|
-
if (options.configSecurity) {
|
|
107
|
-
const securityResult = await ConfigSecurity.validateConfigSecurity(config, options.configSecurity);
|
|
108
|
-
if (!securityResult.valid) {
|
|
109
|
-
logger.warn('配置安全验证失败:', securityResult.errors);
|
|
110
|
-
// 根据安全策略决定是否继续
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
options.configStrategy.onConfigLoaded?.(config);
|
|
114
|
-
onProgress?.(30, '关键配置加载完成');
|
|
115
|
-
} catch (error) {
|
|
116
|
-
logger.warn('关键配置加载失败,使用默认配置:', error);
|
|
117
|
-
config = options.configStrategy.fallbackConfig || {};
|
|
118
|
-
options.configStrategy.onConfigLoaded?.(config);
|
|
119
|
-
onProgress?.(30, '使用默认配置');
|
|
120
|
-
}
|
|
121
|
-
} else {
|
|
122
|
-
onProgress?.(30);
|
|
123
|
-
}
|
|
124
|
-
// 2.5. 渐进式加载非关键配置(在应用渲染后异步加载)
|
|
125
|
-
if (options.configStrategy?.loadNonCriticalConfig) {
|
|
126
|
-
// 智能延迟加载:根据网络状况动态调整延迟时间
|
|
127
|
-
const getDelayTime = ()=>{
|
|
128
|
-
if (typeof navigator === 'undefined' || !('connection' in navigator)) {
|
|
129
|
-
return 1000; // 默认延迟
|
|
130
|
-
}
|
|
131
|
-
const connection = navigator.connection;
|
|
132
|
-
if (!connection) {
|
|
133
|
-
return 1000;
|
|
134
|
-
}
|
|
135
|
-
// 根据网络类型调整延迟
|
|
136
|
-
const effectiveType = connection.effectiveType;
|
|
137
|
-
switch(effectiveType){
|
|
138
|
-
case 'slow-2g':
|
|
139
|
-
case '2g':
|
|
140
|
-
return 3000; // 慢网络延迟更久
|
|
141
|
-
case '3g':
|
|
142
|
-
return 2000;
|
|
143
|
-
case '4g':
|
|
144
|
-
default:
|
|
145
|
-
return 500; // 快网络可以更快加载
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
// 使用 requestIdleCallback 在空闲时加载
|
|
149
|
-
if (typeof requestIdleCallback !== 'undefined') {
|
|
150
|
-
requestIdleCallback(async ()=>{
|
|
151
|
-
try {
|
|
152
|
-
const nonCriticalConfig = await loadConfigWithRetry(options.configStrategy.loadNonCriticalConfig, options.configStrategy, {});
|
|
153
|
-
// 合并到主配置
|
|
154
|
-
config = {
|
|
155
|
-
...config,
|
|
156
|
-
...nonCriticalConfig
|
|
157
|
-
};
|
|
158
|
-
options.configStrategy?.onConfigLoaded?.(config);
|
|
159
|
-
logger.debug('非关键配置加载完成');
|
|
160
|
-
} catch (error) {
|
|
161
|
-
logger.warn('非关键配置加载失败:', error);
|
|
162
|
-
}
|
|
163
|
-
}, {
|
|
164
|
-
timeout: getDelayTime()
|
|
165
|
-
});
|
|
166
|
-
} else {
|
|
167
|
-
// 降级方案:智能延迟加载
|
|
168
|
-
setTimeout(async ()=>{
|
|
169
|
-
try {
|
|
170
|
-
const nonCriticalConfig = await loadConfigWithRetry(options.configStrategy.loadNonCriticalConfig, options.configStrategy, {});
|
|
171
|
-
config = {
|
|
172
|
-
...config,
|
|
173
|
-
...nonCriticalConfig
|
|
174
|
-
};
|
|
175
|
-
options.configStrategy?.onConfigLoaded?.(config);
|
|
176
|
-
logger.debug('非关键配置加载完成');
|
|
177
|
-
} catch (error) {
|
|
178
|
-
logger.warn('非关键配置加载失败:', error);
|
|
179
|
-
}
|
|
180
|
-
}, getDelayTime());
|
|
181
|
-
}
|
|
182
|
-
}
|
|
35
|
+
// 2. 预留配置阶段
|
|
36
|
+
onProgress?.(30);
|
|
183
37
|
// 3. 初始化之前回调
|
|
184
38
|
if (options.lifecycle?.beforeInitialization) {
|
|
185
39
|
onProgress?.(35, '执行初始化前回调...');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/initialization/initialization.ts"],"sourcesContent":["import { logger, LogLevel } from '../../utils';\nimport { setupI18n } from '../../library';\nimport { storage } from '../../library';\nimport type { LangType } from '../../library/locale/types';\nimport type { ManagerLifecycle, StartOptions } from '../types';\nimport { NetworkError } from '../../utils/errors';\nimport { ConfigSecurity } from '../../utils/configSecurity';\nimport { pluginManager } from '../plugin';\n\n/**\n * 初始化上下文\n */\nexport interface InitializationContext {\n /**\n * 已加载的配置\n */\n config: Record<string, unknown>;\n\n /**\n * 初始化进度(0-100)\n */\n progress: number;\n\n /**\n * 是否准备就绪\n */\n isReady: boolean;\n\n /**\n * 初始化耗时(毫秒)\n */\n duration: number;\n}\n\n/**\n * 配置加载策略\n */\nexport interface ConfigStrategy {\n /**\n * 加载关键配置\n * 这些配置必须在应用渲染前加载完成\n */\n loadCriticalConfig?: () => Promise<Record<string, unknown>>;\n\n /**\n * 加载非关键配置\n * 这些配置可以在应用渲染后异步加载\n */\n loadNonCriticalConfig?: () => Promise<Record<string, unknown>>;\n\n /**\n * 配置降级方案\n * 当配置加载失败时使用的默认配置\n */\n fallbackConfig?: Record<string, unknown>;\n\n /**\n * 配置超时时间(毫秒)\n * 默认 5000ms,超时后使用降级配置\n */\n configTimeout?: number;\n\n /**\n * 配置版本号(用于缓存失效)\n */\n configVersion?: string;\n\n /**\n * 配置加载完成回调\n */\n onConfigLoaded?: (config: Record<string, unknown>) => void;\n\n /**\n * 是否启用缓存\n * @default true\n */\n enableCache?: boolean;\n\n /**\n * 缓存过期时间(毫秒)\n * @default 5 * 60 * 1000 (5分钟)\n */\n cacheTTL?: number;\n\n /**\n * 重试次数\n * @default 3\n */\n retryCount?: number;\n\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n}\n\n/**\n * 初始化选项\n */\nexport interface InitializationOptions {\n /**\n * 日志级别\n */\n loggerLevel?: LogLevel;\n\n /**\n * 国际化配置\n */\n locale?: Record<LangType, Record<string, unknown>>;\n\n /**\n * 生命周期钩子\n */\n lifecycle?: ManagerLifecycle;\n\n /**\n * 配置加载策略\n */\n configStrategy?: ConfigStrategy;\n}\n\n/**\n * 进度回调函数\n */\nexport type ProgressCallback = (progress: number, step?: string) => void;\n\n/**\n * 配置缓存键\n */\nconst CONFIG_CACHE_KEY = '__framework_config_cache__';\n\n/**\n * 加载配置(带超时、重试和缓存)\n */\nasync function loadConfigWithRetry(\n loadConfig: () => Promise<Record<string, unknown>>,\n strategy: ConfigStrategy,\n fallbackConfig?: Record<string, unknown>\n): Promise<Record<string, unknown>> {\n const timeout = strategy.configTimeout ?? 5000;\n const retryCount = strategy.retryCount ?? 3;\n const retryDelay = strategy.retryDelay ?? 1000;\n const enableCache = strategy.enableCache ?? true;\n const cacheTTL = strategy.cacheTTL ?? 5 * 60 * 1000; // 5分钟\n const configVersion = strategy.configVersion;\n\n // 检查缓存\n if (enableCache && storage.localCache) {\n try {\n const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;\n const cached = await storage.localCache.get<{ data: Record<string, unknown>; version?: string }>(cacheKey);\n if (cached && (!configVersion || cached.version === configVersion)) {\n logger.debug('使用缓存的配置');\n return cached.data;\n }\n } catch (error) {\n logger.warn('读取配置缓存失败:', error);\n }\n }\n\n // 重试加载配置\n let lastError: Error | null = null;\n for (let attempt = 0; attempt <= retryCount; attempt++) {\n try {\n if (attempt > 0) {\n logger.debug(`配置加载重试 ${attempt}/${retryCount}`);\n // 指数退避\n await new Promise((resolve) => setTimeout(resolve, retryDelay * Math.pow(2, attempt - 1)));\n }\n\n const configPromise = loadConfig();\n const timeoutPromise = new Promise<Record<string, unknown>>((_, reject) =>\n setTimeout(() => reject(new NetworkError('配置加载超时')), timeout)\n );\n\n const config = await Promise.race([configPromise, timeoutPromise]);\n\n // 保存到缓存\n if (enableCache && storage.localCache) {\n try {\n const cacheKey = `${CONFIG_CACHE_KEY}_${configVersion || 'default'}`;\n await storage.localCache.set(cacheKey, { data: config, version: configVersion }, cacheTTL);\n } catch (error) {\n logger.warn('保存配置缓存失败:', error);\n }\n }\n\n return config;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n logger.warn(`配置加载失败 (尝试 ${attempt + 1}/${retryCount + 1}):`, lastError);\n }\n }\n\n // 所有重试都失败,使用降级配置\n logger.warn('配置加载失败,使用降级配置:', lastError);\n return fallbackConfig || {};\n}\n\n/**\n * 初始化方法\n * \n * 这是核心的初始化逻辑,可被启动页或直接调用\n * \n * @param options - 初始化选项\n * @param onProgress - 进度回调函数(可选)\n * @returns Promise<InitializationContext>\n * \n * @example\n * ```typescript\n * const context = await initialization({\n * loggerLevel: LogLevel.INFO,\n * lifecycle: {\n * initialization: async () => {\n * // 初始化逻辑\n * },\n * },\n * }, (progress, step) => {\n * console.log(`进度: ${progress}%, 步骤: ${step}`);\n * });\n * ```\n */\nexport async function initialization(\n options: StartOptions,\n onProgress?: ProgressCallback\n): Promise<InitializationContext> {\n const startTime = Date.now();\n let config: Record<string, unknown> = {};\n\n try {\n // 0. 执行插件初始化前钩子\n await pluginManager.executeBeforeInit(options);\n\n // 1. 设置日志级别\n onProgress?.(5, '初始化日志系统...');\n logger.setLevel(options.loggerLevel ?? LogLevel.INFO);\n\n // 2. 加载关键配置\n if (options.configStrategy?.loadCriticalConfig) {\n onProgress?.(10, '加载关键配置...');\n try {\n config = await loadConfigWithRetry(\n options.configStrategy.loadCriticalConfig,\n options.configStrategy,\n options.configStrategy.fallbackConfig\n );\n\n // 验证配置安全性\n if (options.configSecurity) {\n const securityResult = await ConfigSecurity.validateConfigSecurity(\n config,\n options.configSecurity\n );\n if (!securityResult.valid) {\n logger.warn('配置安全验证失败:', securityResult.errors);\n // 根据安全策略决定是否继续\n }\n }\n\n options.configStrategy.onConfigLoaded?.(config);\n onProgress?.(30, '关键配置加载完成');\n } catch (error) {\n logger.warn('关键配置加载失败,使用默认配置:', error);\n config = options.configStrategy.fallbackConfig || {};\n options.configStrategy.onConfigLoaded?.(config);\n onProgress?.(30, '使用默认配置');\n }\n } else {\n onProgress?.(30);\n }\n\n // 2.5. 渐进式加载非关键配置(在应用渲染后异步加载)\n if (options.configStrategy?.loadNonCriticalConfig) {\n // 智能延迟加载:根据网络状况动态调整延迟时间\n const getDelayTime = (): number => {\n if (typeof navigator === 'undefined' || !('connection' in navigator)) {\n return 1000; // 默认延迟\n }\n\n const connection = (navigator as any).connection;\n if (!connection) {\n return 1000;\n }\n\n // 根据网络类型调整延迟\n const effectiveType = connection.effectiveType;\n switch (effectiveType) {\n case 'slow-2g':\n case '2g':\n return 3000; // 慢网络延迟更久\n case '3g':\n return 2000;\n case '4g':\n default:\n return 500; // 快网络可以更快加载\n }\n };\n\n // 使用 requestIdleCallback 在空闲时加载\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(\n async () => {\n try {\n const nonCriticalConfig = await loadConfigWithRetry(\n options.configStrategy!.loadNonCriticalConfig!,\n options.configStrategy!,\n {}\n );\n // 合并到主配置\n config = { ...config, ...nonCriticalConfig };\n options.configStrategy?.onConfigLoaded?.(config);\n logger.debug('非关键配置加载完成');\n } catch (error) {\n logger.warn('非关键配置加载失败:', error);\n }\n },\n { timeout: getDelayTime() }\n );\n } else {\n // 降级方案:智能延迟加载\n setTimeout(async () => {\n try {\n const nonCriticalConfig = await loadConfigWithRetry(\n options.configStrategy!.loadNonCriticalConfig!,\n options.configStrategy!,\n {}\n );\n config = { ...config, ...nonCriticalConfig };\n options.configStrategy?.onConfigLoaded?.(config);\n logger.debug('非关键配置加载完成');\n } catch (error) {\n logger.warn('非关键配置加载失败:', error);\n }\n }, getDelayTime());\n }\n }\n\n // 3. 初始化之前回调\n if (options.lifecycle?.beforeInitialization) {\n onProgress?.(35, '执行初始化前回调...');\n await options.lifecycle.beforeInitialization();\n }\n\n // 4. 国际化设置\n onProgress?.(40, '设置国际化...');\n setupI18n(options.locale || undefined);\n\n // 5. 核心初始化\n if (options.lifecycle?.initialization) {\n onProgress?.(50, '初始化核心功能...');\n await options.lifecycle.initialization();\n onProgress?.(70, '核心功能初始化完成');\n } else {\n onProgress?.(70);\n }\n\n onProgress?.(80, '准备完成...');\n\n const duration = Date.now() - startTime;\n\n const context: InitializationContext = {\n config,\n progress: 100,\n isReady: true,\n duration,\n };\n\n // 执行插件初始化钩子\n await pluginManager.executeInit(options, context);\n\n // 执行插件初始化后钩子\n await pluginManager.executeAfterInit(options, context);\n\n // 6. 初始化之后回调(在 context 创建后执行,可以访问完整的初始化上下文)\n if (options.lifecycle?.afterInitialization) {\n onProgress?.(90, '执行初始化后回调...');\n await options.lifecycle.afterInitialization(context);\n }\n\n onProgress?.(100, '初始化完成');\n\n return context;\n } catch (error) {\n logger.error('初始化失败:', error);\n throw error;\n }\n}\n"],"names":["logger","LogLevel","setupI18n","storage","NetworkError","ConfigSecurity","pluginManager","CONFIG_CACHE_KEY","loadConfigWithRetry","loadConfig","strategy","fallbackConfig","timeout","configTimeout","retryCount","retryDelay","enableCache","cacheTTL","configVersion","localCache","cacheKey","cached","get","version","debug","data","error","warn","lastError","attempt","Promise","resolve","setTimeout","Math","pow","configPromise","timeoutPromise","_","reject","config","race","set","Error","String","initialization","options","onProgress","startTime","Date","now","executeBeforeInit","setLevel","loggerLevel","INFO","configStrategy","loadCriticalConfig","configSecurity","securityResult","validateConfigSecurity","valid","errors","onConfigLoaded","loadNonCriticalConfig","getDelayTime","navigator","connection","effectiveType","requestIdleCallback","nonCriticalConfig","lifecycle","beforeInitialization","locale","undefined","duration","context","progress","isReady","executeInit","executeAfterInit","afterInitialization"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/initialization/initialization.ts"],"sourcesContent":["import { logger, LogLevel } from '../../utils';\nimport { setupI18n } from '../../library';\nimport type { LangType } from '../../library/locale/types';\nimport type { ManagerLifecycle, StartOptions } from '../types';\nimport { pluginManager } from '../plugin';\n\n/**\n * 初始化上下文\n */\nexport interface InitializationContext {\n /**\n * 已加载的配置\n */\n config: Record<string, unknown>;\n\n /**\n * 初始化进度(0-100)\n */\n progress: number;\n\n /**\n * 是否准备就绪\n */\n isReady: boolean;\n\n /**\n * 初始化耗时(毫秒)\n */\n duration: number;\n}\n\n/**\n * 初始化选项\n */\nexport interface InitializationOptions {\n /**\n * 日志级别\n */\n loggerLevel?: LogLevel;\n\n /**\n * 国际化配置\n */\n locale?: Record<LangType, Record<string, unknown>>;\n\n /**\n * 生命周期钩子\n */\n lifecycle?: ManagerLifecycle;\n}\n\n/**\n * 进度回调函数\n */\nexport type ProgressCallback = (progress: number, step?: string) => void;\n\n/**\n * 初始化方法\n * \n * 这是核心的初始化逻辑,可被启动页或直接调用\n * \n * @param options - 初始化选项\n * @param onProgress - 进度回调函数(可选)\n * @returns Promise<InitializationContext>\n * \n * @example\n * ```typescript\n * const context = await initialization({\n * loggerLevel: LogLevel.INFO,\n * lifecycle: {\n * initialization: async () => {\n * // 初始化逻辑\n * },\n * },\n * }, (progress, step) => {\n * console.log(`进度: ${progress}%, 步骤: ${step}`);\n * });\n * ```\n */\nexport async function initialization(\n options: StartOptions,\n onProgress?: ProgressCallback\n): Promise<InitializationContext> {\n const startTime = Date.now();\n let config: Record<string, unknown> = {};\n\n try {\n // 0. 执行插件初始化前钩子\n await pluginManager.executeBeforeInit(options);\n\n // 1. 设置日志级别\n onProgress?.(5, '初始化日志系统...');\n logger.setLevel(options.loggerLevel ?? LogLevel.INFO);\n\n // 2. 预留配置阶段\n onProgress?.(30);\n\n // 3. 初始化之前回调\n if (options.lifecycle?.beforeInitialization) {\n onProgress?.(35, '执行初始化前回调...');\n await options.lifecycle.beforeInitialization();\n }\n\n // 4. 国际化设置\n onProgress?.(40, '设置国际化...');\n setupI18n(options.locale || undefined);\n\n // 5. 核心初始化\n if (options.lifecycle?.initialization) {\n onProgress?.(50, '初始化核心功能...');\n await options.lifecycle.initialization();\n onProgress?.(70, '核心功能初始化完成');\n } else {\n onProgress?.(70);\n }\n\n onProgress?.(80, '准备完成...');\n\n const duration = Date.now() - startTime;\n\n const context: InitializationContext = {\n config,\n progress: 100,\n isReady: true,\n duration,\n };\n\n // 执行插件初始化钩子\n await pluginManager.executeInit(options, context);\n\n // 执行插件初始化后钩子\n await pluginManager.executeAfterInit(options, context);\n\n // 6. 初始化之后回调(在 context 创建后执行,可以访问完整的初始化上下文)\n if (options.lifecycle?.afterInitialization) {\n onProgress?.(90, '执行初始化后回调...');\n await options.lifecycle.afterInitialization(context);\n }\n\n onProgress?.(100, '初始化完成');\n\n return context;\n } catch (error) {\n logger.error('初始化失败:', error);\n throw error;\n }\n}\n"],"names":["logger","LogLevel","setupI18n","pluginManager","initialization","options","onProgress","startTime","Date","now","config","executeBeforeInit","setLevel","loggerLevel","INFO","lifecycle","beforeInitialization","locale","undefined","duration","context","progress","isReady","executeInit","executeAfterInit","afterInitialization","error"],"mappings":"AAAA,SAASA,MAAM,EAAEC,QAAQ,QAAQ,cAAc;AAC/C,SAASC,SAAS,QAAQ,gBAAgB;AAG1C,SAASC,aAAa,QAAQ,YAAY;AAoD1C;;;;;;;;;;;;;;;;;;;;;;CAsBC,GACD,OAAO,eAAeC,eACpBC,OAAqB,EACrBC,UAA6B;IAE7B,MAAMC,YAAYC,KAAKC,GAAG;IAC1B,IAAIC,SAAkC,CAAC;IAEvC,IAAI;QACF,gBAAgB;QAChB,MAAMP,cAAcQ,iBAAiB,CAACN;QAEtC,YAAY;QACZC,aAAa,GAAG;QAChBN,OAAOY,QAAQ,CAACP,QAAQQ,WAAW,IAAIZ,SAASa,IAAI;QAEpD,YAAY;QACZR,aAAa;QAEb,aAAa;QACb,IAAID,QAAQU,SAAS,EAAEC,sBAAsB;YAC3CV,aAAa,IAAI;YACjB,MAAMD,QAAQU,SAAS,CAACC,oBAAoB;QAC9C;QAEA,WAAW;QACXV,aAAa,IAAI;QACjBJ,UAAUG,QAAQY,MAAM,IAAIC;QAE5B,WAAW;QACX,IAAIb,QAAQU,SAAS,EAAEX,gBAAgB;YACrCE,aAAa,IAAI;YACjB,MAAMD,QAAQU,SAAS,CAACX,cAAc;YACtCE,aAAa,IAAI;QACnB,OAAO;YACLA,aAAa;QACf;QAEAA,aAAa,IAAI;QAEjB,MAAMa,WAAWX,KAAKC,GAAG,KAAKF;QAE9B,MAAMa,UAAiC;YACrCV;YACAW,UAAU;YACVC,SAAS;YACTH;QACF;QAEA,YAAY;QACZ,MAAMhB,cAAcoB,WAAW,CAAClB,SAASe;QAEzC,aAAa;QACb,MAAMjB,cAAcqB,gBAAgB,CAACnB,SAASe;QAE9C,4CAA4C;QAC5C,IAAIf,QAAQU,SAAS,EAAEU,qBAAqB;YAC1CnB,aAAa,IAAI;YACjB,MAAMD,QAAQU,SAAS,CAACU,mBAAmB,CAACL;QAC9C;QAEAd,aAAa,KAAK;QAElB,OAAOc;IACT,EAAE,OAAOM,OAAO;QACd1B,OAAO0B,KAAK,CAAC,UAAUA;QACvB,MAAMA;IACR;AACF"}
|