@vlian/framework 1.2.59 → 1.2.61
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/index.cjs +1 -22
- package/dist/analytics.umd.js +1 -1
- package/dist/components/LocaleSwitch.cjs +1 -116
- package/dist/components/ThemeSwitch.cjs +1 -115
- package/dist/components/index.cjs +1 -20
- package/dist/components/persistence.cjs +1 -58
- package/dist/core/Test.cjs +1 -64
- package/dist/core/app/AppContext.cjs +1 -348
- package/dist/core/app/AppContext.types.cjs +1 -4
- package/dist/core/app/BasicLayout.cjs +1 -122
- package/dist/core/app/DefaultApp.cjs +1 -150
- package/dist/core/app/index.cjs +1 -41
- package/dist/core/config/AppConfig.cjs +1 -139
- package/dist/core/config/ConfigLoader.cjs +1 -323
- package/dist/core/config/ConfigValidator.cjs +2 -133
- package/dist/core/config/index.cjs +1 -28
- package/dist/core/dev/DevTools.cjs +1 -226
- package/dist/core/error/ErrorBoundary.cjs +1 -401
- package/dist/core/error/ErrorHandler.cjs +1 -275
- package/dist/core/error/index.cjs +1 -34
- package/dist/core/event/AppEventBus.cjs +1 -444
- package/dist/core/event/frameworkEvents.cjs +1 -141
- package/dist/core/event/hooks.cjs +1 -69
- package/dist/core/event/index.cjs +1 -41
- package/dist/core/event/types.cjs +1 -62
- package/dist/core/event/useEventBus.cjs +1 -25
- package/dist/core/index.cjs +1 -140
- package/dist/core/initialization/InitializationErrorThrower.cjs +1 -75
- package/dist/core/initialization/index.cjs +1 -26
- package/dist/core/initialization/initialization.cjs +1 -64
- package/dist/core/initialization/initializationErrorState.cjs +1 -66
- package/dist/core/kernel/defaultAdapters.cjs +1 -184
- package/dist/core/kernel/errors.cjs +1 -69
- package/dist/core/kernel/index.cjs +1 -20
- package/dist/core/kernel/startKernel.cjs +1 -200
- package/dist/core/kernel/types.cjs +1 -4
- package/dist/core/middleware.cjs +1 -73
- package/dist/core/plugin/PluginEventBus.cjs +1 -298
- package/dist/core/plugin/PluginSandbox.cjs +1 -137
- package/dist/core/plugin.cjs +1 -494
- package/dist/core/router/RouterManager.cjs +1 -286
- package/dist/core/router/adapter/AdapterManager.cjs +1 -235
- package/dist/core/router/adapter/index.cjs +1 -22
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +1 -128
- package/dist/core/router/adapter/react-router/index.cjs +1 -20
- package/dist/core/router/adapter/types.cjs +1 -6
- package/dist/core/router/dev/RouterDevTools.cjs +1 -260
- package/dist/core/router/dev/index.cjs +1 -20
- package/dist/core/router/dynamic/DynamicRouteManager.cjs +1 -193
- package/dist/core/router/dynamic/index.cjs +1 -20
- package/dist/core/router/errors/RouterError.cjs +1 -61
- package/dist/core/router/errors/index.cjs +1 -20
- package/dist/core/router/index.cjs +1 -36
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +1 -144
- package/dist/core/router/lifecycle/index.cjs +1 -20
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs +1 -193
- package/dist/core/router/middleware/auth.cjs +1 -66
- package/dist/core/router/middleware/index.cjs +1 -22
- package/dist/core/router/middleware/types.cjs +1 -6
- package/dist/core/router/monitoring/RouterMonitoring.cjs +1 -227
- package/dist/core/router/monitoring/index.cjs +1 -20
- package/dist/core/router/navigation/RouterNavigation.cjs +1 -239
- package/dist/core/router/navigation/index.cjs +1 -20
- package/dist/core/router/performance/RouteCache.cjs +1 -305
- package/dist/core/router/performance/RoutePreloader.cjs +1 -292
- package/dist/core/router/performance/index.cjs +1 -21
- package/dist/core/router/plugin/RouterPluginManager.cjs +1 -262
- package/dist/core/router/plugin/index.cjs +1 -21
- package/dist/core/router/plugin/types.cjs +1 -39
- package/dist/core/router/types.cjs +1 -4
- package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +1 -129
- package/dist/core/router/utils/adapters/react-router/transform.cjs +1 -250
- package/dist/core/router/utils/transform.cjs +1 -780
- package/dist/core/router/validation/RouterConfigValidator.cjs +2 -83
- package/dist/core/router/validation/index.cjs +1 -21
- package/dist/core/router/validation/schema.cjs +1 -159
- package/dist/core/router/version/RouteVersionManager.cjs +1 -205
- package/dist/core/router/version/index.cjs +1 -20
- package/dist/core/splash/SplashScreen.cjs +1 -341
- package/dist/core/splash/index.cjs +1 -22
- package/dist/core/splash/splashScreenUtils.cjs +1 -38
- package/dist/core/startup/AppInstance.cjs +1 -239
- package/dist/core/startup/environment.cjs +1 -169
- package/dist/core/startup/index.cjs +1 -23
- package/dist/core/startup/initializeServices.cjs +1 -226
- package/dist/core/startup/performanceTracker.cjs +1 -179
- package/dist/core/startup/renderApp.cjs +1 -314
- package/dist/core/startup/startApp.cjs +1 -317
- package/dist/core/types.cjs +1 -4
- package/dist/index.cjs +1 -52
- package/dist/index.umd.cjs +1 -27
- package/dist/index.umd.js +1 -1
- package/dist/kernel/constants.cjs +1 -65
- package/dist/kernel/index.cjs +1 -38
- package/dist/kernel/kernel.cjs +1 -295
- package/dist/kernel/manager/cacheManager.cjs +1 -46
- package/dist/kernel/manager/i18n/I18nManager.cjs +1 -91
- package/dist/kernel/manager/i18n/i18n.persistence.cjs +1 -60
- package/dist/kernel/manager/i18n/i18n.schema.cjs +1 -86
- package/dist/kernel/manager/i18n/index.cjs +1 -11
- package/dist/kernel/manager/i18nManager.cjs +1 -11
- package/dist/kernel/manager/index.cjs +1 -28
- package/dist/kernel/manager/logger/LoggerManager.cjs +1 -107
- package/dist/kernel/manager/logger/index.cjs +1 -11
- package/dist/kernel/manager/logger/logger.persistence.cjs +1 -62
- package/dist/kernel/manager/logger/logger.schema.cjs +1 -74
- package/dist/kernel/manager/loggerManager.cjs +1 -11
- package/dist/kernel/manager/theme/ThemeManager.cjs +1 -84
- package/dist/kernel/manager/theme/index.cjs +1 -11
- package/dist/kernel/manager/theme/theme.dom.cjs +1 -61
- package/dist/kernel/manager/theme/theme.persistence.cjs +1 -57
- package/dist/kernel/manager/theme/theme.schema.cjs +1 -122
- package/dist/kernel/manager/themeManager.cjs +1 -11
- package/dist/kernel/types.cjs +1 -4
- package/dist/library/index.cjs +1 -19
- package/dist/library/locale/index.cjs +1 -39
- package/dist/library/locale/langs/en-us/index.cjs +1 -32
- package/dist/library/locale/langs/zh-cn/index.cjs +1 -32
- package/dist/library/locale/types.cjs +1 -4
- package/dist/library/storage/cache.cjs +1 -243
- package/dist/library/storage/encryption.cjs +1 -147
- package/dist/library/storage/index.cjs +1 -124
- package/dist/state/StateManager.cjs +1 -166
- package/dist/state/adapters/AdapterFactory.cjs +1 -89
- package/dist/state/adapters/DefaultAdapter.cjs +1 -75
- package/dist/state/adapters/ReduxAdapter.cjs +1 -443
- package/dist/state/adapters/ZustandAdapter.cjs +1 -69
- package/dist/state/adapters/index.cjs +1 -44
- package/dist/state/adapters/types.cjs +1 -20
- package/dist/state/core/DerivedStateInstance.cjs +1 -174
- package/dist/state/core/StateInstance.cjs +1 -170
- package/dist/state/core/StateRegistry.cjs +1 -110
- package/dist/state/core/StateScope.cjs +1 -137
- package/dist/state/core/index.cjs +1 -30
- package/dist/state/index.cjs +1 -30
- package/dist/state/types.cjs +1 -12
- package/dist/state.umd.js +1 -1
- package/dist/types.cjs +1 -4
- package/dist/utils/analytics.cjs +1 -217
- package/dist/utils/configSecurity.cjs +3 -182
- package/dist/utils/csrf.cjs +1 -18
- package/dist/utils/errors/ErrorCodes.cjs +1 -25
- package/dist/utils/errors.cjs +1 -111
- package/dist/utils/index.cjs +1 -135
- package/dist/utils/logger.cjs +1 -25
- package/dist/utils/logger.types.cjs +1 -11
- package/dist/utils/monitoring.cjs +1 -18
- package/dist/utils/performance.cjs +1 -22
- package/dist/utils/resourceLoader.cjs +1 -22
- package/dist/utils/runtimeSecurity.cjs +1 -11
- package/dist/utils/security.cjs +1 -19
- package/dist/utils/traceId.cjs +1 -37
- package/dist/utils/validation.cjs +1 -19
- package/package.json +12 -3
|
@@ -1,169 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 环境检测模块
|
|
3
|
-
* 负责检测运行环境和提供适配能力
|
|
4
|
-
*/ /**
|
|
5
|
-
* 运行环境类型
|
|
6
|
-
*/ "use strict";
|
|
7
|
-
Object.defineProperty(exports, "__esModule", {
|
|
8
|
-
value: true
|
|
9
|
-
});
|
|
10
|
-
function _export(target, all) {
|
|
11
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
12
|
-
enumerable: true,
|
|
13
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
_export(exports, {
|
|
17
|
-
get EnvironmentDetector () {
|
|
18
|
-
return EnvironmentDetector;
|
|
19
|
-
},
|
|
20
|
-
get RuntimeEnvironment () {
|
|
21
|
-
return RuntimeEnvironment;
|
|
22
|
-
},
|
|
23
|
-
get getEnvironmentDetector () {
|
|
24
|
-
return getEnvironmentDetector;
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
function _define_property(obj, key, value) {
|
|
28
|
-
if (key in obj) {
|
|
29
|
-
Object.defineProperty(obj, key, {
|
|
30
|
-
value: value,
|
|
31
|
-
enumerable: true,
|
|
32
|
-
configurable: true,
|
|
33
|
-
writable: true
|
|
34
|
-
});
|
|
35
|
-
} else {
|
|
36
|
-
obj[key] = value;
|
|
37
|
-
}
|
|
38
|
-
return obj;
|
|
39
|
-
}
|
|
40
|
-
var RuntimeEnvironment = /*#__PURE__*/ function(RuntimeEnvironment) {
|
|
41
|
-
/**
|
|
42
|
-
* 浏览器环境
|
|
43
|
-
*/ RuntimeEnvironment["BROWSER"] = "browser";
|
|
44
|
-
/**
|
|
45
|
-
* 服务端渲染环境(SSR)
|
|
46
|
-
*/ RuntimeEnvironment["SSR"] = "ssr";
|
|
47
|
-
/**
|
|
48
|
-
* 微前端容器环境
|
|
49
|
-
*/ RuntimeEnvironment["MICRO_FRONTEND"] = "micro-frontend";
|
|
50
|
-
/**
|
|
51
|
-
* Node.js环境
|
|
52
|
-
*/ RuntimeEnvironment["NODE"] = "node";
|
|
53
|
-
/**
|
|
54
|
-
* 未知环境
|
|
55
|
-
*/ RuntimeEnvironment["UNKNOWN"] = "unknown";
|
|
56
|
-
return RuntimeEnvironment;
|
|
57
|
-
}({});
|
|
58
|
-
let EnvironmentDetector = class EnvironmentDetector {
|
|
59
|
-
/**
|
|
60
|
-
* 获取单例实例
|
|
61
|
-
*/ static getInstance() {
|
|
62
|
-
if (!EnvironmentDetector.instance) {
|
|
63
|
-
EnvironmentDetector.instance = new EnvironmentDetector();
|
|
64
|
-
}
|
|
65
|
-
return EnvironmentDetector.instance;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* 检测微前端环境
|
|
69
|
-
*/ detectMicroFrontend() {
|
|
70
|
-
if (typeof window === 'undefined') {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
// 检测是否在微前端容器中
|
|
74
|
-
// 常见的微前端框架标识
|
|
75
|
-
return !!(window.__POWERED_BY_QIANKUN__ || window.__MICRO_APP_ENVIRONMENT__ || window.singleSpa || window.__SINGLE_SPA__);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* 检测运行环境
|
|
79
|
-
*/ detectEnvironment() {
|
|
80
|
-
if (this.isMicroFrontend) {
|
|
81
|
-
return "micro-frontend";
|
|
82
|
-
}
|
|
83
|
-
if (this.isSSR) {
|
|
84
|
-
return "ssr";
|
|
85
|
-
}
|
|
86
|
-
if (this.isBrowser) {
|
|
87
|
-
return "browser";
|
|
88
|
-
}
|
|
89
|
-
if (typeof process !== 'undefined') {
|
|
90
|
-
return "node";
|
|
91
|
-
}
|
|
92
|
-
return "unknown";
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* 获取当前运行环境
|
|
96
|
-
*/ getEnvironment() {
|
|
97
|
-
return this.environment;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* 是否为浏览器环境
|
|
101
|
-
*/ isBrowserEnvironment() {
|
|
102
|
-
return this.isBrowser;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* 是否为SSR环境
|
|
106
|
-
*/ isSSREnvironment() {
|
|
107
|
-
return this.isSSR;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* 是否为微前端环境
|
|
111
|
-
*/ isMicroFrontendEnvironment() {
|
|
112
|
-
return this.isMicroFrontend;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* 安全获取DOM元素(支持SSR)
|
|
116
|
-
*
|
|
117
|
-
* @param selector - 选择器或元素ID
|
|
118
|
-
* @returns DOM元素或null
|
|
119
|
-
*/ safeGetElement(selector) {
|
|
120
|
-
if (!this.isBrowser) {
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
if (typeof selector === 'function') {
|
|
124
|
-
try {
|
|
125
|
-
return selector();
|
|
126
|
-
} catch {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
try {
|
|
131
|
-
if (selector.startsWith('#')) {
|
|
132
|
-
return document.getElementById(selector.slice(1));
|
|
133
|
-
}
|
|
134
|
-
return document.querySelector(selector);
|
|
135
|
-
} catch {
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* 安全执行浏览器API(支持SSR)
|
|
141
|
-
*
|
|
142
|
-
* @param fn - 要执行的函数
|
|
143
|
-
* @param fallback - 非浏览器环境的回退值
|
|
144
|
-
* @returns 执行结果或回退值
|
|
145
|
-
*/ safeExecuteBrowserAPI(fn, fallback) {
|
|
146
|
-
if (!this.isBrowser) {
|
|
147
|
-
return fallback;
|
|
148
|
-
}
|
|
149
|
-
try {
|
|
150
|
-
return fn();
|
|
151
|
-
} catch {
|
|
152
|
-
return fallback;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
constructor(){
|
|
156
|
-
_define_property(this, "environment", void 0);
|
|
157
|
-
_define_property(this, "isBrowser", void 0);
|
|
158
|
-
_define_property(this, "isSSR", void 0);
|
|
159
|
-
_define_property(this, "isMicroFrontend", void 0);
|
|
160
|
-
this.isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
|
|
161
|
-
this.isSSR = typeof window === 'undefined' && typeof process !== 'undefined';
|
|
162
|
-
this.isMicroFrontend = this.detectMicroFrontend();
|
|
163
|
-
this.environment = this.detectEnvironment();
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
_define_property(EnvironmentDetector, "instance", null);
|
|
167
|
-
function getEnvironmentDetector() {
|
|
168
|
-
return EnvironmentDetector.getInstance();
|
|
169
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get EnvironmentDetector(){return EnvironmentDetector},get RuntimeEnvironment(){return RuntimeEnvironment},get getEnvironmentDetector(){return getEnvironmentDetector}});function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}var RuntimeEnvironment=/*#__PURE__*/function(RuntimeEnvironment){RuntimeEnvironment["BROWSER"]="browser";RuntimeEnvironment["SSR"]="ssr";RuntimeEnvironment["MICRO_FRONTEND"]="micro-frontend";RuntimeEnvironment["NODE"]="node";RuntimeEnvironment["UNKNOWN"]="unknown";return RuntimeEnvironment}({});let EnvironmentDetector=class EnvironmentDetector{static getInstance(){if(!EnvironmentDetector.instance){EnvironmentDetector.instance=new EnvironmentDetector}return EnvironmentDetector.instance}detectMicroFrontend(){if(typeof window==="undefined"){return false}return!!(window.__POWERED_BY_QIANKUN__||window.__MICRO_APP_ENVIRONMENT__||window.singleSpa||window.__SINGLE_SPA__)}detectEnvironment(){if(this.isMicroFrontend){return"micro-frontend"}if(this.isSSR){return"ssr"}if(this.isBrowser){return"browser"}if(typeof process!=="undefined"){return"node"}return"unknown"}getEnvironment(){return this.environment}isBrowserEnvironment(){return this.isBrowser}isSSREnvironment(){return this.isSSR}isMicroFrontendEnvironment(){return this.isMicroFrontend}safeGetElement(selector){if(!this.isBrowser){return null}if(typeof selector==="function"){try{return selector()}catch{return null}}try{if(selector.startsWith("#")){return document.getElementById(selector.slice(1))}return document.querySelector(selector)}catch{return null}}safeExecuteBrowserAPI(fn,fallback){if(!this.isBrowser){return fallback}try{return fn()}catch{return fallback}}constructor(){_define_property(this,"environment",void 0);_define_property(this,"isBrowser",void 0);_define_property(this,"isSSR",void 0);_define_property(this,"isMicroFrontend",void 0);this.isBrowser=typeof window!=="undefined"&&typeof document!=="undefined";this.isSSR=typeof window==="undefined"&&typeof process!=="undefined";this.isMicroFrontend=this.detectMicroFrontend();this.environment=this.detectEnvironment()}};_define_property(EnvironmentDetector,"instance",null);function getEnvironmentDetector(){return EnvironmentDetector.getInstance()}
|
|
@@ -1,23 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 启动模块统一导出
|
|
3
|
-
*/ "use strict";
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
_export_star(require("./initializeServices"), exports);
|
|
8
|
-
_export_star(require("./renderApp"), exports);
|
|
9
|
-
_export_star(require("./performanceTracker"), exports);
|
|
10
|
-
_export_star(require("./environment"), exports);
|
|
11
|
-
function _export_star(from, to) {
|
|
12
|
-
Object.keys(from).forEach(function(k) {
|
|
13
|
-
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
14
|
-
Object.defineProperty(to, k, {
|
|
15
|
-
enumerable: true,
|
|
16
|
-
get: function() {
|
|
17
|
-
return from[k];
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
return from;
|
|
23
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});_export_star(require("./initializeServices"),exports);_export_star(require("./renderApp"),exports);_export_star(require("./performanceTracker"),exports);_export_star(require("./environment"),exports);function _export_star(from,to){Object.keys(from).forEach(function(k){if(k!=="default"&&!Object.prototype.hasOwnProperty.call(to,k)){Object.defineProperty(to,k,{enumerable:true,get:function(){return from[k]}})}});return from}
|
|
@@ -1,226 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 服务初始化模块
|
|
3
|
-
* 负责初始化框架所需的各种服务
|
|
4
|
-
*/ "use strict";
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
Object.defineProperty(exports, "initializeServices", {
|
|
9
|
-
enumerable: true,
|
|
10
|
-
get: function() {
|
|
11
|
-
return initializeServices;
|
|
12
|
-
}
|
|
13
|
-
});
|
|
14
|
-
const _logger = require("@vlian/logger");
|
|
15
|
-
const _monitoring = require("@vlian/monitoring");
|
|
16
|
-
const _utils = require("@vlian/utils");
|
|
17
|
-
const _library = require("../../library");
|
|
18
|
-
const _state = require("../../state");
|
|
19
|
-
const _AppEventBus = require("../event/AppEventBus");
|
|
20
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
21
|
-
if (typeof WeakMap !== "function") return null;
|
|
22
|
-
var cacheBabelInterop = new WeakMap();
|
|
23
|
-
var cacheNodeInterop = new WeakMap();
|
|
24
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
25
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
26
|
-
})(nodeInterop);
|
|
27
|
-
}
|
|
28
|
-
function _interop_require_wildcard(obj, nodeInterop) {
|
|
29
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
30
|
-
return obj;
|
|
31
|
-
}
|
|
32
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
33
|
-
return {
|
|
34
|
-
default: obj
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
38
|
-
if (cache && cache.has(obj)) {
|
|
39
|
-
return cache.get(obj);
|
|
40
|
-
}
|
|
41
|
-
var newObj = {
|
|
42
|
-
__proto__: null
|
|
43
|
-
};
|
|
44
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
45
|
-
for(var key in obj){
|
|
46
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
47
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
48
|
-
if (desc && (desc.get || desc.set)) {
|
|
49
|
-
Object.defineProperty(newObj, key, desc);
|
|
50
|
-
} else {
|
|
51
|
-
newObj[key] = obj[key];
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
newObj.default = obj;
|
|
56
|
-
if (cache) {
|
|
57
|
-
cache.set(obj, newObj);
|
|
58
|
-
}
|
|
59
|
-
return newObj;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* 带重试的异步函数执行器
|
|
63
|
-
*/ async function withRetry(fn, config = {}, serviceName) {
|
|
64
|
-
const maxRetries = config.maxRetries ?? 3;
|
|
65
|
-
const retryDelay = config.retryDelay ?? 1000;
|
|
66
|
-
const exponentialBackoff = config.exponentialBackoff ?? true;
|
|
67
|
-
let lastError;
|
|
68
|
-
for(let attempt = 0; attempt <= maxRetries; attempt++){
|
|
69
|
-
try {
|
|
70
|
-
return await fn();
|
|
71
|
-
} catch (error) {
|
|
72
|
-
lastError = error;
|
|
73
|
-
if (attempt < maxRetries) {
|
|
74
|
-
const delay = exponentialBackoff ? retryDelay * Math.pow(2, attempt) : retryDelay;
|
|
75
|
-
_logger.logger.warn(`${serviceName} 初始化失败(尝试 ${attempt + 1}/${maxRetries + 1}),${delay}ms 后重试...`, error);
|
|
76
|
-
await new Promise((resolve)=>setTimeout(resolve, delay));
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
_logger.logger.error(`${serviceName} 初始化失败,已重试 ${maxRetries} 次`);
|
|
81
|
-
throw lastError;
|
|
82
|
-
}
|
|
83
|
-
async function initializeServices(options = {}) {
|
|
84
|
-
const startTime = performance.now();
|
|
85
|
-
// 重试配置
|
|
86
|
-
const retryConfig = {
|
|
87
|
-
maxRetries: options.serviceRetry?.maxRetries ?? 3,
|
|
88
|
-
retryDelay: options.serviceRetry?.retryDelay ?? 1000,
|
|
89
|
-
exponentialBackoff: options.serviceRetry?.exponentialBackoff ?? true
|
|
90
|
-
};
|
|
91
|
-
// ========== 关键服务:必须在应用渲染前初始化 ==========
|
|
92
|
-
// 这些服务是应用运行的基础,必须并行初始化完成
|
|
93
|
-
// 1. 监控服务(必须最先初始化,因为其他服务可能依赖它)
|
|
94
|
-
const monitoringPromise = withRetry(()=>Promise.resolve((0, _monitoring.initMonitoring)({
|
|
95
|
-
...options.errorMonitor,
|
|
96
|
-
onError: (error)=>{
|
|
97
|
-
_logger.logger.error('监控服务捕获到错误:', error);
|
|
98
|
-
options.errorMonitor?.onError?.(error);
|
|
99
|
-
}
|
|
100
|
-
})), retryConfig, '监控服务');
|
|
101
|
-
// 2. 存储服务(关键服务,应用可能需要立即使用存储)
|
|
102
|
-
const storagePromise = withRetry(()=>Promise.resolve().then(()=>{
|
|
103
|
-
_library.storage.initialize(options.storageOptions);
|
|
104
|
-
return _library.storage;
|
|
105
|
-
}), retryConfig, '存储服务');
|
|
106
|
-
// 3. 状态管理器(关键服务,应用状态管理的基础)
|
|
107
|
-
const stateManagerPromise = withRetry(()=>Promise.resolve().then(()=>{
|
|
108
|
-
if (options.stateManager !== undefined) {
|
|
109
|
-
return new _state.StateManager(options.stateManager);
|
|
110
|
-
} else {
|
|
111
|
-
// 默认初始化状态管理器
|
|
112
|
-
return new _state.StateManager({
|
|
113
|
-
enableRegistry: true,
|
|
114
|
-
defaultScope: 'app'
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}), retryConfig, '状态管理器');
|
|
118
|
-
// 4. 事件总线(关键服务,用于应用内部通信)
|
|
119
|
-
const eventBusPromise = withRetry(()=>Promise.resolve().then(()=>{
|
|
120
|
-
const eventBusConfig = {
|
|
121
|
-
enableTracking: options.eventBus?.enableTracking ?? process.env.NODE_ENV === 'development',
|
|
122
|
-
maxHistorySize: options.eventBus?.maxHistorySize ?? 100,
|
|
123
|
-
enableValidation: options.eventBus?.enableValidation ?? false,
|
|
124
|
-
enablePerformanceMonitoring: options.eventBus?.enablePerformanceMonitoring ?? process.env.NODE_ENV === 'development',
|
|
125
|
-
namespacePrefix: options.eventBus?.namespacePrefix,
|
|
126
|
-
instanceId: options.eventBus?.instanceId,
|
|
127
|
-
enableSecurityMode: options.eventBus?.enableSecurityMode ?? false,
|
|
128
|
-
allowedSources: options.eventBus?.allowedSources
|
|
129
|
-
};
|
|
130
|
-
return new _AppEventBus.AppEventBus(eventBusConfig);
|
|
131
|
-
}), retryConfig, '事件总线');
|
|
132
|
-
// 并行执行关键服务初始化
|
|
133
|
-
const [monitoring, , stateManager, eventBus] = await Promise.all([
|
|
134
|
-
monitoringPromise,
|
|
135
|
-
storagePromise,
|
|
136
|
-
stateManagerPromise,
|
|
137
|
-
eventBusPromise
|
|
138
|
-
]);
|
|
139
|
-
_logger.logger.info('关键服务初始化完成');
|
|
140
|
-
// 初始化性能监控(依赖监控服务,必须在监控服务初始化后)
|
|
141
|
-
const performanceMonitor = new _utils.PerformanceMonitor({
|
|
142
|
-
...options.performanceMonitor,
|
|
143
|
-
onReport: (metrics)=>{
|
|
144
|
-
monitoring.reportPerformance(metrics);
|
|
145
|
-
options.performanceMonitor?.onReport?.(metrics);
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
// 在页面卸载时清理性能监控
|
|
149
|
-
if (typeof window !== 'undefined') {
|
|
150
|
-
const cleanupHandler = ()=>{
|
|
151
|
-
performanceMonitor.disconnect();
|
|
152
|
-
window.removeEventListener('beforeunload', cleanupHandler);
|
|
153
|
-
};
|
|
154
|
-
window.addEventListener('beforeunload', cleanupHandler);
|
|
155
|
-
}
|
|
156
|
-
const criticalServicesDuration = performance.now() - startTime;
|
|
157
|
-
_logger.logger.debug(`关键服务初始化完成,耗时: ${criticalServicesDuration.toFixed(2)}ms`);
|
|
158
|
-
// ========== 非关键服务:延迟到应用渲染后初始化 ==========
|
|
159
|
-
// 这些服务不影响首屏渲染,可以在空闲时初始化
|
|
160
|
-
/**
|
|
161
|
-
* 延迟初始化非关键服务
|
|
162
|
-
* 在应用渲染后调用,使用 requestIdleCallback 在空闲时初始化
|
|
163
|
-
*/ const initializeNonCriticalServices = async ()=>{
|
|
164
|
-
const nonCriticalStartTime = performance.now();
|
|
165
|
-
// 使用 requestIdleCallback 在浏览器空闲时初始化非关键服务
|
|
166
|
-
// 如果不支持 requestIdleCallback,则使用 setTimeout 延迟执行
|
|
167
|
-
const scheduleInit = (callback)=>{
|
|
168
|
-
if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {
|
|
169
|
-
window.requestIdleCallback(callback, {
|
|
170
|
-
timeout: 5000
|
|
171
|
-
});
|
|
172
|
-
} else {
|
|
173
|
-
setTimeout(callback, 100);
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
return new Promise((resolve)=>{
|
|
177
|
-
scheduleInit(async ()=>{
|
|
178
|
-
try {
|
|
179
|
-
// 1. 分析服务(可选,非关键)
|
|
180
|
-
if (options.analytics) {
|
|
181
|
-
try {
|
|
182
|
-
await withRetry(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../utils/analytics"))).then(({ initAnalytics })=>{
|
|
183
|
-
initAnalytics(options.analytics);
|
|
184
|
-
return true;
|
|
185
|
-
}), retryConfig, '分析服务');
|
|
186
|
-
_logger.logger.debug('分析服务初始化完成');
|
|
187
|
-
} catch (error) {
|
|
188
|
-
_logger.logger.warn('分析服务初始化失败(不影响应用运行):', error);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
// 2. 运行时安全服务(可选,非关键)
|
|
192
|
-
if (options.runtimeSecurity) {
|
|
193
|
-
try {
|
|
194
|
-
await withRetry(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../utils/runtimeSecurity"))).then(({ RuntimeSecurity })=>{
|
|
195
|
-
RuntimeSecurity.initialize(options.runtimeSecurity);
|
|
196
|
-
return true;
|
|
197
|
-
}), retryConfig, '运行时安全服务');
|
|
198
|
-
_logger.logger.debug('运行时安全服务初始化完成');
|
|
199
|
-
} catch (error) {
|
|
200
|
-
_logger.logger.warn('运行时安全服务初始化失败(不影响应用运行):', error);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
const nonCriticalDuration = performance.now() - nonCriticalStartTime;
|
|
204
|
-
_logger.logger.debug(`非关键服务初始化完成,耗时: ${nonCriticalDuration.toFixed(2)}ms`);
|
|
205
|
-
} catch (error) {
|
|
206
|
-
_logger.logger.warn('非关键服务初始化过程中出现错误:', error);
|
|
207
|
-
} finally{
|
|
208
|
-
resolve();
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
};
|
|
213
|
-
// 记录关键服务初始化性能指标
|
|
214
|
-
if (monitoring.reportPerformance) {
|
|
215
|
-
monitoring.reportPerformance({
|
|
216
|
-
serviceInitDuration: criticalServicesDuration
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
return {
|
|
220
|
-
monitoring,
|
|
221
|
-
performanceMonitor,
|
|
222
|
-
stateManager,
|
|
223
|
-
eventBus,
|
|
224
|
-
initializeNonCriticalServices
|
|
225
|
-
};
|
|
226
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"initializeServices",{enumerable:true,get:function(){return initializeServices}});const _logger=require("@vlian/logger");const _monitoring=require("@vlian/monitoring");const _utils=require("@vlian/utils");const _library=require("../../library");const _state=require("../../state");const _AppEventBus=require("../event/AppEventBus");function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}async function withRetry(fn,config={},serviceName){const maxRetries=config.maxRetries??3;const retryDelay=config.retryDelay??1e3;const exponentialBackoff=config.exponentialBackoff??true;let lastError;for(let attempt=0;attempt<=maxRetries;attempt++){try{return await fn()}catch(error){lastError=error;if(attempt<maxRetries){const delay=exponentialBackoff?retryDelay*Math.pow(2,attempt):retryDelay;_logger.logger.warn(`${serviceName} 初始化失败(尝试 ${attempt+1}/${maxRetries+1}),${delay}ms 后重试...`,error);await new Promise(resolve=>setTimeout(resolve,delay))}}}_logger.logger.error(`${serviceName} 初始化失败,已重试 ${maxRetries} 次`);throw lastError}async function initializeServices(options={}){const startTime=performance.now();const retryConfig={maxRetries:options.serviceRetry?.maxRetries??3,retryDelay:options.serviceRetry?.retryDelay??1e3,exponentialBackoff:options.serviceRetry?.exponentialBackoff??true};const monitoringPromise=withRetry(()=>Promise.resolve((0,_monitoring.initMonitoring)({...options.errorMonitor,onError:error=>{_logger.logger.error("监控服务捕获到错误:",error);options.errorMonitor?.onError?.(error)}})),retryConfig,"监控服务");const storagePromise=withRetry(()=>Promise.resolve().then(()=>{_library.storage.initialize(options.storageOptions);return _library.storage}),retryConfig,"存储服务");const stateManagerPromise=withRetry(()=>Promise.resolve().then(()=>{if(options.stateManager!==undefined){return new _state.StateManager(options.stateManager)}else{return new _state.StateManager({enableRegistry:true,defaultScope:"app"})}}),retryConfig,"状态管理器");const eventBusPromise=withRetry(()=>Promise.resolve().then(()=>{const eventBusConfig={enableTracking:options.eventBus?.enableTracking??process.env.NODE_ENV==="development",maxHistorySize:options.eventBus?.maxHistorySize??100,enableValidation:options.eventBus?.enableValidation??false,enablePerformanceMonitoring:options.eventBus?.enablePerformanceMonitoring??process.env.NODE_ENV==="development",namespacePrefix:options.eventBus?.namespacePrefix,instanceId:options.eventBus?.instanceId,enableSecurityMode:options.eventBus?.enableSecurityMode??false,allowedSources:options.eventBus?.allowedSources};return new _AppEventBus.AppEventBus(eventBusConfig)}),retryConfig,"事件总线");const[monitoring,,stateManager,eventBus]=await Promise.all([monitoringPromise,storagePromise,stateManagerPromise,eventBusPromise]);_logger.logger.info("关键服务初始化完成");const performanceMonitor=new _utils.PerformanceMonitor({...options.performanceMonitor,onReport:metrics=>{monitoring.reportPerformance(metrics);options.performanceMonitor?.onReport?.(metrics)}});if(typeof window!=="undefined"){const cleanupHandler=()=>{performanceMonitor.disconnect();window.removeEventListener("beforeunload",cleanupHandler)};window.addEventListener("beforeunload",cleanupHandler)}const criticalServicesDuration=performance.now()-startTime;_logger.logger.debug(`关键服务初始化完成,耗时: ${criticalServicesDuration.toFixed(2)}ms`);const initializeNonCriticalServices=async()=>{const nonCriticalStartTime=performance.now();const scheduleInit=callback=>{if(typeof window!=="undefined"&&"requestIdleCallback"in window){window.requestIdleCallback(callback,{timeout:5e3})}else{setTimeout(callback,100)}};return new Promise(resolve=>{scheduleInit(async()=>{try{if(options.analytics){try{await withRetry(()=>Promise.resolve().then(()=>/*#__PURE__*/_interop_require_wildcard(require("../../utils/analytics"))).then(({initAnalytics})=>{initAnalytics(options.analytics);return true}),retryConfig,"分析服务");_logger.logger.debug("分析服务初始化完成")}catch(error){_logger.logger.warn("分析服务初始化失败(不影响应用运行):",error)}}if(options.runtimeSecurity){try{await withRetry(()=>Promise.resolve().then(()=>/*#__PURE__*/_interop_require_wildcard(require("../../utils/runtimeSecurity"))).then(({RuntimeSecurity})=>{RuntimeSecurity.initialize(options.runtimeSecurity);return true}),retryConfig,"运行时安全服务");_logger.logger.debug("运行时安全服务初始化完成")}catch(error){_logger.logger.warn("运行时安全服务初始化失败(不影响应用运行):",error)}}const nonCriticalDuration=performance.now()-nonCriticalStartTime;_logger.logger.debug(`非关键服务初始化完成,耗时: ${nonCriticalDuration.toFixed(2)}ms`)}catch(error){_logger.logger.warn("非关键服务初始化过程中出现错误:",error)}finally{resolve()}})})};if(monitoring.reportPerformance){monitoring.reportPerformance({serviceInitDuration:criticalServicesDuration})}return{monitoring,performanceMonitor,stateManager,eventBus,initializeNonCriticalServices}}
|
|
@@ -1,179 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* 性能追踪模块
|
|
3
|
-
* 负责收集和上报启动性能指标
|
|
4
|
-
*/ "use strict";
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
function _export(target, all) {
|
|
9
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
_export(exports, {
|
|
15
|
-
get PerformanceTracker () {
|
|
16
|
-
return PerformanceTracker;
|
|
17
|
-
},
|
|
18
|
-
get STARTUP_METRIC_UNITS () {
|
|
19
|
-
return STARTUP_METRIC_UNITS;
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
function _define_property(obj, key, value) {
|
|
23
|
-
if (key in obj) {
|
|
24
|
-
Object.defineProperty(obj, key, {
|
|
25
|
-
value: value,
|
|
26
|
-
enumerable: true,
|
|
27
|
-
configurable: true,
|
|
28
|
-
writable: true
|
|
29
|
-
});
|
|
30
|
-
} else {
|
|
31
|
-
obj[key] = value;
|
|
32
|
-
}
|
|
33
|
-
return obj;
|
|
34
|
-
}
|
|
35
|
-
const STARTUP_METRIC_UNITS = {
|
|
36
|
-
/**
|
|
37
|
-
* 毫秒单位
|
|
38
|
-
*/ ms: 'ms',
|
|
39
|
-
/**
|
|
40
|
-
* 无单位(分数)
|
|
41
|
-
*/ none: ''
|
|
42
|
-
};
|
|
43
|
-
let PerformanceTracker = class PerformanceTracker {
|
|
44
|
-
/**
|
|
45
|
-
* 记录服务初始化耗时
|
|
46
|
-
*/ recordServiceInit(duration) {
|
|
47
|
-
this.metrics.serviceInitDuration = duration;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* 记录初始化耗时
|
|
51
|
-
*/ recordInitialization(duration) {
|
|
52
|
-
this.metrics.initializationDuration = duration;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* 记录首次渲染耗时
|
|
56
|
-
*/ recordFirstRender(duration) {
|
|
57
|
-
this.metrics.firstRenderDuration = duration;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* 记录总启动耗时
|
|
61
|
-
*/ recordTotalStartup(duration) {
|
|
62
|
-
this.metrics.totalStartupDuration = duration;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* 收集Web Vitals指标
|
|
66
|
-
*/ collectWebVitals() {
|
|
67
|
-
if (typeof window === 'undefined') {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
// 收集FCP(首次内容绘制)
|
|
71
|
-
if ('PerformanceObserver' in window) {
|
|
72
|
-
try {
|
|
73
|
-
const fcpObserver = new PerformanceObserver((list)=>{
|
|
74
|
-
for (const entry of list.getEntries()){
|
|
75
|
-
if (entry.name === 'first-contentful-paint') {
|
|
76
|
-
this.metrics.fcp = entry.startTime;
|
|
77
|
-
this.report();
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
fcpObserver.observe({
|
|
82
|
-
entryTypes: [
|
|
83
|
-
'paint'
|
|
84
|
-
]
|
|
85
|
-
});
|
|
86
|
-
} catch (e) {
|
|
87
|
-
// 忽略错误
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
// 收集LCP(最大内容绘制)
|
|
91
|
-
if ('PerformanceObserver' in window) {
|
|
92
|
-
try {
|
|
93
|
-
const lcpObserver = new PerformanceObserver((list)=>{
|
|
94
|
-
const entries = list.getEntries();
|
|
95
|
-
const lastEntry = entries[entries.length - 1];
|
|
96
|
-
this.metrics.lcp = lastEntry.startTime;
|
|
97
|
-
this.report();
|
|
98
|
-
});
|
|
99
|
-
lcpObserver.observe({
|
|
100
|
-
entryTypes: [
|
|
101
|
-
'largest-contentful-paint'
|
|
102
|
-
]
|
|
103
|
-
});
|
|
104
|
-
} catch (e) {
|
|
105
|
-
// 忽略错误
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
// 收集FID(首次输入延迟)
|
|
109
|
-
if ('PerformanceObserver' in window) {
|
|
110
|
-
try {
|
|
111
|
-
const fidObserver = new PerformanceObserver((list)=>{
|
|
112
|
-
for (const entry of list.getEntries()){
|
|
113
|
-
// PerformanceEventTiming 类型检查
|
|
114
|
-
if ('processingStart' in entry && 'startTime' in entry) {
|
|
115
|
-
const eventEntry = entry;
|
|
116
|
-
this.metrics.fid = eventEntry.processingStart - eventEntry.startTime;
|
|
117
|
-
this.report();
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
fidObserver.observe({
|
|
122
|
-
entryTypes: [
|
|
123
|
-
'first-input'
|
|
124
|
-
]
|
|
125
|
-
});
|
|
126
|
-
} catch (e) {
|
|
127
|
-
// 忽略错误
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// 收集CLS(累积布局偏移)
|
|
131
|
-
if ('PerformanceObserver' in window) {
|
|
132
|
-
try {
|
|
133
|
-
let clsValue = 0;
|
|
134
|
-
const clsObserver = new PerformanceObserver((list)=>{
|
|
135
|
-
for (const entry of list.getEntries()){
|
|
136
|
-
if (!entry.hadRecentInput) {
|
|
137
|
-
clsValue += entry.value;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
this.metrics.cls = clsValue;
|
|
141
|
-
this.report();
|
|
142
|
-
});
|
|
143
|
-
clsObserver.observe({
|
|
144
|
-
entryTypes: [
|
|
145
|
-
'layout-shift'
|
|
146
|
-
]
|
|
147
|
-
});
|
|
148
|
-
} catch (e) {
|
|
149
|
-
// 忽略错误
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* 上报性能指标
|
|
155
|
-
*/ report() {
|
|
156
|
-
if (this.monitoring.reportPerformance) {
|
|
157
|
-
this.monitoring.reportPerformance(this.metrics);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* 获取所有指标
|
|
162
|
-
*/ getMetrics() {
|
|
163
|
-
return {
|
|
164
|
-
...this.metrics
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* 获取总启动耗时
|
|
169
|
-
*/ getTotalDuration() {
|
|
170
|
-
return performance.now() - this.startTime;
|
|
171
|
-
}
|
|
172
|
-
constructor(monitoring){
|
|
173
|
-
_define_property(this, "monitoring", void 0);
|
|
174
|
-
_define_property(this, "metrics", {});
|
|
175
|
-
_define_property(this, "startTime", void 0);
|
|
176
|
-
this.monitoring = monitoring;
|
|
177
|
-
this.startTime = performance.now();
|
|
178
|
-
}
|
|
179
|
-
};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get PerformanceTracker(){return PerformanceTracker},get STARTUP_METRIC_UNITS(){return STARTUP_METRIC_UNITS}});function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}const STARTUP_METRIC_UNITS={ms:"ms",none:""};let PerformanceTracker=class PerformanceTracker{recordServiceInit(duration){this.metrics.serviceInitDuration=duration}recordInitialization(duration){this.metrics.initializationDuration=duration}recordFirstRender(duration){this.metrics.firstRenderDuration=duration}recordTotalStartup(duration){this.metrics.totalStartupDuration=duration}collectWebVitals(){if(typeof window==="undefined"){return}if("PerformanceObserver"in window){try{const fcpObserver=new PerformanceObserver(list=>{for(const entry of list.getEntries()){if(entry.name==="first-contentful-paint"){this.metrics.fcp=entry.startTime;this.report()}}});fcpObserver.observe({entryTypes:["paint"]})}catch(e){}}if("PerformanceObserver"in window){try{const lcpObserver=new PerformanceObserver(list=>{const entries=list.getEntries();const lastEntry=entries[entries.length-1];this.metrics.lcp=lastEntry.startTime;this.report()});lcpObserver.observe({entryTypes:["largest-contentful-paint"]})}catch(e){}}if("PerformanceObserver"in window){try{const fidObserver=new PerformanceObserver(list=>{for(const entry of list.getEntries()){if("processingStart"in entry&&"startTime"in entry){const eventEntry=entry;this.metrics.fid=eventEntry.processingStart-eventEntry.startTime;this.report()}}});fidObserver.observe({entryTypes:["first-input"]})}catch(e){}}if("PerformanceObserver"in window){try{let clsValue=0;const clsObserver=new PerformanceObserver(list=>{for(const entry of list.getEntries()){if(!entry.hadRecentInput){clsValue+=entry.value}}this.metrics.cls=clsValue;this.report()});clsObserver.observe({entryTypes:["layout-shift"]})}catch(e){}}}report(){if(this.monitoring.reportPerformance){this.monitoring.reportPerformance(this.metrics)}}getMetrics(){return{...this.metrics}}getTotalDuration(){return performance.now()-this.startTime}constructor(monitoring){_define_property(this,"monitoring",void 0);_define_property(this,"metrics",{});_define_property(this,"startTime",void 0);this.monitoring=monitoring;this.startTime=performance.now()}};
|