@vlian/framework 1.1.1 → 1.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -1
- package/dist/analytics/index.cjs +24 -0
- package/dist/analytics/index.cjs.map +1 -0
- package/dist/analytics/index.d.ts +2 -0
- package/dist/analytics/index.js +3 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics.umd.js +2406 -0
- package/dist/analytics.umd.js.map +1 -0
- package/dist/components/LocaleSwitch.cjs +118 -0
- package/dist/components/LocaleSwitch.cjs.map +1 -0
- package/dist/components/LocaleSwitch.d.ts +21 -0
- package/dist/components/LocaleSwitch.js +103 -0
- package/dist/components/LocaleSwitch.js.map +1 -0
- package/dist/components/ThemeSwitch.cjs +117 -0
- package/dist/components/ThemeSwitch.cjs.map +1 -0
- package/dist/components/ThemeSwitch.d.ts +20 -0
- package/dist/components/ThemeSwitch.js +102 -0
- package/dist/components/ThemeSwitch.js.map +1 -0
- package/dist/components/index.cjs +16 -0
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.ts +5 -2
- package/dist/components/index.js +2 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/persistence.cjs +60 -0
- package/dist/components/persistence.cjs.map +1 -0
- package/dist/components/persistence.d.ts +12 -0
- package/dist/components/persistence.js +39 -0
- package/dist/components/persistence.js.map +1 -0
- package/dist/core/Test.d.ts +0 -1
- package/dist/core/app/AppContext.cjs +36 -30
- package/dist/core/app/AppContext.cjs.map +1 -1
- package/dist/core/app/AppContext.d.ts +9 -6
- package/dist/core/app/AppContext.js +36 -30
- package/dist/core/app/AppContext.js.map +1 -1
- package/dist/core/app/AppContext.types.d.ts +9 -10
- package/dist/core/app/AppContext.types.js.map +1 -1
- package/dist/core/app/BasicLayout.cjs +57 -22
- package/dist/core/app/BasicLayout.cjs.map +1 -1
- package/dist/core/app/BasicLayout.d.ts +7 -5
- package/dist/core/app/BasicLayout.js +57 -22
- package/dist/core/app/BasicLayout.js.map +1 -1
- package/dist/core/app/DefaultApp.cjs +104 -153
- package/dist/core/app/DefaultApp.cjs.map +1 -1
- package/dist/core/app/DefaultApp.d.ts +0 -21
- package/dist/core/app/DefaultApp.js +104 -153
- package/dist/core/app/DefaultApp.js.map +1 -1
- package/dist/core/app/index.d.ts +0 -1
- package/dist/core/config/AppConfig.cjs.map +1 -1
- package/dist/core/config/AppConfig.d.ts +3 -4
- package/dist/core/config/AppConfig.js.map +1 -1
- package/dist/core/config/ConfigLoader.cjs +90 -8
- package/dist/core/config/ConfigLoader.cjs.map +1 -1
- package/dist/core/config/ConfigLoader.d.ts +20 -5
- package/dist/core/config/ConfigLoader.js +90 -8
- package/dist/core/config/ConfigLoader.js.map +1 -1
- package/dist/core/config/ConfigValidator.d.ts +0 -1
- package/dist/core/config/index.d.ts +0 -1
- package/dist/core/dev/DevTools.cjs +141 -287
- package/dist/core/dev/DevTools.cjs.map +1 -1
- package/dist/core/dev/DevTools.d.ts +1 -32
- package/dist/core/dev/DevTools.js +143 -296
- package/dist/core/dev/DevTools.js.map +1 -1
- package/dist/core/error/ErrorBoundary.cjs +95 -23
- package/dist/core/error/ErrorBoundary.cjs.map +1 -1
- package/dist/core/error/ErrorBoundary.d.ts +7 -9
- package/dist/core/error/ErrorBoundary.js +96 -24
- package/dist/core/error/ErrorBoundary.js.map +1 -1
- package/dist/core/error/ErrorHandler.cjs +277 -0
- package/dist/core/error/ErrorHandler.cjs.map +1 -0
- package/dist/core/error/ErrorHandler.d.ts +171 -0
- package/dist/core/error/ErrorHandler.js +261 -0
- package/dist/core/error/ErrorHandler.js.map +1 -0
- package/dist/core/error/index.cjs +10 -0
- package/dist/core/error/index.cjs.map +1 -1
- package/dist/core/error/index.d.ts +2 -1
- package/dist/core/error/index.js +1 -0
- package/dist/core/error/index.js.map +1 -1
- package/dist/core/event/AppEventBus.d.ts +0 -1
- package/dist/core/event/frameworkEvents.d.ts +0 -1
- package/dist/core/event/hooks.d.ts +0 -1
- package/dist/core/event/index.d.ts +0 -1
- package/dist/core/event/types.d.ts +0 -1
- package/dist/core/event/useEventBus.d.ts +0 -1
- package/dist/core/index.cjs +2 -0
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.d.ts +0 -1
- package/dist/core/initialization/index.d.ts +0 -1
- package/dist/core/initialization/initialization.d.ts +0 -1
- package/dist/core/initialization/initializationErrorState.d.ts +0 -1
- package/dist/core/kernel/defaultAdapters.cjs +185 -0
- package/dist/core/kernel/defaultAdapters.cjs.map +1 -0
- package/dist/core/kernel/defaultAdapters.d.ts +2 -0
- package/dist/core/kernel/defaultAdapters.js +175 -0
- package/dist/core/kernel/defaultAdapters.js.map +1 -0
- package/dist/core/kernel/errors.cjs +71 -0
- package/dist/core/kernel/errors.cjs.map +1 -0
- package/dist/core/kernel/errors.d.ts +18 -0
- package/dist/core/kernel/errors.js +53 -0
- package/dist/core/kernel/errors.js.map +1 -0
- package/dist/core/kernel/index.cjs +22 -0
- package/dist/core/kernel/index.cjs.map +1 -0
- package/dist/core/kernel/index.d.ts +3 -0
- package/dist/core/kernel/index.js +4 -0
- package/dist/core/kernel/index.js.map +1 -0
- package/dist/core/kernel/startKernel.cjs +203 -0
- package/dist/core/kernel/startKernel.cjs.map +1 -0
- package/dist/core/kernel/startKernel.d.ts +2 -0
- package/dist/core/kernel/startKernel.js +193 -0
- package/dist/core/kernel/startKernel.js.map +1 -0
- package/dist/core/kernel/types.cjs +6 -0
- package/dist/core/kernel/types.cjs.map +1 -0
- package/dist/core/kernel/types.d.ts +114 -0
- package/dist/core/kernel/types.js +3 -0
- package/dist/core/kernel/types.js.map +1 -0
- package/dist/core/middleware.d.ts +0 -1
- package/dist/core/plugin/PluginEventBus.d.ts +0 -1
- package/dist/core/plugin/PluginSandbox.d.ts +0 -1
- package/dist/core/plugin.cjs +1 -1
- package/dist/core/plugin.cjs.map +1 -1
- package/dist/core/plugin.d.ts +0 -1
- package/dist/core/plugin.js +1 -1
- package/dist/core/plugin.js.map +1 -1
- package/dist/core/router/RouterManager.d.ts +0 -1
- package/dist/core/router/adapter/AdapterManager.d.ts +0 -1
- package/dist/core/router/adapter/index.d.ts +0 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.d.ts +0 -1
- package/dist/core/router/adapter/react-router/index.d.ts +0 -1
- package/dist/core/router/adapter/types.cjs.map +1 -1
- package/dist/core/router/adapter/types.d.ts +1 -2
- package/dist/core/router/adapter/types.js.map +1 -1
- package/dist/core/router/dev/RouterDevTools.cjs +148 -296
- package/dist/core/router/dev/RouterDevTools.cjs.map +1 -1
- package/dist/core/router/dev/RouterDevTools.d.ts +1 -6
- package/dist/core/router/dev/RouterDevTools.js +149 -301
- package/dist/core/router/dev/RouterDevTools.js.map +1 -1
- package/dist/core/router/dev/index.d.ts +0 -1
- package/dist/core/router/dynamic/DynamicRouteManager.d.ts +0 -1
- package/dist/core/router/dynamic/index.d.ts +0 -1
- package/dist/core/router/errors/RouterError.d.ts +0 -1
- package/dist/core/router/errors/index.d.ts +0 -1
- package/dist/core/router/index.d.ts +0 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.d.ts +0 -1
- package/dist/core/router/lifecycle/index.d.ts +0 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.d.ts +0 -1
- package/dist/core/router/middleware/auth.d.ts +0 -1
- package/dist/core/router/middleware/index.d.ts +0 -1
- package/dist/core/router/middleware/types.d.ts +0 -1
- package/dist/core/router/monitoring/RouterMonitoring.d.ts +0 -1
- package/dist/core/router/monitoring/index.d.ts +0 -1
- package/dist/core/router/navigation/RouterNavigation.d.ts +0 -1
- package/dist/core/router/navigation/index.d.ts +0 -1
- package/dist/core/router/performance/RouteCache.d.ts +0 -1
- package/dist/core/router/performance/RoutePreloader.d.ts +0 -1
- package/dist/core/router/performance/index.d.ts +0 -1
- package/dist/core/router/plugin/RouterPluginManager.d.ts +0 -1
- package/dist/core/router/plugin/index.d.ts +0 -1
- package/dist/core/router/plugin/types.d.ts +0 -1
- package/dist/core/router/types.d.ts +1 -2
- package/dist/core/router/types.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +90 -103
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.d.ts +0 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js +91 -104
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.cjs +13 -4
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.d.ts +0 -1
- package/dist/core/router/utils/adapters/react-router/transform.js +13 -4
- package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
- package/dist/core/router/utils/transform.cjs +1 -1
- package/dist/core/router/utils/transform.cjs.map +1 -1
- package/dist/core/router/utils/transform.d.ts +0 -1
- package/dist/core/router/utils/transform.js +1 -1
- package/dist/core/router/utils/transform.js.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.d.ts +0 -1
- package/dist/core/router/validation/index.d.ts +0 -1
- package/dist/core/router/validation/schema.d.ts +0 -1
- package/dist/core/router/version/RouteVersionManager.d.ts +0 -1
- package/dist/core/router/version/index.d.ts +0 -1
- package/dist/core/splash/SplashScreen.cjs +101 -15
- package/dist/core/splash/SplashScreen.cjs.map +1 -1
- package/dist/core/splash/SplashScreen.d.ts +0 -1
- package/dist/core/splash/SplashScreen.js +101 -15
- package/dist/core/splash/SplashScreen.js.map +1 -1
- package/dist/core/splash/index.d.ts +0 -1
- package/dist/core/splash/splashScreenUtils.d.ts +0 -1
- package/dist/core/startup/AppInstance.d.ts +0 -1
- package/dist/core/startup/environment.d.ts +0 -1
- package/dist/core/startup/index.d.ts +0 -1
- package/dist/core/startup/initializeServices.cjs +69 -24
- package/dist/core/startup/initializeServices.cjs.map +1 -1
- package/dist/core/startup/initializeServices.d.ts +9 -3
- package/dist/core/startup/initializeServices.js +73 -26
- package/dist/core/startup/initializeServices.js.map +1 -1
- package/dist/core/startup/performanceTracker.d.ts +0 -1
- package/dist/core/startup/renderApp.cjs +110 -69
- package/dist/core/startup/renderApp.cjs.map +1 -1
- package/dist/core/startup/renderApp.d.ts +2 -3
- package/dist/core/startup/renderApp.js +111 -70
- package/dist/core/startup/renderApp.js.map +1 -1
- package/dist/core/startup/startApp.cjs +123 -11
- package/dist/core/startup/startApp.cjs.map +1 -1
- package/dist/core/startup/startApp.d.ts +0 -1
- package/dist/core/startup/startApp.js +123 -11
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/core/types.d.ts +34 -21
- package/dist/core/types.js.map +1 -1
- package/dist/core/ui-adapter/adapters.cjs +45 -0
- package/dist/core/ui-adapter/adapters.cjs.map +1 -0
- package/dist/core/ui-adapter/adapters.d.ts +4 -0
- package/dist/core/ui-adapter/adapters.js +27 -0
- package/dist/core/ui-adapter/adapters.js.map +1 -0
- package/dist/core/ui-adapter/index.cjs +21 -0
- package/dist/core/ui-adapter/index.cjs.map +1 -0
- package/dist/core/ui-adapter/index.d.ts +2 -0
- package/dist/core/ui-adapter/index.js +3 -0
- package/dist/core/ui-adapter/index.js.map +1 -0
- package/dist/core/ui-adapter/types.cjs +6 -0
- package/dist/core/ui-adapter/types.cjs.map +1 -0
- package/dist/core/ui-adapter/types.d.ts +24 -0
- package/dist/core/ui-adapter/types.js +3 -0
- package/dist/core/ui-adapter/types.js.map +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/index.umd.d.ts +0 -1
- package/dist/index.umd.js +33004 -38475
- package/dist/index.umd.js.map +1 -1
- package/dist/library/index.d.ts +0 -1
- package/dist/library/locale/index.d.ts +0 -1
- package/dist/library/locale/langs/en-us/index.d.ts +0 -1
- package/dist/library/locale/langs/zh-cn/index.d.ts +0 -1
- package/dist/library/locale/types.d.ts +0 -1
- package/dist/library/storage/cache.d.ts +0 -1
- package/dist/library/storage/encryption.d.ts +0 -1
- package/dist/library/storage/index.d.ts +0 -1
- package/dist/request/adapter/RequestAdapter.d.ts +0 -1
- package/dist/request/adapter/axiosAdapter.d.ts +0 -1
- package/dist/request/adapter/fetchAdapter.d.ts +0 -1
- package/dist/request/adapter/index.d.ts +0 -1
- package/dist/request/adapter/kyAdapter.d.ts +0 -1
- package/dist/request/adapter/undiciAdapter.d.ts +0 -1
- package/dist/request/core/RequestClient.d.ts +0 -1
- package/dist/request/core/index.d.ts +0 -1
- package/dist/request/index.d.ts +0 -1
- package/dist/request/plugin/RequestPlugin.d.ts +0 -1
- package/dist/request/plugin/cache.d.ts +0 -1
- package/dist/request/plugin/csrfPlugin.d.ts +0 -1
- package/dist/request/plugin/index.d.ts +0 -1
- package/dist/request/plugin/monitoring.d.ts +0 -1
- package/dist/request/plugin/queue.d.ts +0 -1
- package/dist/request/plugin/retry.d.ts +0 -1
- package/dist/request/plugin/validation.d.ts +0 -1
- package/dist/request/runtime/RequestContext.d.ts +0 -1
- package/dist/request/runtime/index.d.ts +0 -1
- package/dist/request/types.d.ts +0 -1
- package/dist/request/utils/RequestQueueManager.d.ts +0 -1
- package/dist/request/utils/dependencyCheck.d.ts +0 -1
- package/dist/request/utils/index.d.ts +0 -1
- package/dist/request.umd.js +5392 -0
- package/dist/request.umd.js.map +1 -0
- package/dist/state/StateManager.d.ts +0 -1
- package/dist/state/adapters/AdapterFactory.d.ts +0 -1
- package/dist/state/adapters/DefaultAdapter.d.ts +0 -1
- package/dist/state/adapters/ReduxAdapter.d.ts +0 -1
- package/dist/state/adapters/ZustandAdapter.d.ts +0 -1
- package/dist/state/adapters/index.d.ts +0 -1
- package/dist/state/adapters/types.d.ts +0 -1
- package/dist/state/core/DerivedStateInstance.d.ts +0 -1
- package/dist/state/core/StateInstance.d.ts +0 -1
- package/dist/state/core/StateRegistry.d.ts +0 -1
- package/dist/state/core/StateScope.d.ts +0 -1
- package/dist/state/core/index.d.ts +0 -1
- package/dist/state/index.d.ts +0 -1
- package/dist/state/types.d.ts +0 -1
- package/dist/state.umd.js +1414 -0
- package/dist/state.umd.js.map +1 -0
- package/dist/types.d.ts +0 -1
- package/dist/utils/analytics.d.ts +0 -1
- package/dist/utils/configSecurity.d.ts +0 -1
- package/dist/utils/csrf.d.ts +0 -1
- package/dist/utils/errors/ErrorCodes.d.ts +0 -1
- package/dist/utils/errors.cjs +44 -1
- package/dist/utils/errors.cjs.map +1 -1
- package/dist/utils/errors.d.ts +5 -1
- package/dist/utils/errors.js +44 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.types.d.ts +0 -1
- package/dist/utils/monitoring.d.ts +0 -1
- package/dist/utils/performance.d.ts +0 -1
- package/dist/utils/resourceLoader.d.ts +0 -1
- package/dist/utils/runtimeSecurity.d.ts +0 -1
- package/dist/utils/security.d.ts +0 -1
- package/dist/utils/traceId.d.ts +0 -1
- package/dist/utils/validation.d.ts +0 -1
- package/package.json +57 -8
- package/dist/components/index.d.ts.map +0 -1
- package/dist/core/Test.d.ts.map +0 -1
- package/dist/core/app/AppContext.d.ts.map +0 -1
- package/dist/core/app/AppContext.types.d.ts.map +0 -1
- package/dist/core/app/BasicLayout.d.ts.map +0 -1
- package/dist/core/app/DefaultApp.d.ts.map +0 -1
- package/dist/core/app/index.d.ts.map +0 -1
- package/dist/core/config/AppConfig.d.ts.map +0 -1
- package/dist/core/config/ConfigLoader.d.ts.map +0 -1
- package/dist/core/config/ConfigValidator.d.ts.map +0 -1
- package/dist/core/config/index.d.ts.map +0 -1
- package/dist/core/dev/DevTools.d.ts.map +0 -1
- package/dist/core/error/ErrorBoundary.d.ts.map +0 -1
- package/dist/core/error/index.d.ts.map +0 -1
- package/dist/core/event/AppEventBus.d.ts.map +0 -1
- package/dist/core/event/frameworkEvents.d.ts.map +0 -1
- package/dist/core/event/hooks.d.ts.map +0 -1
- package/dist/core/event/index.d.ts.map +0 -1
- package/dist/core/event/types.d.ts.map +0 -1
- package/dist/core/event/useEventBus.d.ts.map +0 -1
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/initialization/InitializationErrorThrower.d.ts.map +0 -1
- package/dist/core/initialization/index.d.ts.map +0 -1
- package/dist/core/initialization/initialization.d.ts.map +0 -1
- package/dist/core/initialization/initializationErrorState.d.ts.map +0 -1
- package/dist/core/middleware.d.ts.map +0 -1
- package/dist/core/plugin/PluginEventBus.d.ts.map +0 -1
- package/dist/core/plugin/PluginSandbox.d.ts.map +0 -1
- package/dist/core/plugin.d.ts.map +0 -1
- package/dist/core/router/RouterManager.d.ts.map +0 -1
- package/dist/core/router/adapter/AdapterManager.d.ts.map +0 -1
- package/dist/core/router/adapter/index.d.ts.map +0 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.d.ts.map +0 -1
- package/dist/core/router/adapter/react-router/index.d.ts.map +0 -1
- package/dist/core/router/adapter/types.d.ts.map +0 -1
- package/dist/core/router/dev/RouterDevTools.d.ts.map +0 -1
- package/dist/core/router/dev/index.d.ts.map +0 -1
- package/dist/core/router/dynamic/DynamicRouteManager.d.ts.map +0 -1
- package/dist/core/router/dynamic/index.d.ts.map +0 -1
- package/dist/core/router/errors/RouterError.d.ts.map +0 -1
- package/dist/core/router/errors/index.d.ts.map +0 -1
- package/dist/core/router/index.d.ts.map +0 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.d.ts.map +0 -1
- package/dist/core/router/lifecycle/index.d.ts.map +0 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.d.ts.map +0 -1
- package/dist/core/router/middleware/auth.d.ts.map +0 -1
- package/dist/core/router/middleware/index.d.ts.map +0 -1
- package/dist/core/router/middleware/types.d.ts.map +0 -1
- package/dist/core/router/monitoring/RouterMonitoring.d.ts.map +0 -1
- package/dist/core/router/monitoring/index.d.ts.map +0 -1
- package/dist/core/router/navigation/RouterNavigation.d.ts.map +0 -1
- package/dist/core/router/navigation/index.d.ts.map +0 -1
- package/dist/core/router/performance/RouteCache.d.ts.map +0 -1
- package/dist/core/router/performance/RoutePreloader.d.ts.map +0 -1
- package/dist/core/router/performance/index.d.ts.map +0 -1
- package/dist/core/router/plugin/RouterPluginManager.d.ts.map +0 -1
- package/dist/core/router/plugin/index.d.ts.map +0 -1
- package/dist/core/router/plugin/types.d.ts.map +0 -1
- package/dist/core/router/types.d.ts.map +0 -1
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.d.ts.map +0 -1
- package/dist/core/router/utils/adapters/react-router/transform.d.ts.map +0 -1
- package/dist/core/router/utils/transform.d.ts.map +0 -1
- package/dist/core/router/validation/RouterConfigValidator.d.ts.map +0 -1
- package/dist/core/router/validation/index.d.ts.map +0 -1
- package/dist/core/router/validation/schema.d.ts.map +0 -1
- package/dist/core/router/version/RouteVersionManager.d.ts.map +0 -1
- package/dist/core/router/version/index.d.ts.map +0 -1
- package/dist/core/splash/SplashScreen.d.ts.map +0 -1
- package/dist/core/splash/index.d.ts.map +0 -1
- package/dist/core/splash/splashScreenUtils.d.ts.map +0 -1
- package/dist/core/startup/AppInstance.d.ts.map +0 -1
- package/dist/core/startup/environment.d.ts.map +0 -1
- package/dist/core/startup/index.d.ts.map +0 -1
- package/dist/core/startup/initializeServices.d.ts.map +0 -1
- package/dist/core/startup/performanceTracker.d.ts.map +0 -1
- package/dist/core/startup/renderApp.d.ts.map +0 -1
- package/dist/core/startup/startApp.d.ts.map +0 -1
- package/dist/core/types.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.umd.d.ts.map +0 -1
- package/dist/library/index.d.ts.map +0 -1
- package/dist/library/locale/index.d.ts.map +0 -1
- package/dist/library/locale/langs/en-us/index.d.ts.map +0 -1
- package/dist/library/locale/langs/zh-cn/index.d.ts.map +0 -1
- package/dist/library/locale/types.d.ts.map +0 -1
- package/dist/library/storage/cache.d.ts.map +0 -1
- package/dist/library/storage/encryption.d.ts.map +0 -1
- package/dist/library/storage/index.d.ts.map +0 -1
- package/dist/request/adapter/RequestAdapter.d.ts.map +0 -1
- package/dist/request/adapter/axiosAdapter.d.ts.map +0 -1
- package/dist/request/adapter/fetchAdapter.d.ts.map +0 -1
- package/dist/request/adapter/index.d.ts.map +0 -1
- package/dist/request/adapter/kyAdapter.d.ts.map +0 -1
- package/dist/request/adapter/undiciAdapter.d.ts.map +0 -1
- package/dist/request/core/RequestClient.d.ts.map +0 -1
- package/dist/request/core/index.d.ts.map +0 -1
- package/dist/request/index.d.ts.map +0 -1
- package/dist/request/plugin/RequestPlugin.d.ts.map +0 -1
- package/dist/request/plugin/cache.d.ts.map +0 -1
- package/dist/request/plugin/csrfPlugin.d.ts.map +0 -1
- package/dist/request/plugin/index.d.ts.map +0 -1
- package/dist/request/plugin/monitoring.d.ts.map +0 -1
- package/dist/request/plugin/queue.d.ts.map +0 -1
- package/dist/request/plugin/retry.d.ts.map +0 -1
- package/dist/request/plugin/validation.d.ts.map +0 -1
- package/dist/request/runtime/RequestContext.d.ts.map +0 -1
- package/dist/request/runtime/index.d.ts.map +0 -1
- package/dist/request/types.d.ts.map +0 -1
- package/dist/request/utils/RequestQueueManager.d.ts.map +0 -1
- package/dist/request/utils/dependencyCheck.d.ts.map +0 -1
- package/dist/request/utils/index.d.ts.map +0 -1
- package/dist/state/StateManager.d.ts.map +0 -1
- package/dist/state/adapters/AdapterFactory.d.ts.map +0 -1
- package/dist/state/adapters/DefaultAdapter.d.ts.map +0 -1
- package/dist/state/adapters/ReduxAdapter.d.ts.map +0 -1
- package/dist/state/adapters/ZustandAdapter.d.ts.map +0 -1
- package/dist/state/adapters/index.d.ts.map +0 -1
- package/dist/state/adapters/types.d.ts.map +0 -1
- package/dist/state/core/DerivedStateInstance.d.ts.map +0 -1
- package/dist/state/core/StateInstance.d.ts.map +0 -1
- package/dist/state/core/StateRegistry.d.ts.map +0 -1
- package/dist/state/core/StateScope.d.ts.map +0 -1
- package/dist/state/core/index.d.ts.map +0 -1
- package/dist/state/index.d.ts.map +0 -1
- package/dist/state/types.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/analytics.d.ts.map +0 -1
- package/dist/utils/configSecurity.d.ts.map +0 -1
- package/dist/utils/csrf.d.ts.map +0 -1
- package/dist/utils/errors/ErrorCodes.d.ts.map +0 -1
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.types.d.ts.map +0 -1
- package/dist/utils/monitoring.d.ts.map +0 -1
- package/dist/utils/performance.d.ts.map +0 -1
- package/dist/utils/resourceLoader.d.ts.map +0 -1
- package/dist/utils/runtimeSecurity.d.ts.map +0 -1
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/traceId.d.ts.map +0 -1
- package/dist/utils/validation.d.ts.map +0 -1
|
@@ -75,10 +75,81 @@ function _interop_require_wildcard(obj, nodeInterop) {
|
|
|
75
75
|
}
|
|
76
76
|
return newObj;
|
|
77
77
|
}
|
|
78
|
+
const OptimizedAppContent = /*#__PURE__*/ (0, _react.memo)(({ options, services, context, // securityConfig 用于未来扩展,当前暂不使用
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
80
|
+
securityConfig: _securityConfig })=>{
|
|
81
|
+
// 优化:使用 useMemo 缓存初始语言计算
|
|
82
|
+
const initialLocale = (0, _react.useMemo)(()=>{
|
|
83
|
+
return options.locale ? Object.keys(options.locale)[0] || 'zh-CN' : 'zh-CN';
|
|
84
|
+
}, [
|
|
85
|
+
options.locale
|
|
86
|
+
]);
|
|
87
|
+
// 优化:使用 useMemo 缓存路由判断结果
|
|
88
|
+
const shouldUseRouter = (0, _react.useMemo)(()=>{
|
|
89
|
+
const routerEnabled = options.router ? options.router.enabled !== false && options.router.enabled !== 'disabled' : false;
|
|
90
|
+
if (!routerEnabled) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
const routerManager = (0, _RouterManager.getRouterManager)();
|
|
94
|
+
const router = routerManager.getRouter();
|
|
95
|
+
return router !== null;
|
|
96
|
+
}, [
|
|
97
|
+
options.router
|
|
98
|
+
]);
|
|
99
|
+
// 优化:使用 useMemo 缓存路由实例
|
|
100
|
+
const router = (0, _react.useMemo)(()=>{
|
|
101
|
+
if (!shouldUseRouter) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const routerManager = (0, _RouterManager.getRouterManager)();
|
|
105
|
+
return routerManager.getRouter();
|
|
106
|
+
}, [
|
|
107
|
+
shouldUseRouter
|
|
108
|
+
]);
|
|
109
|
+
// 优化:使用 useCallback 缓存错误处理函数
|
|
110
|
+
const handleError = (0, _react.useCallback)((error)=>{
|
|
111
|
+
services.monitoring.captureError(error);
|
|
112
|
+
}, [
|
|
113
|
+
services.monitoring
|
|
114
|
+
]);
|
|
115
|
+
// 优化:使用 useMemo 缓存应用内容
|
|
116
|
+
const appContent = (0, _react.useMemo)(()=>{
|
|
117
|
+
if (shouldUseRouter && router) {
|
|
118
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_reactrouterdom.RouterProvider, {
|
|
119
|
+
router: router
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return options.app || /*#__PURE__*/ (0, _jsxruntime.jsx)(_app.DefaultApp, {});
|
|
123
|
+
}, [
|
|
124
|
+
shouldUseRouter,
|
|
125
|
+
router,
|
|
126
|
+
options.app
|
|
127
|
+
]);
|
|
128
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_error.ErrorBoundary, {
|
|
129
|
+
fallback: options.errorFallback,
|
|
130
|
+
onError: handleError,
|
|
131
|
+
children: [
|
|
132
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_initialization.InitializationErrorThrower, {}),
|
|
133
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_app.AppContextProvider, {
|
|
134
|
+
initialTheme: options.theme,
|
|
135
|
+
initialLocale: initialLocale,
|
|
136
|
+
initialAntdConfig: options.uiProvider || options.antd,
|
|
137
|
+
initialInitializationContext: context,
|
|
138
|
+
stateManager: services.stateManager,
|
|
139
|
+
antdApp: options.uiApp || options.antdApp,
|
|
140
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_app.BasicLayout, {
|
|
141
|
+
globalProvider: options.globalProvider,
|
|
142
|
+
children: appContent
|
|
143
|
+
})
|
|
144
|
+
})
|
|
145
|
+
]
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
OptimizedAppContent.displayName = 'OptimizedAppContent';
|
|
78
149
|
let AppRenderer = class AppRenderer {
|
|
79
150
|
/**
|
|
80
151
|
* 初始化渲染器
|
|
81
|
-
*
|
|
152
|
+
*
|
|
82
153
|
* @param container - React应用的挂载容器
|
|
83
154
|
* @param rootOptions - React根节点配置选项
|
|
84
155
|
*/ initialize(container, rootOptions) {
|
|
@@ -89,12 +160,12 @@ let AppRenderer = class AppRenderer {
|
|
|
89
160
|
}
|
|
90
161
|
/**
|
|
91
162
|
* 渲染应用
|
|
92
|
-
*
|
|
163
|
+
*
|
|
93
164
|
* 优化:
|
|
94
165
|
* 1. 默认启用安全防护(XSS防护)
|
|
95
|
-
* 2.
|
|
96
|
-
* 3.
|
|
97
|
-
*
|
|
166
|
+
* 2. 优化组件渲染性能,使用 useMemo 缓存计算结果
|
|
167
|
+
* 3. 将安全配置计算提取到初始化阶段
|
|
168
|
+
*
|
|
98
169
|
* @param options - 启动配置选项
|
|
99
170
|
* @param services - 服务实例
|
|
100
171
|
* @param context - 初始化上下文(可选)
|
|
@@ -102,30 +173,19 @@ let AppRenderer = class AppRenderer {
|
|
|
102
173
|
if (!this.root) {
|
|
103
174
|
throw new Error('渲染器未初始化,请先调用 initialize()');
|
|
104
175
|
}
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
// 检查路由是否已启用
|
|
108
|
-
// 路由启用的条件:配置了 router 且 enabled !== false 且 enabled !== 'disabled'
|
|
109
|
-
const routerEnabled = options.router ? options.router.enabled !== false && options.router.enabled !== 'disabled' : false;
|
|
110
|
-
// 检查路由管理器是否已初始化(运行时状态)
|
|
111
|
-
const routerManager = (0, _RouterManager.getRouterManager)();
|
|
112
|
-
const router = routerManager.getRouter();
|
|
113
|
-
// const isRouterInitialized = routerManager.isRouterEnabled();
|
|
114
|
-
// 如果路由已启用且已初始化,使用 RouterProvider(路由系统接管渲染)
|
|
115
|
-
// 否则直接渲染应用内容(不使用路由系统)
|
|
116
|
-
const shouldUseRouter = routerEnabled && router !== null;
|
|
117
|
-
// 安全性增强:应用默认安全策略
|
|
118
|
-
// 默认启用 XSS 防护、配置验证和用户输入清理
|
|
176
|
+
// 优化:安全配置在初始化阶段计算(在 startApp 中预计算)
|
|
177
|
+
// 这里只使用预计算的值,避免在渲染时重复计算
|
|
119
178
|
const securityConfig = {
|
|
120
179
|
enableXSSProtection: options.security?.enableXSSProtection ?? true,
|
|
121
180
|
validateConfig: options.security?.validateConfig ?? true,
|
|
122
181
|
sanitizeUserInput: options.security?.sanitizeUserInput ?? true,
|
|
123
182
|
csrf: options.security?.csrf
|
|
124
183
|
};
|
|
184
|
+
// 优化:安全验证在初始化阶段完成,这里只进行必要的运行时检查
|
|
125
185
|
// 如果启用了安全模式(默认启用),对配置进行验证
|
|
126
|
-
if (securityConfig.enableXSSProtection) {
|
|
127
|
-
|
|
128
|
-
|
|
186
|
+
if (securityConfig.enableXSSProtection && securityConfig.validateConfig) {
|
|
187
|
+
// 异步验证配置,不阻塞渲染
|
|
188
|
+
Promise.resolve().then(()=>{
|
|
129
189
|
try {
|
|
130
190
|
const configStr = JSON.stringify(options);
|
|
131
191
|
const validation = _security.SecurityUtils.validateInput(configStr);
|
|
@@ -137,59 +197,39 @@ let AppRenderer = class AppRenderer {
|
|
|
137
197
|
} catch (error) {
|
|
138
198
|
// 忽略序列化错误(某些配置项可能包含不可序列化的内容)
|
|
139
199
|
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
});
|
|
151
|
-
}).catch((error)=>{
|
|
152
|
-
// CSRF 初始化失败不影响应用启动,但记录警告
|
|
153
|
-
if (process.env.NODE_ENV === 'development') {
|
|
154
|
-
console.warn('CSRF 防护初始化失败:', error);
|
|
155
|
-
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// 初始化 CSRF 防护(如果启用,异步执行,不阻塞渲染)
|
|
203
|
+
if (securityConfig.enableXSSProtection && securityConfig.csrf?.enabled !== false) {
|
|
204
|
+
Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../utils/csrf"))).then(({ initCSRFManager })=>{
|
|
205
|
+
initCSRFManager({
|
|
206
|
+
headerName: securityConfig.csrf?.headerName,
|
|
207
|
+
cookieName: securityConfig.csrf?.cookieName,
|
|
208
|
+
getToken: securityConfig.csrf?.getToken,
|
|
209
|
+
validateToken: securityConfig.csrf?.validateToken
|
|
156
210
|
});
|
|
157
|
-
}
|
|
211
|
+
}).catch((error)=>{
|
|
212
|
+
// CSRF 初始化失败不影响应用启动,但记录警告
|
|
213
|
+
if (process.env.NODE_ENV === 'development') {
|
|
214
|
+
console.warn('CSRF 防护初始化失败:', error);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
158
217
|
}
|
|
159
|
-
//
|
|
160
|
-
const handleError = (error)=>{
|
|
161
|
-
services.monitoring.captureError(error);
|
|
162
|
-
};
|
|
218
|
+
// 使用优化的应用内容组件,内部使用 useMemo 缓存计算结果
|
|
163
219
|
this.root.render(/*#__PURE__*/ (0, _jsxruntime.jsx)(_react.StrictMode, {
|
|
164
|
-
children: /*#__PURE__*/ (0, _jsxruntime.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
/*#__PURE__*/ (0, _jsxruntime.jsx)(_app.AppContextProvider, {
|
|
170
|
-
initialTheme: options.theme,
|
|
171
|
-
initialLocale: initialLocale,
|
|
172
|
-
initialAntdConfig: options.antd,
|
|
173
|
-
initialInitializationContext: context,
|
|
174
|
-
stateManager: services.stateManager,
|
|
175
|
-
antdApp: options.antdApp,
|
|
176
|
-
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_app.BasicLayout, {
|
|
177
|
-
children: shouldUseRouter ? // 启用路由时,使用 RouterProvider(路由内容由路由配置决定)
|
|
178
|
-
/*#__PURE__*/ (0, _jsxruntime.jsx)(_reactrouterdom.RouterProvider, {
|
|
179
|
-
router: router
|
|
180
|
-
}) : // 未启用路由时,直接渲染应用内容
|
|
181
|
-
options.app || /*#__PURE__*/ (0, _jsxruntime.jsx)(_app.DefaultApp, {})
|
|
182
|
-
})
|
|
183
|
-
})
|
|
184
|
-
]
|
|
220
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(OptimizedAppContent, {
|
|
221
|
+
options: options,
|
|
222
|
+
services: services,
|
|
223
|
+
context: context,
|
|
224
|
+
securityConfig: securityConfig
|
|
185
225
|
})
|
|
186
226
|
}));
|
|
187
227
|
}
|
|
188
228
|
/**
|
|
189
229
|
* 渲染启动页
|
|
190
|
-
*
|
|
230
|
+
*
|
|
191
231
|
* 注意:启动页不使用 RouterWrapper,因为启动页应该在路由系统之前渲染
|
|
192
|
-
*
|
|
232
|
+
*
|
|
193
233
|
* @param options - 启动配置选项
|
|
194
234
|
* @param services - 服务实例
|
|
195
235
|
* @param onComplete - 启动页完成回调
|
|
@@ -210,10 +250,11 @@ let AppRenderer = class AppRenderer {
|
|
|
210
250
|
/*#__PURE__*/ (0, _jsxruntime.jsx)(_app.AppContextProvider, {
|
|
211
251
|
initialTheme: options.theme,
|
|
212
252
|
initialLocale: initialLocale,
|
|
213
|
-
initialAntdConfig: options.antd,
|
|
253
|
+
initialAntdConfig: options.uiProvider || options.antd,
|
|
214
254
|
stateManager: services.stateManager,
|
|
215
|
-
antdApp: options.antdApp,
|
|
255
|
+
antdApp: options.uiApp || options.antdApp,
|
|
216
256
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_app.BasicLayout, {
|
|
257
|
+
globalProvider: options.globalProvider,
|
|
217
258
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_splash.SplashScreen, {
|
|
218
259
|
options: options,
|
|
219
260
|
onComplete: onComplete
|
|
@@ -226,7 +267,7 @@ let AppRenderer = class AppRenderer {
|
|
|
226
267
|
}
|
|
227
268
|
/**
|
|
228
269
|
* 渲染错误页面
|
|
229
|
-
*
|
|
270
|
+
*
|
|
230
271
|
* @param options - 启动配置选项
|
|
231
272
|
* @param services - 服务实例
|
|
232
273
|
* @param error - 错误信息
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/startup/renderApp.tsx"],"sourcesContent":["/**\n * 应用渲染模块\n * 负责渲染React应用\n */\n\nimport { createRoot } from 'react-dom/client';\nimport type { Root } from 'react-dom/client';\nimport { StrictMode } from 'react';\nimport type { Container, RootOptions } from 'react-dom/client';\nimport { BasicLayout, DefaultApp, AppContextProvider } from '../app';\nimport type { LangType } from '../../library/locale/types';\nimport { ErrorBoundary } from '../error';\nimport { InitializationErrorThrower } from '../initialization';\nimport type { StartOptions } from '../types';\nimport type { InitializationContext } from '../initialization';\nimport type { MonitoringService } from '../../utils/monitoring';\nimport type { StateManager } from '../../state';\nimport { SplashScreen } from '../splash';\nimport { SecurityUtils } from '../../utils/security';\nimport { getRouterManager } from '../router/RouterManager';\nimport { RouterProvider } from \"react-router-dom\";\n\n/**\n * 应用渲染器\n */\nexport class AppRenderer {\n private root: Root | null = null;\n private container: Container | null = null;\n\n /**\n * 初始化渲染器\n * \n * @param container - React应用的挂载容器\n * @param rootOptions - React根节点配置选项\n */\n initialize(container: Container, rootOptions?: RootOptions): void {\n this.container = container;\n if (!this.root) {\n this.root = createRoot(container, rootOptions);\n }\n }\n\n /**\n * 渲染应用\n * \n * 优化:\n * 1. 默认启用安全防护(XSS防护)\n * 2. 优化组件渲染性能\n * 3. 缓存计算结果,避免重复计算\n * \n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param context - 初始化上下文(可选)\n */\n async renderApp(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n context?: InitializationContext\n ): Promise<void> {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 获取初始语言(从 locale 配置中推断,或使用默认值)\n const initialLocale: LangType = options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n\n // 检查路由是否已启用\n // 路由启用的条件:配置了 router 且 enabled !== false 且 enabled !== 'disabled'\n const routerEnabled = options.router\n ? options.router.enabled !== false && options.router.enabled !== 'disabled'\n : false;\n \n // 检查路由管理器是否已初始化(运行时状态)\n const routerManager = getRouterManager();\n const router = routerManager.getRouter();\n // const isRouterInitialized = routerManager.isRouterEnabled();\n\n // 如果路由已启用且已初始化,使用 RouterProvider(路由系统接管渲染)\n // 否则直接渲染应用内容(不使用路由系统)\n const shouldUseRouter = routerEnabled && router !== null;\n\n // 安全性增强:应用默认安全策略\n // 默认启用 XSS 防护、配置验证和用户输入清理\n const securityConfig = {\n enableXSSProtection: options.security?.enableXSSProtection ?? true,\n validateConfig: options.security?.validateConfig ?? true,\n sanitizeUserInput: options.security?.sanitizeUserInput ?? true,\n csrf: options.security?.csrf,\n };\n\n // 如果启用了安全模式(默认启用),对配置进行验证\n if (securityConfig.enableXSSProtection) {\n if (securityConfig.validateConfig) {\n // 验证配置项中可能包含的字符串内容\n try {\n const configStr = JSON.stringify(options);\n const validation = SecurityUtils.validateInput(configStr);\n if (!validation.safe) {\n services.monitoring.captureError(\n new Error('配置项包含不安全内容'),\n { reason: validation.reason }\n );\n }\n } catch (error) {\n // 忽略序列化错误(某些配置项可能包含不可序列化的内容)\n }\n }\n\n // 初始化 CSRF 防护(如果启用)\n if (securityConfig.csrf?.enabled !== false) {\n // 异步初始化 CSRF,但不阻塞渲染\n import('../../utils/csrf').then(({ initCSRFManager }) => {\n initCSRFManager({\n headerName: securityConfig.csrf?.headerName,\n cookieName: securityConfig.csrf?.cookieName,\n getToken: securityConfig.csrf?.getToken,\n validateToken: securityConfig.csrf?.validateToken,\n });\n }).catch((error) => {\n // CSRF 初始化失败不影响应用启动,但记录警告\n if (process.env.NODE_ENV === 'development') {\n console.warn('CSRF 防护初始化失败:', error);\n }\n });\n }\n }\n\n // 优化:缓存错误处理函数,避免每次渲染都创建新函数\n const handleError = (error: unknown) => {\n services.monitoring.captureError(error);\n };\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={handleError}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.antd}\n initialInitializationContext={context}\n stateManager={services.stateManager}\n antdApp={options.antdApp}\n >\n <BasicLayout>\n {shouldUseRouter ? (\n // 启用路由时,使用 RouterProvider(路由内容由路由配置决定)\n <RouterProvider router={router} />\n ) : (\n // 未启用路由时,直接渲染应用内容\n options.app || <DefaultApp />\n )}\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 渲染启动页\n * \n * 注意:启动页不使用 RouterWrapper,因为启动页应该在路由系统之前渲染\n * \n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param onComplete - 启动页完成回调\n */\n renderSplashScreen(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n onComplete: (context: InitializationContext) => void\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 获取初始语言(从 locale 配置中推断,或使用默认值)\n const initialLocale: LangType = options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(error) => {\n services.monitoring.captureError(error);\n }}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.antd}\n stateManager={services.stateManager}\n antdApp={options.antdApp}\n >\n {/* \n 启动页不使用 RouterWrapper,因为:\n 1. 启动页应该在路由系统初始化之前渲染\n 2. 启动页完成后才会渲染主应用,此时路由系统已经初始化完成\n */}\n <BasicLayout>\n <SplashScreen options={options} onComplete={onComplete} />\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 渲染错误页面\n * \n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param error - 错误信息\n */\n renderError(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n }\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(err) => {\n services.monitoring.captureError(err);\n if (options.errorMonitor?.onError) {\n options.errorMonitor.onError(err);\n }\n }}\n >\n <InitializationErrorThrower />\n <div>框架启动失败</div>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 销毁渲染器\n */\n destroy(): void {\n if (this.root) {\n this.root.unmount();\n this.root = null;\n }\n this.container = null;\n }\n\n /**\n * 获取容器\n */\n getContainer(): Container | null {\n return this.container;\n }\n}\n"],"names":["AppRenderer","initialize","container","rootOptions","root","createRoot","renderApp","options","services","context","Error","initialLocale","locale","Object","keys","routerEnabled","router","enabled","routerManager","getRouterManager","getRouter","shouldUseRouter","securityConfig","enableXSSProtection","security","validateConfig","sanitizeUserInput","csrf","configStr","JSON","stringify","validation","SecurityUtils","validateInput","safe","monitoring","captureError","reason","error","then","initCSRFManager","headerName","cookieName","getToken","validateToken","catch","process","env","NODE_ENV","console","warn","handleError","render","StrictMode","ErrorBoundary","fallback","errorFallback","onError","InitializationErrorThrower","AppContextProvider","initialTheme","theme","initialAntdConfig","antd","initialInitializationContext","stateManager","antdApp","BasicLayout","RouterProvider","app","DefaultApp","renderSplashScreen","onComplete","SplashScreen","renderError","err","errorMonitor","div","destroy","unmount","getContainer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/startup/renderApp.tsx"],"sourcesContent":["/**\n * 应用渲染模块\n * 负责渲染React应用\n */\n\nimport { createRoot } from 'react-dom/client';\nimport type { Root } from 'react-dom/client';\nimport { StrictMode, useMemo, useCallback, memo } from 'react';\nimport type { Container, RootOptions } from 'react-dom/client';\nimport { BasicLayout, DefaultApp, AppContextProvider } from '../app';\nimport type { LangType } from '../../library/locale/types';\nimport { ErrorBoundary } from '../error';\nimport { InitializationErrorThrower } from '../initialization';\nimport type { StartOptions } from '../types';\nimport type { InitializationContext } from '../initialization';\nimport type { MonitoringService } from '../../utils/monitoring';\nimport type { StateManager } from '../../state';\nimport { SplashScreen } from '../splash';\nimport { SecurityUtils } from '../../utils/security';\nimport { getRouterManager } from '../router/RouterManager';\nimport { RouterProvider } from \"react-router-dom\";\n\n/**\n * 安全配置类型\n */\ninterface SecurityConfig {\n enableXSSProtection: boolean;\n validateConfig: boolean;\n sanitizeUserInput: boolean;\n csrf?: StartOptions['security'] extends infer S\n ? S extends { csrf?: infer C }\n ? C\n : never\n : never;\n}\n\n/**\n * 优化的应用内容组件\n * 使用 useMemo 缓存计算结果,提升渲染性能\n */\ninterface OptimizedAppContentProps {\n options: StartOptions;\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n };\n context?: InitializationContext;\n securityConfig: SecurityConfig;\n}\n\nconst OptimizedAppContent = memo<OptimizedAppContentProps>(({\n options,\n services,\n context,\n // securityConfig 用于未来扩展,当前暂不使用\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n securityConfig: _securityConfig,\n}) => {\n // 优化:使用 useMemo 缓存初始语言计算\n const initialLocale = useMemo<LangType>(() => {\n return options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n }, [options.locale]);\n\n // 优化:使用 useMemo 缓存路由判断结果\n const shouldUseRouter = useMemo(() => {\n const routerEnabled = options.router\n ? options.router.enabled !== false && options.router.enabled !== 'disabled'\n : false;\n\n if (!routerEnabled) {\n return false;\n }\n\n const routerManager = getRouterManager();\n const router = routerManager.getRouter();\n return router !== null;\n }, [options.router]);\n\n // 优化:使用 useMemo 缓存路由实例\n const router = useMemo(() => {\n if (!shouldUseRouter) {\n return null;\n }\n const routerManager = getRouterManager();\n return routerManager.getRouter();\n }, [shouldUseRouter]);\n\n // 优化:使用 useCallback 缓存错误处理函数\n const handleError = useCallback((error: unknown) => {\n services.monitoring.captureError(error);\n }, [services.monitoring]);\n\n // 优化:使用 useMemo 缓存应用内容\n const appContent = useMemo(() => {\n if (shouldUseRouter && router) {\n return <RouterProvider router={router} />;\n }\n return options.app || <DefaultApp />;\n }, [shouldUseRouter, router, options.app]);\n\n return (\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={handleError}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.uiProvider || options.antd}\n initialInitializationContext={context}\n stateManager={services.stateManager}\n antdApp={options.uiApp || options.antdApp}\n >\n <BasicLayout globalProvider={options.globalProvider}>\n {appContent}\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n );\n});\n\nOptimizedAppContent.displayName = 'OptimizedAppContent';\n\n/**\n * 应用渲染器\n */\nexport class AppRenderer {\n private root: Root | null = null;\n private container: Container | null = null;\n\n /**\n * 初始化渲染器\n *\n * @param container - React应用的挂载容器\n * @param rootOptions - React根节点配置选项\n */\n initialize(container: Container, rootOptions?: RootOptions): void {\n this.container = container;\n if (!this.root) {\n this.root = createRoot(container, rootOptions);\n }\n }\n\n /**\n * 渲染应用\n *\n * 优化:\n * 1. 默认启用安全防护(XSS防护)\n * 2. 优化组件渲染性能,使用 useMemo 缓存计算结果\n * 3. 将安全配置计算提取到初始化阶段\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param context - 初始化上下文(可选)\n */\n async renderApp(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n context?: InitializationContext\n ): Promise<void> {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 优化:安全配置在初始化阶段计算(在 startApp 中预计算)\n // 这里只使用预计算的值,避免在渲染时重复计算\n const securityConfig: SecurityConfig = {\n enableXSSProtection: options.security?.enableXSSProtection ?? true,\n validateConfig: options.security?.validateConfig ?? true,\n sanitizeUserInput: options.security?.sanitizeUserInput ?? true,\n csrf: options.security?.csrf,\n };\n\n // 优化:安全验证在初始化阶段完成,这里只进行必要的运行时检查\n // 如果启用了安全模式(默认启用),对配置进行验证\n if (securityConfig.enableXSSProtection && securityConfig.validateConfig) {\n // 异步验证配置,不阻塞渲染\n Promise.resolve().then(() => {\n try {\n const configStr = JSON.stringify(options);\n const validation = SecurityUtils.validateInput(configStr);\n if (!validation.safe) {\n services.monitoring.captureError(\n new Error('配置项包含不安全内容'),\n { reason: validation.reason }\n );\n }\n } catch (error) {\n // 忽略序列化错误(某些配置项可能包含不可序列化的内容)\n }\n });\n }\n\n // 初始化 CSRF 防护(如果启用,异步执行,不阻塞渲染)\n if (securityConfig.enableXSSProtection && securityConfig.csrf?.enabled !== false) {\n import('../../utils/csrf').then(({ initCSRFManager }) => {\n initCSRFManager({\n headerName: securityConfig.csrf?.headerName,\n cookieName: securityConfig.csrf?.cookieName,\n getToken: securityConfig.csrf?.getToken,\n validateToken: securityConfig.csrf?.validateToken,\n });\n }).catch((error) => {\n // CSRF 初始化失败不影响应用启动,但记录警告\n if (process.env.NODE_ENV === 'development') {\n console.warn('CSRF 防护初始化失败:', error);\n }\n });\n }\n\n // 使用优化的应用内容组件,内部使用 useMemo 缓存计算结果\n this.root.render(\n <StrictMode>\n <OptimizedAppContent\n options={options}\n services={services}\n context={context}\n securityConfig={securityConfig}\n />\n </StrictMode>\n );\n }\n\n /**\n * 渲染启动页\n *\n * 注意:启动页不使用 RouterWrapper,因为启动页应该在路由系统之前渲染\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param onComplete - 启动页完成回调\n */\n renderSplashScreen(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n stateManager: StateManager;\n },\n onComplete: (context: InitializationContext) => void\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n // 获取初始语言(从 locale 配置中推断,或使用默认值)\n const initialLocale: LangType = options.locale\n ? (Object.keys(options.locale)[0] as LangType) || 'zh-CN'\n : 'zh-CN';\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(error) => {\n services.monitoring.captureError(error);\n }}\n >\n <InitializationErrorThrower />\n <AppContextProvider\n initialTheme={options.theme}\n initialLocale={initialLocale}\n initialAntdConfig={options.uiProvider || options.antd}\n stateManager={services.stateManager}\n antdApp={options.uiApp || options.antdApp}\n >\n {/*\n 启动页不使用 RouterWrapper,因为:\n 1. 启动页应该在路由系统初始化之前渲染\n 2. 启动页完成后才会渲染主应用,此时路由系统已经初始化完成\n */}\n <BasicLayout globalProvider={options.globalProvider}>\n <SplashScreen options={options} onComplete={onComplete} />\n </BasicLayout>\n </AppContextProvider>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 渲染错误页面\n *\n * @param options - 启动配置选项\n * @param services - 服务实例\n * @param error - 错误信息\n */\n renderError(\n options: StartOptions,\n services: {\n monitoring: MonitoringService;\n }\n ): void {\n if (!this.root) {\n throw new Error('渲染器未初始化,请先调用 initialize()');\n }\n\n this.root.render(\n <StrictMode>\n <ErrorBoundary\n fallback={options.errorFallback}\n onError={(err) => {\n services.monitoring.captureError(err);\n if (options.errorMonitor?.onError) {\n options.errorMonitor.onError(err);\n }\n }}\n >\n <InitializationErrorThrower />\n <div>框架启动失败</div>\n </ErrorBoundary>\n </StrictMode>\n );\n }\n\n /**\n * 销毁渲染器\n */\n destroy(): void {\n if (this.root) {\n this.root.unmount();\n this.root = null;\n }\n this.container = null;\n }\n\n /**\n * 获取容器\n */\n getContainer(): Container | null {\n return this.container;\n }\n}\n"],"names":["AppRenderer","OptimizedAppContent","memo","options","services","context","securityConfig","_securityConfig","initialLocale","useMemo","locale","Object","keys","shouldUseRouter","routerEnabled","router","enabled","routerManager","getRouterManager","getRouter","handleError","useCallback","error","monitoring","captureError","appContent","RouterProvider","app","DefaultApp","ErrorBoundary","fallback","errorFallback","onError","InitializationErrorThrower","AppContextProvider","initialTheme","theme","initialAntdConfig","uiProvider","antd","initialInitializationContext","stateManager","antdApp","uiApp","BasicLayout","globalProvider","displayName","initialize","container","rootOptions","root","createRoot","renderApp","Error","enableXSSProtection","security","validateConfig","sanitizeUserInput","csrf","Promise","resolve","then","configStr","JSON","stringify","validation","SecurityUtils","validateInput","safe","reason","initCSRFManager","headerName","cookieName","getToken","validateToken","catch","process","env","NODE_ENV","console","warn","render","StrictMode","renderSplashScreen","onComplete","SplashScreen","renderError","err","errorMonitor","div","destroy","unmount","getContainer"],"mappings":"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"}
|
|
@@ -25,8 +25,8 @@ export declare class AppRenderer {
|
|
|
25
25
|
*
|
|
26
26
|
* 优化:
|
|
27
27
|
* 1. 默认启用安全防护(XSS防护)
|
|
28
|
-
* 2.
|
|
29
|
-
* 3.
|
|
28
|
+
* 2. 优化组件渲染性能,使用 useMemo 缓存计算结果
|
|
29
|
+
* 3. 将安全配置计算提取到初始化阶段
|
|
30
30
|
*
|
|
31
31
|
* @param options - 启动配置选项
|
|
32
32
|
* @param services - 服务实例
|
|
@@ -68,4 +68,3 @@ export declare class AppRenderer {
|
|
|
68
68
|
*/
|
|
69
69
|
getContainer(): Container | null;
|
|
70
70
|
}
|
|
71
|
-
//# sourceMappingURL=renderApp.d.ts.map
|
|
@@ -16,7 +16,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
16
16
|
* 应用渲染模块
|
|
17
17
|
* 负责渲染React应用
|
|
18
18
|
*/ import { createRoot } from "react-dom/client";
|
|
19
|
-
import { StrictMode } from "react";
|
|
19
|
+
import { StrictMode, useMemo, useCallback, memo } from "react";
|
|
20
20
|
import { BasicLayout, DefaultApp, AppContextProvider } from "../app";
|
|
21
21
|
import { ErrorBoundary } from "../error";
|
|
22
22
|
import { InitializationErrorThrower } from "../initialization";
|
|
@@ -24,12 +24,83 @@ import { SplashScreen } from "../splash";
|
|
|
24
24
|
import { SecurityUtils } from "../../utils/security";
|
|
25
25
|
import { getRouterManager } from "../router/RouterManager";
|
|
26
26
|
import { RouterProvider } from "react-router-dom";
|
|
27
|
+
const OptimizedAppContent = /*#__PURE__*/ memo(({ options, services, context, // securityConfig 用于未来扩展,当前暂不使用
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
29
|
+
securityConfig: _securityConfig })=>{
|
|
30
|
+
// 优化:使用 useMemo 缓存初始语言计算
|
|
31
|
+
const initialLocale = useMemo(()=>{
|
|
32
|
+
return options.locale ? Object.keys(options.locale)[0] || 'zh-CN' : 'zh-CN';
|
|
33
|
+
}, [
|
|
34
|
+
options.locale
|
|
35
|
+
]);
|
|
36
|
+
// 优化:使用 useMemo 缓存路由判断结果
|
|
37
|
+
const shouldUseRouter = useMemo(()=>{
|
|
38
|
+
const routerEnabled = options.router ? options.router.enabled !== false && options.router.enabled !== 'disabled' : false;
|
|
39
|
+
if (!routerEnabled) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const routerManager = getRouterManager();
|
|
43
|
+
const router = routerManager.getRouter();
|
|
44
|
+
return router !== null;
|
|
45
|
+
}, [
|
|
46
|
+
options.router
|
|
47
|
+
]);
|
|
48
|
+
// 优化:使用 useMemo 缓存路由实例
|
|
49
|
+
const router = useMemo(()=>{
|
|
50
|
+
if (!shouldUseRouter) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const routerManager = getRouterManager();
|
|
54
|
+
return routerManager.getRouter();
|
|
55
|
+
}, [
|
|
56
|
+
shouldUseRouter
|
|
57
|
+
]);
|
|
58
|
+
// 优化:使用 useCallback 缓存错误处理函数
|
|
59
|
+
const handleError = useCallback((error)=>{
|
|
60
|
+
services.monitoring.captureError(error);
|
|
61
|
+
}, [
|
|
62
|
+
services.monitoring
|
|
63
|
+
]);
|
|
64
|
+
// 优化:使用 useMemo 缓存应用内容
|
|
65
|
+
const appContent = useMemo(()=>{
|
|
66
|
+
if (shouldUseRouter && router) {
|
|
67
|
+
return /*#__PURE__*/ _jsx(RouterProvider, {
|
|
68
|
+
router: router
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return options.app || /*#__PURE__*/ _jsx(DefaultApp, {});
|
|
72
|
+
}, [
|
|
73
|
+
shouldUseRouter,
|
|
74
|
+
router,
|
|
75
|
+
options.app
|
|
76
|
+
]);
|
|
77
|
+
return /*#__PURE__*/ _jsxs(ErrorBoundary, {
|
|
78
|
+
fallback: options.errorFallback,
|
|
79
|
+
onError: handleError,
|
|
80
|
+
children: [
|
|
81
|
+
/*#__PURE__*/ _jsx(InitializationErrorThrower, {}),
|
|
82
|
+
/*#__PURE__*/ _jsx(AppContextProvider, {
|
|
83
|
+
initialTheme: options.theme,
|
|
84
|
+
initialLocale: initialLocale,
|
|
85
|
+
initialAntdConfig: options.uiProvider || options.antd,
|
|
86
|
+
initialInitializationContext: context,
|
|
87
|
+
stateManager: services.stateManager,
|
|
88
|
+
antdApp: options.uiApp || options.antdApp,
|
|
89
|
+
children: /*#__PURE__*/ _jsx(BasicLayout, {
|
|
90
|
+
globalProvider: options.globalProvider,
|
|
91
|
+
children: appContent
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
]
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
OptimizedAppContent.displayName = 'OptimizedAppContent';
|
|
27
98
|
/**
|
|
28
99
|
* 应用渲染器
|
|
29
100
|
*/ export class AppRenderer {
|
|
30
101
|
/**
|
|
31
102
|
* 初始化渲染器
|
|
32
|
-
*
|
|
103
|
+
*
|
|
33
104
|
* @param container - React应用的挂载容器
|
|
34
105
|
* @param rootOptions - React根节点配置选项
|
|
35
106
|
*/ initialize(container, rootOptions) {
|
|
@@ -40,12 +111,12 @@ import { RouterProvider } from "react-router-dom";
|
|
|
40
111
|
}
|
|
41
112
|
/**
|
|
42
113
|
* 渲染应用
|
|
43
|
-
*
|
|
114
|
+
*
|
|
44
115
|
* 优化:
|
|
45
116
|
* 1. 默认启用安全防护(XSS防护)
|
|
46
|
-
* 2.
|
|
47
|
-
* 3.
|
|
48
|
-
*
|
|
117
|
+
* 2. 优化组件渲染性能,使用 useMemo 缓存计算结果
|
|
118
|
+
* 3. 将安全配置计算提取到初始化阶段
|
|
119
|
+
*
|
|
49
120
|
* @param options - 启动配置选项
|
|
50
121
|
* @param services - 服务实例
|
|
51
122
|
* @param context - 初始化上下文(可选)
|
|
@@ -53,30 +124,19 @@ import { RouterProvider } from "react-router-dom";
|
|
|
53
124
|
if (!this.root) {
|
|
54
125
|
throw new Error('渲染器未初始化,请先调用 initialize()');
|
|
55
126
|
}
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
// 检查路由是否已启用
|
|
59
|
-
// 路由启用的条件:配置了 router 且 enabled !== false 且 enabled !== 'disabled'
|
|
60
|
-
const routerEnabled = options.router ? options.router.enabled !== false && options.router.enabled !== 'disabled' : false;
|
|
61
|
-
// 检查路由管理器是否已初始化(运行时状态)
|
|
62
|
-
const routerManager = getRouterManager();
|
|
63
|
-
const router = routerManager.getRouter();
|
|
64
|
-
// const isRouterInitialized = routerManager.isRouterEnabled();
|
|
65
|
-
// 如果路由已启用且已初始化,使用 RouterProvider(路由系统接管渲染)
|
|
66
|
-
// 否则直接渲染应用内容(不使用路由系统)
|
|
67
|
-
const shouldUseRouter = routerEnabled && router !== null;
|
|
68
|
-
// 安全性增强:应用默认安全策略
|
|
69
|
-
// 默认启用 XSS 防护、配置验证和用户输入清理
|
|
127
|
+
// 优化:安全配置在初始化阶段计算(在 startApp 中预计算)
|
|
128
|
+
// 这里只使用预计算的值,避免在渲染时重复计算
|
|
70
129
|
const securityConfig = {
|
|
71
130
|
enableXSSProtection: options.security?.enableXSSProtection ?? true,
|
|
72
131
|
validateConfig: options.security?.validateConfig ?? true,
|
|
73
132
|
sanitizeUserInput: options.security?.sanitizeUserInput ?? true,
|
|
74
133
|
csrf: options.security?.csrf
|
|
75
134
|
};
|
|
135
|
+
// 优化:安全验证在初始化阶段完成,这里只进行必要的运行时检查
|
|
76
136
|
// 如果启用了安全模式(默认启用),对配置进行验证
|
|
77
|
-
if (securityConfig.enableXSSProtection) {
|
|
78
|
-
|
|
79
|
-
|
|
137
|
+
if (securityConfig.enableXSSProtection && securityConfig.validateConfig) {
|
|
138
|
+
// 异步验证配置,不阻塞渲染
|
|
139
|
+
Promise.resolve().then(()=>{
|
|
80
140
|
try {
|
|
81
141
|
const configStr = JSON.stringify(options);
|
|
82
142
|
const validation = SecurityUtils.validateInput(configStr);
|
|
@@ -88,59 +148,39 @@ import { RouterProvider } from "react-router-dom";
|
|
|
88
148
|
} catch (error) {
|
|
89
149
|
// 忽略序列化错误(某些配置项可能包含不可序列化的内容)
|
|
90
150
|
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
});
|
|
102
|
-
}).catch((error)=>{
|
|
103
|
-
// CSRF 初始化失败不影响应用启动,但记录警告
|
|
104
|
-
if (process.env.NODE_ENV === 'development') {
|
|
105
|
-
console.warn('CSRF 防护初始化失败:', error);
|
|
106
|
-
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// 初始化 CSRF 防护(如果启用,异步执行,不阻塞渲染)
|
|
154
|
+
if (securityConfig.enableXSSProtection && securityConfig.csrf?.enabled !== false) {
|
|
155
|
+
import("../../utils/csrf").then(({ initCSRFManager })=>{
|
|
156
|
+
initCSRFManager({
|
|
157
|
+
headerName: securityConfig.csrf?.headerName,
|
|
158
|
+
cookieName: securityConfig.csrf?.cookieName,
|
|
159
|
+
getToken: securityConfig.csrf?.getToken,
|
|
160
|
+
validateToken: securityConfig.csrf?.validateToken
|
|
107
161
|
});
|
|
108
|
-
}
|
|
162
|
+
}).catch((error)=>{
|
|
163
|
+
// CSRF 初始化失败不影响应用启动,但记录警告
|
|
164
|
+
if (process.env.NODE_ENV === 'development') {
|
|
165
|
+
console.warn('CSRF 防护初始化失败:', error);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
109
168
|
}
|
|
110
|
-
//
|
|
111
|
-
const handleError = (error)=>{
|
|
112
|
-
services.monitoring.captureError(error);
|
|
113
|
-
};
|
|
169
|
+
// 使用优化的应用内容组件,内部使用 useMemo 缓存计算结果
|
|
114
170
|
this.root.render(/*#__PURE__*/ _jsx(StrictMode, {
|
|
115
|
-
children: /*#__PURE__*/
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
/*#__PURE__*/ _jsx(AppContextProvider, {
|
|
121
|
-
initialTheme: options.theme,
|
|
122
|
-
initialLocale: initialLocale,
|
|
123
|
-
initialAntdConfig: options.antd,
|
|
124
|
-
initialInitializationContext: context,
|
|
125
|
-
stateManager: services.stateManager,
|
|
126
|
-
antdApp: options.antdApp,
|
|
127
|
-
children: /*#__PURE__*/ _jsx(BasicLayout, {
|
|
128
|
-
children: shouldUseRouter ? // 启用路由时,使用 RouterProvider(路由内容由路由配置决定)
|
|
129
|
-
/*#__PURE__*/ _jsx(RouterProvider, {
|
|
130
|
-
router: router
|
|
131
|
-
}) : // 未启用路由时,直接渲染应用内容
|
|
132
|
-
options.app || /*#__PURE__*/ _jsx(DefaultApp, {})
|
|
133
|
-
})
|
|
134
|
-
})
|
|
135
|
-
]
|
|
171
|
+
children: /*#__PURE__*/ _jsx(OptimizedAppContent, {
|
|
172
|
+
options: options,
|
|
173
|
+
services: services,
|
|
174
|
+
context: context,
|
|
175
|
+
securityConfig: securityConfig
|
|
136
176
|
})
|
|
137
177
|
}));
|
|
138
178
|
}
|
|
139
179
|
/**
|
|
140
180
|
* 渲染启动页
|
|
141
|
-
*
|
|
181
|
+
*
|
|
142
182
|
* 注意:启动页不使用 RouterWrapper,因为启动页应该在路由系统之前渲染
|
|
143
|
-
*
|
|
183
|
+
*
|
|
144
184
|
* @param options - 启动配置选项
|
|
145
185
|
* @param services - 服务实例
|
|
146
186
|
* @param onComplete - 启动页完成回调
|
|
@@ -161,10 +201,11 @@ import { RouterProvider } from "react-router-dom";
|
|
|
161
201
|
/*#__PURE__*/ _jsx(AppContextProvider, {
|
|
162
202
|
initialTheme: options.theme,
|
|
163
203
|
initialLocale: initialLocale,
|
|
164
|
-
initialAntdConfig: options.antd,
|
|
204
|
+
initialAntdConfig: options.uiProvider || options.antd,
|
|
165
205
|
stateManager: services.stateManager,
|
|
166
|
-
antdApp: options.antdApp,
|
|
206
|
+
antdApp: options.uiApp || options.antdApp,
|
|
167
207
|
children: /*#__PURE__*/ _jsx(BasicLayout, {
|
|
208
|
+
globalProvider: options.globalProvider,
|
|
168
209
|
children: /*#__PURE__*/ _jsx(SplashScreen, {
|
|
169
210
|
options: options,
|
|
170
211
|
onComplete: onComplete
|
|
@@ -177,7 +218,7 @@ import { RouterProvider } from "react-router-dom";
|
|
|
177
218
|
}
|
|
178
219
|
/**
|
|
179
220
|
* 渲染错误页面
|
|
180
|
-
*
|
|
221
|
+
*
|
|
181
222
|
* @param options - 启动配置选项
|
|
182
223
|
* @param services - 服务实例
|
|
183
224
|
* @param error - 错误信息
|