@vlian/framework 1.2.25 → 1.2.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics.umd.js +208 -2395
- package/dist/analytics.umd.js.map +1 -1
- package/dist/core/Test.cjs +2 -2
- package/dist/core/Test.cjs.map +1 -1
- package/dist/core/Test.js +1 -1
- package/dist/core/Test.js.map +1 -1
- package/dist/core/config/ConfigLoader.cjs +7 -7
- package/dist/core/config/ConfigLoader.cjs.map +1 -1
- package/dist/core/config/ConfigLoader.js +1 -1
- package/dist/core/config/ConfigLoader.js.map +1 -1
- package/dist/core/error/ErrorBoundary.cjs +6 -6
- package/dist/core/error/ErrorBoundary.cjs.map +1 -1
- package/dist/core/error/ErrorBoundary.d.ts +1 -1
- package/dist/core/error/ErrorBoundary.js +2 -2
- package/dist/core/error/ErrorBoundary.js.map +1 -1
- package/dist/core/error/ErrorHandler.cjs +19 -19
- package/dist/core/error/ErrorHandler.cjs.map +1 -1
- package/dist/core/error/ErrorHandler.d.ts +2 -2
- package/dist/core/error/ErrorHandler.js +2 -2
- package/dist/core/error/ErrorHandler.js.map +1 -1
- package/dist/core/event/AppEventBus.cjs +5 -5
- package/dist/core/event/AppEventBus.cjs.map +1 -1
- package/dist/core/event/AppEventBus.js +1 -1
- package/dist/core/event/AppEventBus.js.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.cjs.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.js.map +1 -1
- package/dist/core/initialization/initialization.cjs +3 -3
- package/dist/core/initialization/initialization.cjs.map +1 -1
- package/dist/core/initialization/initialization.d.ts +1 -1
- package/dist/core/initialization/initialization.js +1 -1
- package/dist/core/initialization/initialization.js.map +1 -1
- package/dist/core/initialization/initializationErrorState.cjs +2 -2
- package/dist/core/initialization/initializationErrorState.cjs.map +1 -1
- package/dist/core/initialization/initializationErrorState.d.ts +1 -1
- package/dist/core/initialization/initializationErrorState.js +1 -1
- package/dist/core/initialization/initializationErrorState.js.map +1 -1
- package/dist/core/kernel/defaultAdapters.cjs +14 -13
- package/dist/core/kernel/defaultAdapters.cjs.map +1 -1
- package/dist/core/kernel/defaultAdapters.js +2 -1
- package/dist/core/kernel/defaultAdapters.js.map +1 -1
- package/dist/core/kernel/types.d.ts +1 -1
- package/dist/core/kernel/types.js.map +1 -1
- package/dist/core/router/RouterManager.cjs +9 -9
- package/dist/core/router/RouterManager.cjs.map +1 -1
- package/dist/core/router/RouterManager.js +1 -1
- package/dist/core/router/RouterManager.js.map +1 -1
- package/dist/core/router/adapter/AdapterManager.cjs +10 -10
- package/dist/core/router/adapter/AdapterManager.cjs.map +1 -1
- package/dist/core/router/adapter/AdapterManager.js +1 -1
- package/dist/core/router/adapter/AdapterManager.js.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +4 -4
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.cjs +8 -8
- package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.js +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.js.map +1 -1
- package/dist/core/router/errors/RouterError.cjs +4 -4
- package/dist/core/router/errors/RouterError.cjs.map +1 -1
- package/dist/core/router/errors/RouterError.d.ts +1 -1
- package/dist/core/router/errors/RouterError.js +1 -1
- package/dist/core/router/errors/RouterError.js.map +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +8 -8
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs +11 -11
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
- package/dist/core/router/middleware/auth.cjs +4 -4
- package/dist/core/router/middleware/auth.cjs.map +1 -1
- package/dist/core/router/middleware/auth.js +1 -1
- package/dist/core/router/middleware/auth.js.map +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.cjs +2 -2
- package/dist/core/router/monitoring/RouterMonitoring.cjs.map +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.js +2 -2
- package/dist/core/router/monitoring/RouterMonitoring.js.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.cjs +7 -7
- package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.js +1 -1
- package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
- package/dist/core/router/performance/RouteCache.cjs +7 -7
- package/dist/core/router/performance/RouteCache.cjs.map +1 -1
- package/dist/core/router/performance/RouteCache.js +1 -1
- package/dist/core/router/performance/RouteCache.js.map +1 -1
- package/dist/core/router/performance/RoutePreloader.cjs +6 -6
- package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
- package/dist/core/router/performance/RoutePreloader.js +1 -1
- package/dist/core/router/performance/RoutePreloader.js.map +1 -1
- package/dist/core/router/plugin/RouterPluginManager.cjs +8 -8
- package/dist/core/router/plugin/RouterPluginManager.cjs.map +1 -1
- package/dist/core/router/plugin/RouterPluginManager.js +1 -1
- package/dist/core/router/plugin/RouterPluginManager.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.cjs +6 -2
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js +5 -1
- package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
- package/dist/core/router/utils/transform.cjs +13 -12
- package/dist/core/router/utils/transform.cjs.map +1 -1
- package/dist/core/router/utils/transform.js +2 -1
- package/dist/core/router/utils/transform.js.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.cjs +2 -2
- package/dist/core/router/validation/RouterConfigValidator.cjs.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.js +1 -1
- package/dist/core/router/validation/RouterConfigValidator.js.map +1 -1
- package/dist/core/router/version/RouteVersionManager.cjs +6 -6
- package/dist/core/router/version/RouteVersionManager.cjs.map +1 -1
- package/dist/core/router/version/RouteVersionManager.js +1 -1
- package/dist/core/router/version/RouteVersionManager.js.map +1 -1
- package/dist/core/splash/SplashScreen.cjs +4 -4
- package/dist/core/splash/SplashScreen.cjs.map +1 -1
- package/dist/core/splash/SplashScreen.js +1 -1
- package/dist/core/splash/SplashScreen.js.map +1 -1
- package/dist/core/startup/initializeServices.cjs +15 -15
- package/dist/core/startup/initializeServices.cjs.map +1 -1
- package/dist/core/startup/initializeServices.d.ts +2 -2
- package/dist/core/startup/initializeServices.js +3 -3
- package/dist/core/startup/initializeServices.js.map +1 -1
- package/dist/core/startup/performanceTracker.cjs.map +1 -1
- package/dist/core/startup/performanceTracker.d.ts +1 -1
- package/dist/core/startup/performanceTracker.js.map +1 -1
- package/dist/core/startup/renderApp.cjs +3 -3
- package/dist/core/startup/renderApp.cjs.map +1 -1
- package/dist/core/startup/renderApp.d.ts +1 -1
- package/dist/core/startup/renderApp.js +2 -2
- package/dist/core/startup/renderApp.js.map +1 -1
- package/dist/core/startup/startApp.cjs +24 -24
- package/dist/core/startup/startApp.cjs.map +1 -1
- package/dist/core/startup/startApp.js +5 -5
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/core/types.d.ts +3 -3
- package/dist/core/types.js.map +1 -1
- package/dist/index.cjs +15 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +2150 -23125
- package/dist/index.umd.js.map +1 -1
- package/dist/kernel/constants.cjs +67 -0
- package/dist/kernel/constants.cjs.map +1 -0
- package/dist/kernel/constants.d.ts +5 -0
- package/dist/kernel/constants.js +43 -0
- package/dist/kernel/constants.js.map +1 -0
- package/dist/kernel/index.cjs +40 -0
- package/dist/kernel/index.cjs.map +1 -0
- package/dist/kernel/index.d.ts +3 -0
- package/dist/kernel/index.js +4 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/kernel.cjs +296 -0
- package/dist/kernel/kernel.cjs.map +1 -0
- package/dist/kernel/kernel.d.ts +40 -0
- package/dist/kernel/kernel.js +272 -0
- package/dist/kernel/kernel.js.map +1 -0
- package/dist/kernel/manager/cacheManager.cjs +46 -0
- package/dist/kernel/manager/cacheManager.cjs.map +1 -0
- package/dist/kernel/manager/cacheManager.d.ts +6 -0
- package/dist/kernel/manager/cacheManager.js +36 -0
- package/dist/kernel/manager/cacheManager.js.map +1 -0
- package/dist/kernel/manager/i18nManager.cjs +68 -0
- package/dist/kernel/manager/i18nManager.cjs.map +1 -0
- package/dist/kernel/manager/i18nManager.d.ts +8 -0
- package/dist/kernel/manager/i18nManager.js +58 -0
- package/dist/kernel/manager/i18nManager.js.map +1 -0
- package/dist/kernel/manager/index.cjs +30 -0
- package/dist/kernel/manager/index.cjs.map +1 -0
- package/dist/kernel/manager/index.d.ts +4 -0
- package/dist/kernel/manager/index.js +6 -0
- package/dist/kernel/manager/index.js.map +1 -0
- package/dist/kernel/manager/loggerManager.cjs +70 -0
- package/dist/kernel/manager/loggerManager.cjs.map +1 -0
- package/dist/kernel/manager/loggerManager.d.ts +14 -0
- package/dist/kernel/manager/loggerManager.js +60 -0
- package/dist/kernel/manager/loggerManager.js.map +1 -0
- package/dist/kernel/manager/persistence.cjs +93 -0
- package/dist/kernel/manager/persistence.cjs.map +1 -0
- package/dist/kernel/manager/persistence.d.ts +3 -0
- package/dist/kernel/manager/persistence.js +75 -0
- package/dist/kernel/manager/persistence.js.map +1 -0
- package/dist/kernel/manager/themeManager.cjs +85 -0
- package/dist/kernel/manager/themeManager.cjs.map +1 -0
- package/dist/kernel/manager/themeManager.d.ts +9 -0
- package/dist/kernel/manager/themeManager.js +75 -0
- package/dist/kernel/manager/themeManager.js.map +1 -0
- package/dist/kernel/types.cjs +6 -0
- package/dist/kernel/types.cjs.map +1 -0
- package/dist/kernel/types.d.ts +72 -0
- package/dist/kernel/types.js +3 -0
- package/dist/kernel/types.js.map +1 -0
- package/dist/library/storage/encryption.cjs +12 -13
- package/dist/library/storage/encryption.cjs.map +1 -1
- package/dist/library/storage/encryption.js +1 -2
- package/dist/library/storage/encryption.js.map +1 -1
- package/dist/request/adapter.d.ts +1 -0
- package/dist/request/core.d.ts +1 -0
- package/dist/request/index.d.ts +1 -42
- package/dist/request/plugin/csrfPlugin.d.ts +2 -2
- package/dist/request/plugin/queue.d.ts +2 -2
- package/dist/request/plugin.d.ts +1 -0
- package/dist/request/runtime.d.ts +1 -0
- package/dist/request/types.d.ts +1 -394
- package/dist/request/utils.d.ts +1 -0
- package/dist/state.umd.js +1 -1
- package/dist/utils/csrf.cjs +13 -152
- package/dist/utils/csrf.cjs.map +1 -1
- package/dist/utils/csrf.d.ts +1 -72
- package/dist/utils/csrf.js +1 -142
- package/dist/utils/csrf.js.map +1 -1
- package/dist/utils/errors/ErrorCodes.cjs +6 -76
- package/dist/utils/errors/ErrorCodes.cjs.map +1 -1
- package/dist/utils/errors/ErrorCodes.d.ts +1 -45
- package/dist/utils/errors/ErrorCodes.js +1 -84
- package/dist/utils/errors/ErrorCodes.js.map +1 -1
- package/dist/utils/errors.cjs +53 -326
- package/dist/utils/errors.cjs.map +1 -1
- package/dist/utils/errors.d.ts +19 -172
- package/dist/utils/errors.js +16 -352
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.cjs +5 -374
- package/dist/utils/logger.cjs.map +1 -1
- package/dist/utils/logger.d.ts +2 -189
- package/dist/utils/logger.js +1 -379
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/logger.types.cjs +3 -12
- package/dist/utils/logger.types.cjs.map +1 -1
- package/dist/utils/logger.types.d.ts +2 -57
- package/dist/utils/logger.types.js +1 -10
- package/dist/utils/logger.types.js.map +1 -1
- package/dist/utils/monitoring.cjs +11 -302
- package/dist/utils/monitoring.cjs.map +1 -1
- package/dist/utils/monitoring.d.ts +1 -163
- package/dist/utils/monitoring.js +1 -294
- package/dist/utils/monitoring.js.map +1 -1
- package/dist/utils/performance.cjs +5 -352
- package/dist/utils/performance.cjs.map +1 -1
- package/dist/utils/performance.d.ts +2 -246
- package/dist/utils/performance.js +1 -354
- package/dist/utils/performance.js.map +1 -1
- package/dist/utils/resourceLoader.cjs +5 -303
- package/dist/utils/resourceLoader.cjs.map +1 -1
- package/dist/utils/resourceLoader.d.ts +2 -130
- package/dist/utils/resourceLoader.js +1 -305
- package/dist/utils/resourceLoader.js.map +1 -1
- package/dist/utils/runtimeSecurity.cjs +2 -140
- package/dist/utils/runtimeSecurity.cjs.map +1 -1
- package/dist/utils/runtimeSecurity.d.ts +2 -104
- package/dist/utils/runtimeSecurity.js +1 -141
- package/dist/utils/runtimeSecurity.js.map +1 -1
- package/dist/utils/security.cjs +3 -314
- package/dist/utils/security.cjs.map +1 -1
- package/dist/utils/security.d.ts +2 -80
- package/dist/utils/security.js +1 -311
- package/dist/utils/security.js.map +1 -1
- package/dist/utils/traceId.cjs +10 -111
- package/dist/utils/traceId.cjs.map +1 -1
- package/dist/utils/traceId.d.ts +1 -63
- package/dist/utils/traceId.js +1 -116
- package/dist/utils/traceId.js.map +1 -1
- package/dist/utils/validation.cjs +3 -173
- package/dist/utils/validation.cjs.map +1 -1
- package/dist/utils/validation.d.ts +2 -110
- package/dist/utils/validation.js +1 -175
- package/dist/utils/validation.js.map +1 -1
- package/package.json +15 -24
- package/dist/lazy/index.cjs +0 -104
- package/dist/lazy/index.cjs.map +0 -1
- package/dist/lazy/index.d.ts +0 -19
- package/dist/lazy/index.js +0 -24
- package/dist/lazy/index.js.map +0 -1
- package/dist/request/adapter/RequestAdapter.cjs +0 -78
- package/dist/request/adapter/RequestAdapter.cjs.map +0 -1
- package/dist/request/adapter/axiosAdapter.cjs +0 -164
- package/dist/request/adapter/axiosAdapter.cjs.map +0 -1
- package/dist/request/adapter/fetchAdapter.cjs +0 -134
- package/dist/request/adapter/fetchAdapter.cjs.map +0 -1
- package/dist/request/adapter/index.cjs +0 -80
- package/dist/request/adapter/index.cjs.map +0 -1
- package/dist/request/adapter/kyAdapter.cjs +0 -191
- package/dist/request/adapter/kyAdapter.cjs.map +0 -1
- package/dist/request/adapter/undiciAdapter.cjs +0 -213
- package/dist/request/adapter/undiciAdapter.cjs.map +0 -1
- package/dist/request/core/RequestClient.cjs +0 -558
- package/dist/request/core/RequestClient.cjs.map +0 -1
- package/dist/request/core/index.cjs +0 -15
- package/dist/request/core/index.cjs.map +0 -1
- package/dist/request/index.cjs +0 -149
- package/dist/request/index.cjs.map +0 -1
- package/dist/request/plugin/RequestPlugin.cjs +0 -218
- package/dist/request/plugin/RequestPlugin.cjs.map +0 -1
- package/dist/request/plugin/cache.cjs +0 -269
- package/dist/request/plugin/cache.cjs.map +0 -1
- package/dist/request/plugin/csrfPlugin.cjs +0 -40
- package/dist/request/plugin/csrfPlugin.cjs.map +0 -1
- package/dist/request/plugin/index.cjs +0 -53
- package/dist/request/plugin/index.cjs.map +0 -1
- package/dist/request/plugin/monitoring.cjs +0 -216
- package/dist/request/plugin/monitoring.cjs.map +0 -1
- package/dist/request/plugin/queue.cjs +0 -140
- package/dist/request/plugin/queue.cjs.map +0 -1
- package/dist/request/plugin/retry.cjs +0 -98
- package/dist/request/plugin/retry.cjs.map +0 -1
- package/dist/request/plugin/validation.cjs +0 -121
- package/dist/request/plugin/validation.cjs.map +0 -1
- package/dist/request/runtime/RequestContext.cjs +0 -77
- package/dist/request/runtime/RequestContext.cjs.map +0 -1
- package/dist/request/runtime/index.cjs +0 -32
- package/dist/request/runtime/index.cjs.map +0 -1
- package/dist/request/types.cjs +0 -112
- package/dist/request/types.cjs.map +0 -1
- package/dist/request/utils/RequestQueueManager.cjs +0 -168
- package/dist/request/utils/RequestQueueManager.cjs.map +0 -1
- package/dist/request/utils/dependencyCheck.cjs +0 -237
- package/dist/request/utils/dependencyCheck.cjs.map +0 -1
- package/dist/request/utils/index.cjs +0 -30
- package/dist/request/utils/index.cjs.map +0 -1
- package/dist/request.umd.js +0 -5392
- package/dist/request.umd.js.map +0 -1
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* 性能指标单位常量
|
|
3
|
-
*/ "use strict";
|
|
1
|
+
"use strict";
|
|
4
2
|
Object.defineProperty(exports, "__esModule", {
|
|
5
3
|
value: true
|
|
6
4
|
});
|
|
@@ -12,360 +10,15 @@ function _export(target, all) {
|
|
|
12
10
|
}
|
|
13
11
|
_export(exports, {
|
|
14
12
|
get PERFORMANCE_METRIC_UNITS () {
|
|
15
|
-
return PERFORMANCE_METRIC_UNITS;
|
|
16
|
-
},
|
|
17
|
-
get PERFORMANCE_METRIC_UNIT_MAP () {
|
|
18
|
-
return PERFORMANCE_METRIC_UNIT_MAP;
|
|
13
|
+
return _utils.PERFORMANCE_METRIC_UNITS;
|
|
19
14
|
},
|
|
20
15
|
get PerformanceMonitor () {
|
|
21
|
-
return PerformanceMonitor;
|
|
16
|
+
return _utils.PerformanceMonitor;
|
|
22
17
|
},
|
|
23
18
|
get convertMetricsToWithUnits () {
|
|
24
|
-
return convertMetricsToWithUnits;
|
|
19
|
+
return _utils.convertMetricsToWithUnits;
|
|
25
20
|
}
|
|
26
21
|
});
|
|
27
|
-
|
|
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
|
-
const PERFORMANCE_METRIC_UNITS = {
|
|
41
|
-
/**
|
|
42
|
-
* 毫秒单位
|
|
43
|
-
*/ ms: 'ms',
|
|
44
|
-
/**
|
|
45
|
-
* 无单位(分数)
|
|
46
|
-
*/ none: ''
|
|
47
|
-
};
|
|
48
|
-
let PerformanceMonitor = class PerformanceMonitor {
|
|
49
|
-
/**
|
|
50
|
-
* 初始化 Web Vitals 收集
|
|
51
|
-
*/ initWebVitals() {
|
|
52
|
-
// 采样检查移到每次上报时进行,而不是初始化时
|
|
53
|
-
// 这样可以确保监控功能始终初始化,只是选择性上报
|
|
54
|
-
// 首次内容绘制 (FCP)
|
|
55
|
-
this.observePaint('first-contentful-paint', (entry)=>{
|
|
56
|
-
if (Math.random() <= this.config.sampleRate) {
|
|
57
|
-
this.metrics.fcp = Math.round(entry.startTime);
|
|
58
|
-
this.reportInternal();
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
// 最大内容绘制 (LCP)
|
|
62
|
-
this.observeLCP();
|
|
63
|
-
// 首次输入延迟 (FID)
|
|
64
|
-
this.observeFID();
|
|
65
|
-
// 累积布局偏移 (CLS)
|
|
66
|
-
this.observeCLS();
|
|
67
|
-
// 可交互时间 (TTI) - 需要计算(延迟到页面加载完成后)
|
|
68
|
-
if (typeof window !== 'undefined' && document.readyState === 'complete') {
|
|
69
|
-
this.calculateTTI();
|
|
70
|
-
} else if (typeof window !== 'undefined') {
|
|
71
|
-
window.addEventListener('load', ()=>{
|
|
72
|
-
// 使用 requestIdleCallback 在空闲时计算
|
|
73
|
-
if (typeof requestIdleCallback !== 'undefined') {
|
|
74
|
-
requestIdleCallback(()=>{
|
|
75
|
-
this.calculateTTI();
|
|
76
|
-
}, {
|
|
77
|
-
timeout: 2000
|
|
78
|
-
});
|
|
79
|
-
} else {
|
|
80
|
-
setTimeout(()=>{
|
|
81
|
-
this.calculateTTI();
|
|
82
|
-
}, 1000);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* 观察 Paint 指标
|
|
89
|
-
*/ observePaint(name, callback) {
|
|
90
|
-
if (typeof PerformanceObserver === 'undefined') {
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
try {
|
|
94
|
-
const observer = new PerformanceObserver((list)=>{
|
|
95
|
-
for (const entry of list.getEntries()){
|
|
96
|
-
if (entry.name === name) {
|
|
97
|
-
callback(entry);
|
|
98
|
-
observer.disconnect();
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
observer.observe({
|
|
103
|
-
entryTypes: [
|
|
104
|
-
'paint'
|
|
105
|
-
]
|
|
106
|
-
});
|
|
107
|
-
this.observers.push(observer);
|
|
108
|
-
} catch (e) {
|
|
109
|
-
// PerformanceObserver 不支持或已断开
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* 观察 LCP
|
|
114
|
-
*/ observeLCP() {
|
|
115
|
-
if (typeof PerformanceObserver === 'undefined') {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
try {
|
|
119
|
-
const observer = new PerformanceObserver((list)=>{
|
|
120
|
-
const entries = list.getEntries();
|
|
121
|
-
const lastEntry = entries[entries.length - 1];
|
|
122
|
-
const lcpValue = Math.round(lastEntry.renderTime || lastEntry.loadTime || lastEntry.startTime);
|
|
123
|
-
// 采样检查和异常值检查
|
|
124
|
-
if (Math.random() <= this.config.sampleRate && lcpValue > 0 && lcpValue < 60000) {
|
|
125
|
-
this.metrics.lcp = lcpValue;
|
|
126
|
-
this.reportInternal();
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
observer.observe({
|
|
130
|
-
entryTypes: [
|
|
131
|
-
'largest-contentful-paint'
|
|
132
|
-
]
|
|
133
|
-
});
|
|
134
|
-
this.observers.push(observer);
|
|
135
|
-
} catch (e) {
|
|
136
|
-
// PerformanceObserver 不支持
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* 观察 FID
|
|
141
|
-
*/ observeFID() {
|
|
142
|
-
if (typeof PerformanceObserver === 'undefined') {
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
try {
|
|
146
|
-
const observer = new PerformanceObserver((list)=>{
|
|
147
|
-
for (const entry of list.getEntries()){
|
|
148
|
-
const fidEntry = entry;
|
|
149
|
-
const fidValue = Math.round(fidEntry.processingStart - fidEntry.startTime);
|
|
150
|
-
// 采样检查和异常值检查
|
|
151
|
-
if (Math.random() <= this.config.sampleRate && fidValue >= 0 && fidValue < 10000) {
|
|
152
|
-
this.metrics.fid = fidValue;
|
|
153
|
-
this.reportInternal();
|
|
154
|
-
}
|
|
155
|
-
observer.disconnect();
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
observer.observe({
|
|
159
|
-
entryTypes: [
|
|
160
|
-
'first-input'
|
|
161
|
-
]
|
|
162
|
-
});
|
|
163
|
-
this.observers.push(observer);
|
|
164
|
-
} catch (e) {
|
|
165
|
-
// PerformanceObserver 不支持
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* 观察 CLS
|
|
170
|
-
*/ observeCLS() {
|
|
171
|
-
if (typeof PerformanceObserver === 'undefined') {
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
let clsValue = 0;
|
|
175
|
-
let clsEntries = [];
|
|
176
|
-
try {
|
|
177
|
-
const observer = new PerformanceObserver((list)=>{
|
|
178
|
-
for (const entry of list.getEntries()){
|
|
179
|
-
if (!entry.hadRecentInput) {
|
|
180
|
-
const firstSessionEntry = clsEntries[0];
|
|
181
|
-
const lastSessionEntry = clsEntries[clsEntries.length - 1];
|
|
182
|
-
if (!firstSessionEntry || entry.startTime - lastSessionEntry.startTime < 1000 || entry.startTime - firstSessionEntry.startTime > 5000) {
|
|
183
|
-
clsEntries = [
|
|
184
|
-
entry
|
|
185
|
-
];
|
|
186
|
-
clsValue = entry.value;
|
|
187
|
-
} else {
|
|
188
|
-
clsEntries.push(entry);
|
|
189
|
-
clsValue += entry.value;
|
|
190
|
-
}
|
|
191
|
-
const roundedValue = Math.round(clsValue * 1000) / 1000;
|
|
192
|
-
// 采样检查和异常值检查
|
|
193
|
-
if (Math.random() <= this.config.sampleRate && roundedValue >= 0 && roundedValue < 1) {
|
|
194
|
-
this.metrics.cls = roundedValue;
|
|
195
|
-
this.reportInternal();
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
observer.observe({
|
|
201
|
-
entryTypes: [
|
|
202
|
-
'layout-shift'
|
|
203
|
-
]
|
|
204
|
-
});
|
|
205
|
-
this.observers.push(observer);
|
|
206
|
-
} catch (e) {
|
|
207
|
-
// PerformanceObserver 不支持
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* 计算 TTI
|
|
212
|
-
*/ calculateTTI() {
|
|
213
|
-
if (typeof window === 'undefined' || !window.performance) {
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
try {
|
|
217
|
-
const navigation = performance.getEntriesByType('navigation')[0];
|
|
218
|
-
if (navigation) {
|
|
219
|
-
const ttiValue = Math.round(navigation.domInteractive - navigation.fetchStart);
|
|
220
|
-
// 采样检查和异常值检查
|
|
221
|
-
if (Math.random() <= this.config.sampleRate && ttiValue > 0 && ttiValue < 60000) {
|
|
222
|
-
this.metrics.tti = ttiValue;
|
|
223
|
-
this.reportInternal();
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
} catch (e) {
|
|
227
|
-
// 忽略错误
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* 内部上报性能指标(自动上报当前指标)
|
|
232
|
-
*/ reportInternal() {
|
|
233
|
-
if (this.config.onReport) {
|
|
234
|
-
// 创建指标的副本,避免外部修改影响内部状态
|
|
235
|
-
const metricsCopy = {};
|
|
236
|
-
if (this.metrics.fcp !== undefined) metricsCopy.fcp = this.metrics.fcp;
|
|
237
|
-
if (this.metrics.lcp !== undefined) metricsCopy.lcp = this.metrics.lcp;
|
|
238
|
-
if (this.metrics.fid !== undefined) metricsCopy.fid = this.metrics.fid;
|
|
239
|
-
if (this.metrics.cls !== undefined) metricsCopy.cls = this.metrics.cls;
|
|
240
|
-
if (this.metrics.tti !== undefined) metricsCopy.tti = this.metrics.tti;
|
|
241
|
-
if (this.metrics.tbt !== undefined) metricsCopy.tbt = this.metrics.tbt;
|
|
242
|
-
if (this.metrics.si !== undefined) metricsCopy.si = this.metrics.si;
|
|
243
|
-
this.config.onReport(metricsCopy);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* 获取当前性能指标
|
|
248
|
-
*/ getMetrics() {
|
|
249
|
-
return {
|
|
250
|
-
...this.metrics
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* 手动记录自定义指标
|
|
255
|
-
*/ recordMetric(name, value) {
|
|
256
|
-
this.metrics[name] = value;
|
|
257
|
-
this.reportInternal();
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* 清理观察者
|
|
261
|
-
*/ disconnect() {
|
|
262
|
-
this.observers.forEach((observer)=>observer.disconnect());
|
|
263
|
-
this.observers = [];
|
|
264
|
-
// 停止聚合定时器
|
|
265
|
-
if (this.aggregationTimer) {
|
|
266
|
-
clearInterval(this.aggregationTimer);
|
|
267
|
-
this.aggregationTimer = undefined;
|
|
268
|
-
}
|
|
269
|
-
// 停止自动上报定时器
|
|
270
|
-
if (this.autoReportTimer) {
|
|
271
|
-
clearInterval(this.autoReportTimer);
|
|
272
|
-
this.autoReportTimer = undefined;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* 启动性能指标聚合
|
|
277
|
-
*/ startAggregation() {
|
|
278
|
-
this.aggregationTimer = setInterval(()=>{
|
|
279
|
-
this.aggregateMetrics();
|
|
280
|
-
}, this.config.aggregationWindow);
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* 聚合性能指标
|
|
284
|
-
*/ aggregateMetrics() {
|
|
285
|
-
// 计算平均值、最大值、最小值等统计信息
|
|
286
|
-
// 这里简化实现,实际可以根据需要扩展
|
|
287
|
-
this.aggregatedMetrics = {
|
|
288
|
-
...this.metrics
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* 获取聚合后的性能指标
|
|
293
|
-
*/ getAggregatedMetrics() {
|
|
294
|
-
return {
|
|
295
|
-
...this.aggregatedMetrics
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
/**
|
|
299
|
-
* 启动自动上报
|
|
300
|
-
*/ startAutoReport() {
|
|
301
|
-
this.autoReportTimer = setInterval(()=>{
|
|
302
|
-
const metrics = this.config.enableAggregation ? this.getAggregatedMetrics() : this.getMetrics();
|
|
303
|
-
this.config.onReport(metrics);
|
|
304
|
-
}, this.config.autoReportInterval);
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* 手动上报性能指标
|
|
308
|
-
*/ report(metrics) {
|
|
309
|
-
const metricsToReport = metrics || this.getMetrics();
|
|
310
|
-
this.config.onReport(metricsToReport);
|
|
311
|
-
}
|
|
312
|
-
constructor(config = {}){
|
|
313
|
-
_define_property(this, "config", void 0);
|
|
314
|
-
_define_property(this, "metrics", {});
|
|
315
|
-
_define_property(this, "observers", []);
|
|
316
|
-
_define_property(this, "aggregatedMetrics", {});
|
|
317
|
-
_define_property(this, "aggregationTimer", void 0);
|
|
318
|
-
_define_property(this, "autoReportTimer", void 0);
|
|
319
|
-
this.config = {
|
|
320
|
-
collectWebVitals: config.collectWebVitals ?? true,
|
|
321
|
-
onReport: config.onReport ?? (()=>{}),
|
|
322
|
-
sampleRate: config.sampleRate ?? 1.0,
|
|
323
|
-
enableAggregation: config.enableAggregation ?? false,
|
|
324
|
-
aggregationWindow: config.aggregationWindow ?? 60000,
|
|
325
|
-
autoReport: config.autoReport ?? false,
|
|
326
|
-
autoReportInterval: config.autoReportInterval ?? 300000
|
|
327
|
-
};
|
|
328
|
-
if (this.config.collectWebVitals && typeof window !== 'undefined') {
|
|
329
|
-
this.initWebVitals();
|
|
330
|
-
}
|
|
331
|
-
// 启动性能指标聚合
|
|
332
|
-
if (this.config.enableAggregation) {
|
|
333
|
-
this.startAggregation();
|
|
334
|
-
}
|
|
335
|
-
// 启动自动上报
|
|
336
|
-
if (this.config.autoReport) {
|
|
337
|
-
this.startAutoReport();
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
};
|
|
341
|
-
const PERFORMANCE_METRIC_UNIT_MAP = {
|
|
342
|
-
// Web Vitals 指标
|
|
343
|
-
fcp: PERFORMANCE_METRIC_UNITS.ms,
|
|
344
|
-
lcp: PERFORMANCE_METRIC_UNITS.ms,
|
|
345
|
-
fid: PERFORMANCE_METRIC_UNITS.ms,
|
|
346
|
-
cls: PERFORMANCE_METRIC_UNITS.none,
|
|
347
|
-
tti: PERFORMANCE_METRIC_UNITS.ms,
|
|
348
|
-
tbt: PERFORMANCE_METRIC_UNITS.ms,
|
|
349
|
-
si: PERFORMANCE_METRIC_UNITS.ms,
|
|
350
|
-
// 启动性能指标
|
|
351
|
-
serviceInitDuration: PERFORMANCE_METRIC_UNITS.ms,
|
|
352
|
-
initializationDuration: PERFORMANCE_METRIC_UNITS.ms,
|
|
353
|
-
firstRenderDuration: PERFORMANCE_METRIC_UNITS.ms,
|
|
354
|
-
totalStartupDuration: PERFORMANCE_METRIC_UNITS.ms
|
|
355
|
-
};
|
|
356
|
-
function convertMetricsToWithUnits(metrics) {
|
|
357
|
-
const result = {};
|
|
358
|
-
for (const [key, value] of Object.entries(metrics)){
|
|
359
|
-
if (value !== undefined && value !== null && typeof value === 'number') {
|
|
360
|
-
// 从映射中获取单位,如果没有映射则默认为毫秒
|
|
361
|
-
const unit = PERFORMANCE_METRIC_UNIT_MAP[key] || PERFORMANCE_METRIC_UNITS.ms;
|
|
362
|
-
result[key] = {
|
|
363
|
-
value,
|
|
364
|
-
unit
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
return result;
|
|
369
|
-
}
|
|
22
|
+
const _utils = require("@vlian/utils");
|
|
370
23
|
|
|
371
24
|
//# sourceMappingURL=performance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/performance.ts"],"sourcesContent":["/**\n * 性能指标单位常量\n */\nexport const PERFORMANCE_METRIC_UNITS = {\n /**\n * 毫秒单位\n */\n ms: 'ms',\n /**\n * 无单位(分数)\n */\n none: '',\n} as const;\n\n/**\n * 性能指标单位类型\n */\nexport type PerformanceMetricUnit = typeof PERFORMANCE_METRIC_UNITS[keyof typeof PERFORMANCE_METRIC_UNITS];\n\n/**\n * 带单位的性能指标值\n */\nexport interface PerformanceMetricValue {\n /**\n * 指标值\n */\n value: number;\n /**\n * 单位\n */\n unit: PerformanceMetricUnit;\n}\n\n/**\n * 性能指标类型\n */\nexport interface PerformanceMetrics {\n /**\n * First Contentful Paint (首次内容绘制)\n * 单位:毫秒(ms)\n */\n fcp?: number;\n /**\n * Largest Contentful Paint (最大内容绘制)\n * 单位:毫秒(ms)\n */\n lcp?: number;\n /**\n * First Input Delay (首次输入延迟)\n * 单位:毫秒(ms)\n */\n fid?: number;\n /**\n * Cumulative Layout Shift (累积布局偏移)\n * 单位:无(分数)\n */\n cls?: number;\n /**\n * Time to Interactive (可交互时间)\n * 单位:毫秒(ms)\n */\n tti?: number;\n /**\n * Total Blocking Time (总阻塞时间)\n * 单位:毫秒(ms)\n */\n tbt?: number;\n /**\n * Speed Index (速度指数)\n * 单位:毫秒(ms)\n */\n si?: number;\n}\n\n/**\n * 性能监控配置\n */\nexport interface PerformanceMonitorConfig {\n /**\n * 是否自动收集 Web Vitals\n */\n collectWebVitals?: boolean;\n /**\n * 性能指标上报回调\n */\n onReport?: (metrics: PerformanceMetrics) => void;\n /**\n * 采样率 (0-1)\n */\n sampleRate?: number;\n /**\n * 是否启用性能指标聚合\n */\n enableAggregation?: boolean;\n /**\n * 性能指标聚合窗口大小(毫秒)\n */\n aggregationWindow?: number;\n /**\n * 是否自动上报性能指标\n */\n autoReport?: boolean;\n /**\n * 自动上报间隔(毫秒)\n */\n autoReportInterval?: number;\n}\n\n/**\n * 性能监控类\n */\nexport class PerformanceMonitor {\n private config: Required<PerformanceMonitorConfig>;\n private metrics: PerformanceMetrics = {};\n private observers: PerformanceObserver[] = [];\n private aggregatedMetrics: PerformanceMetrics = {};\n private aggregationTimer?: ReturnType<typeof setInterval>;\n private autoReportTimer?: ReturnType<typeof setInterval>;\n\n constructor(config: PerformanceMonitorConfig = {}) {\n this.config = {\n collectWebVitals: config.collectWebVitals ?? true,\n onReport: config.onReport ?? (() => {}),\n sampleRate: config.sampleRate ?? 1.0,\n enableAggregation: config.enableAggregation ?? false,\n aggregationWindow: config.aggregationWindow ?? 60000, // 1分钟\n autoReport: config.autoReport ?? false,\n autoReportInterval: config.autoReportInterval ?? 300000, // 5分钟\n };\n\n if (this.config.collectWebVitals && typeof window !== 'undefined') {\n this.initWebVitals();\n }\n\n // 启动性能指标聚合\n if (this.config.enableAggregation) {\n this.startAggregation();\n }\n\n // 启动自动上报\n if (this.config.autoReport) {\n this.startAutoReport();\n }\n }\n\n /**\n * 初始化 Web Vitals 收集\n */\n private initWebVitals(): void {\n // 采样检查移到每次上报时进行,而不是初始化时\n // 这样可以确保监控功能始终初始化,只是选择性上报\n\n // 首次内容绘制 (FCP)\n this.observePaint('first-contentful-paint', (entry) => {\n if (Math.random() <= this.config.sampleRate) {\n this.metrics.fcp = Math.round(entry.startTime);\n this.reportInternal();\n }\n });\n\n // 最大内容绘制 (LCP)\n this.observeLCP();\n\n // 首次输入延迟 (FID)\n this.observeFID();\n\n // 累积布局偏移 (CLS)\n this.observeCLS();\n\n // 可交互时间 (TTI) - 需要计算(延迟到页面加载完成后)\n if (typeof window !== 'undefined' && document.readyState === 'complete') {\n this.calculateTTI();\n } else if (typeof window !== 'undefined') {\n window.addEventListener('load', () => {\n // 使用 requestIdleCallback 在空闲时计算\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(() => {\n this.calculateTTI();\n }, { timeout: 2000 });\n } else {\n setTimeout(() => {\n this.calculateTTI();\n }, 1000);\n }\n });\n }\n }\n\n /**\n * 观察 Paint 指标\n */\n private observePaint(name: string, callback: (entry: PerformanceEntry) => void): void {\n if (typeof PerformanceObserver === 'undefined') {\n return;\n }\n\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === name) {\n callback(entry);\n observer.disconnect();\n }\n }\n });\n observer.observe({ entryTypes: ['paint'] });\n this.observers.push(observer);\n } catch (e) {\n // PerformanceObserver 不支持或已断开\n }\n }\n\n /**\n * 观察 LCP\n */\n private observeLCP(): void {\n if (typeof PerformanceObserver === 'undefined') {\n return;\n }\n\n try {\n const observer = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const lastEntry = entries[entries.length - 1] as PerformanceEntry & { renderTime?: number; loadTime?: number };\n const lcpValue = Math.round((lastEntry.renderTime || lastEntry.loadTime || lastEntry.startTime));\n \n // 采样检查和异常值检查\n if (Math.random() <= this.config.sampleRate && lcpValue > 0 && lcpValue < 60000) {\n this.metrics.lcp = lcpValue;\n this.reportInternal();\n }\n });\n observer.observe({ entryTypes: ['largest-contentful-paint'] });\n this.observers.push(observer);\n } catch (e) {\n // PerformanceObserver 不支持\n }\n }\n\n /**\n * 观察 FID\n */\n private observeFID(): void {\n if (typeof PerformanceObserver === 'undefined') {\n return;\n }\n\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const fidEntry = entry as PerformanceEventTiming;\n const fidValue = Math.round(fidEntry.processingStart - fidEntry.startTime);\n \n // 采样检查和异常值检查\n if (Math.random() <= this.config.sampleRate && fidValue >= 0 && fidValue < 10000) {\n this.metrics.fid = fidValue;\n this.reportInternal();\n }\n observer.disconnect();\n }\n });\n observer.observe({ entryTypes: ['first-input'] });\n this.observers.push(observer);\n } catch (e) {\n // PerformanceObserver 不支持\n }\n }\n\n /**\n * 观察 CLS\n */\n private observeCLS(): void {\n if (typeof PerformanceObserver === 'undefined') {\n return;\n }\n\n let clsValue = 0;\n let clsEntries: PerformanceEntry[] = [];\n\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!(entry as any).hadRecentInput) {\n const firstSessionEntry = clsEntries[0];\n const lastSessionEntry = clsEntries[clsEntries.length - 1];\n\n if (\n !firstSessionEntry ||\n entry.startTime - lastSessionEntry.startTime < 1000 ||\n entry.startTime - firstSessionEntry.startTime > 5000\n ) {\n clsEntries = [entry];\n clsValue = (entry as any).value;\n } else {\n clsEntries.push(entry);\n clsValue += (entry as any).value;\n }\n\n const roundedValue = Math.round(clsValue * 1000) / 1000;\n // 采样检查和异常值检查\n if (Math.random() <= this.config.sampleRate && roundedValue >= 0 && roundedValue < 1) {\n this.metrics.cls = roundedValue;\n this.reportInternal();\n }\n }\n }\n });\n observer.observe({ entryTypes: ['layout-shift'] });\n this.observers.push(observer);\n } catch (e) {\n // PerformanceObserver 不支持\n }\n }\n\n /**\n * 计算 TTI\n */\n private calculateTTI(): void {\n if (typeof window === 'undefined' || !window.performance) {\n return;\n }\n\n try {\n const navigation = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming;\n if (navigation) {\n const ttiValue = Math.round(navigation.domInteractive - navigation.fetchStart);\n // 采样检查和异常值检查\n if (Math.random() <= this.config.sampleRate && ttiValue > 0 && ttiValue < 60000) {\n this.metrics.tti = ttiValue;\n this.reportInternal();\n }\n }\n } catch (e) {\n // 忽略错误\n }\n }\n\n /**\n * 内部上报性能指标(自动上报当前指标)\n */\n private reportInternal(): void {\n if (this.config.onReport) {\n // 创建指标的副本,避免外部修改影响内部状态\n const metricsCopy: PerformanceMetrics = {};\n if (this.metrics.fcp !== undefined) metricsCopy.fcp = this.metrics.fcp;\n if (this.metrics.lcp !== undefined) metricsCopy.lcp = this.metrics.lcp;\n if (this.metrics.fid !== undefined) metricsCopy.fid = this.metrics.fid;\n if (this.metrics.cls !== undefined) metricsCopy.cls = this.metrics.cls;\n if (this.metrics.tti !== undefined) metricsCopy.tti = this.metrics.tti;\n if (this.metrics.tbt !== undefined) metricsCopy.tbt = this.metrics.tbt;\n if (this.metrics.si !== undefined) metricsCopy.si = this.metrics.si;\n \n this.config.onReport(metricsCopy);\n }\n }\n\n /**\n * 获取当前性能指标\n */\n getMetrics(): PerformanceMetrics {\n return { ...this.metrics };\n }\n\n /**\n * 手动记录自定义指标\n */\n recordMetric(name: string, value: number): void {\n (this.metrics as Record<string, number>)[name] = value;\n this.reportInternal();\n }\n\n /**\n * 清理观察者\n */\n disconnect(): void {\n this.observers.forEach((observer) => observer.disconnect());\n this.observers = [];\n\n // 停止聚合定时器\n if (this.aggregationTimer) {\n clearInterval(this.aggregationTimer);\n this.aggregationTimer = undefined;\n }\n\n // 停止自动上报定时器\n if (this.autoReportTimer) {\n clearInterval(this.autoReportTimer);\n this.autoReportTimer = undefined;\n }\n }\n\n /**\n * 启动性能指标聚合\n */\n private startAggregation(): void {\n this.aggregationTimer = setInterval(() => {\n this.aggregateMetrics();\n }, this.config.aggregationWindow);\n }\n\n /**\n * 聚合性能指标\n */\n private aggregateMetrics(): void {\n // 计算平均值、最大值、最小值等统计信息\n // 这里简化实现,实际可以根据需要扩展\n this.aggregatedMetrics = { ...this.metrics };\n }\n\n /**\n * 获取聚合后的性能指标\n */\n getAggregatedMetrics(): PerformanceMetrics {\n return { ...this.aggregatedMetrics };\n }\n\n /**\n * 启动自动上报\n */\n private startAutoReport(): void {\n this.autoReportTimer = setInterval(() => {\n const metrics = this.config.enableAggregation \n ? this.getAggregatedMetrics() \n : this.getMetrics();\n this.config.onReport(metrics);\n }, this.config.autoReportInterval);\n }\n\n /**\n * 手动上报性能指标\n */\n report(metrics?: PerformanceMetrics): void {\n const metricsToReport = metrics || this.getMetrics();\n this.config.onReport(metricsToReport);\n }\n}\n\n/**\n * 带单位的性能指标类型\n */\nexport interface PerformanceMetricsWithUnits {\n /**\n * First Contentful Paint (首次内容绘制)\n * 单位:毫秒(ms)\n */\n fcp?: PerformanceMetricValue;\n /**\n * Largest Contentful Paint (最大内容绘制)\n * 单位:毫秒(ms)\n */\n lcp?: PerformanceMetricValue;\n /**\n * First Input Delay (首次输入延迟)\n * 单位:毫秒(ms)\n */\n fid?: PerformanceMetricValue;\n /**\n * Cumulative Layout Shift (累积布局偏移)\n * 单位:无(分数)\n */\n cls?: PerformanceMetricValue;\n /**\n * Time to Interactive (可交互时间)\n * 单位:毫秒(ms)\n */\n tti?: PerformanceMetricValue;\n /**\n * Total Blocking Time (总阻塞时间)\n * 单位:毫秒(ms)\n */\n tbt?: PerformanceMetricValue;\n /**\n * Speed Index (速度指数)\n * 单位:毫秒(ms)\n */\n si?: PerformanceMetricValue;\n /**\n * 服务初始化耗时\n * 单位:毫秒(ms)\n */\n serviceInitDuration?: PerformanceMetricValue;\n /**\n * 初始化耗时\n * 单位:毫秒(ms)\n */\n initializationDuration?: PerformanceMetricValue;\n /**\n * 首次渲染耗时\n * 单位:毫秒(ms)\n */\n firstRenderDuration?: PerformanceMetricValue;\n /**\n * 总启动耗时\n * 单位:毫秒(ms)\n */\n totalStartupDuration?: PerformanceMetricValue;\n}\n\n/**\n * 性能指标单位映射(包含所有可能的指标键)\n */\nexport const PERFORMANCE_METRIC_UNIT_MAP: Record<string, PerformanceMetricUnit> = {\n // Web Vitals 指标\n fcp: PERFORMANCE_METRIC_UNITS.ms,\n lcp: PERFORMANCE_METRIC_UNITS.ms,\n fid: PERFORMANCE_METRIC_UNITS.ms,\n cls: PERFORMANCE_METRIC_UNITS.none,\n tti: PERFORMANCE_METRIC_UNITS.ms,\n tbt: PERFORMANCE_METRIC_UNITS.ms,\n si: PERFORMANCE_METRIC_UNITS.ms,\n // 启动性能指标\n serviceInitDuration: PERFORMANCE_METRIC_UNITS.ms,\n initializationDuration: PERFORMANCE_METRIC_UNITS.ms,\n firstRenderDuration: PERFORMANCE_METRIC_UNITS.ms,\n totalStartupDuration: PERFORMANCE_METRIC_UNITS.ms,\n};\n\n/**\n * 将性能指标转换为带单位的格式\n * \n * @param metrics - 性能指标对象(可能包含 Web Vitals 和启动性能指标)\n * @returns 带单位的性能指标对象\n */\nexport function convertMetricsToWithUnits(metrics: PerformanceMetrics | Record<string, number>): PerformanceMetricsWithUnits {\n const result: PerformanceMetricsWithUnits = {};\n \n for (const [key, value] of Object.entries(metrics)) {\n if (value !== undefined && value !== null && typeof value === 'number') {\n // 从映射中获取单位,如果没有映射则默认为毫秒\n const unit = PERFORMANCE_METRIC_UNIT_MAP[key] || PERFORMANCE_METRIC_UNITS.ms;\n (result as Record<string, PerformanceMetricValue>)[key] = {\n value,\n unit,\n };\n }\n }\n \n return result;\n}\n\n/**\n * 性能事件时间接口\n */\ninterface PerformanceEventTiming extends PerformanceEntry {\n processingStart: number;\n}\n"],"names":["PERFORMANCE_METRIC_UNITS","PERFORMANCE_METRIC_UNIT_MAP","PerformanceMonitor","convertMetricsToWithUnits","ms","none","initWebVitals","observePaint","entry","Math","random","config","sampleRate","metrics","fcp","round","startTime","reportInternal","observeLCP","observeFID","observeCLS","window","document","readyState","calculateTTI","addEventListener","requestIdleCallback","timeout","setTimeout","name","callback","PerformanceObserver","observer","list","getEntries","disconnect","observe","entryTypes","observers","push","e","entries","lastEntry","length","lcpValue","renderTime","loadTime","lcp","fidEntry","fidValue","processingStart","fid","clsValue","clsEntries","hadRecentInput","firstSessionEntry","lastSessionEntry","value","roundedValue","cls","performance","navigation","getEntriesByType","ttiValue","domInteractive","fetchStart","tti","onReport","metricsCopy","undefined","tbt","si","getMetrics","recordMetric","forEach","aggregationTimer","clearInterval","autoReportTimer","startAggregation","setInterval","aggregateMetrics","aggregationWindow","aggregatedMetrics","getAggregatedMetrics","startAutoReport","enableAggregation","autoReportInterval","report","metricsToReport","collectWebVitals","autoReport","serviceInitDuration","initializationDuration","firstRenderDuration","totalStartupDuration","result","key","Object","unit"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/performance.ts"],"sourcesContent":["export { PerformanceMonitor, PERFORMANCE_METRIC_UNITS, convertMetricsToWithUnits } from '@vlian/utils';\nexport type {\n PerformanceMetrics,\n PerformanceMonitorConfig,\n PerformanceMetricsWithUnits,\n PerformanceMetricValue,\n PerformanceMetricUnit,\n} from '@vlian/utils';\n"],"names":["PERFORMANCE_METRIC_UNITS","PerformanceMonitor","convertMetricsToWithUnits"],"mappings":";;;;;;;;;;;QAA6BA;eAAAA,+BAAwB;;QAA5CC;eAAAA,yBAAkB;;QAA4BC;eAAAA,gCAAyB;;;uBAAQ"}
|
|
@@ -1,246 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*/
|
|
4
|
-
export declare const PERFORMANCE_METRIC_UNITS: {
|
|
5
|
-
/**
|
|
6
|
-
* 毫秒单位
|
|
7
|
-
*/
|
|
8
|
-
readonly ms: "ms";
|
|
9
|
-
/**
|
|
10
|
-
* 无单位(分数)
|
|
11
|
-
*/
|
|
12
|
-
readonly none: "";
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* 性能指标单位类型
|
|
16
|
-
*/
|
|
17
|
-
export type PerformanceMetricUnit = typeof PERFORMANCE_METRIC_UNITS[keyof typeof PERFORMANCE_METRIC_UNITS];
|
|
18
|
-
/**
|
|
19
|
-
* 带单位的性能指标值
|
|
20
|
-
*/
|
|
21
|
-
export interface PerformanceMetricValue {
|
|
22
|
-
/**
|
|
23
|
-
* 指标值
|
|
24
|
-
*/
|
|
25
|
-
value: number;
|
|
26
|
-
/**
|
|
27
|
-
* 单位
|
|
28
|
-
*/
|
|
29
|
-
unit: PerformanceMetricUnit;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* 性能指标类型
|
|
33
|
-
*/
|
|
34
|
-
export interface PerformanceMetrics {
|
|
35
|
-
/**
|
|
36
|
-
* First Contentful Paint (首次内容绘制)
|
|
37
|
-
* 单位:毫秒(ms)
|
|
38
|
-
*/
|
|
39
|
-
fcp?: number;
|
|
40
|
-
/**
|
|
41
|
-
* Largest Contentful Paint (最大内容绘制)
|
|
42
|
-
* 单位:毫秒(ms)
|
|
43
|
-
*/
|
|
44
|
-
lcp?: number;
|
|
45
|
-
/**
|
|
46
|
-
* First Input Delay (首次输入延迟)
|
|
47
|
-
* 单位:毫秒(ms)
|
|
48
|
-
*/
|
|
49
|
-
fid?: number;
|
|
50
|
-
/**
|
|
51
|
-
* Cumulative Layout Shift (累积布局偏移)
|
|
52
|
-
* 单位:无(分数)
|
|
53
|
-
*/
|
|
54
|
-
cls?: number;
|
|
55
|
-
/**
|
|
56
|
-
* Time to Interactive (可交互时间)
|
|
57
|
-
* 单位:毫秒(ms)
|
|
58
|
-
*/
|
|
59
|
-
tti?: number;
|
|
60
|
-
/**
|
|
61
|
-
* Total Blocking Time (总阻塞时间)
|
|
62
|
-
* 单位:毫秒(ms)
|
|
63
|
-
*/
|
|
64
|
-
tbt?: number;
|
|
65
|
-
/**
|
|
66
|
-
* Speed Index (速度指数)
|
|
67
|
-
* 单位:毫秒(ms)
|
|
68
|
-
*/
|
|
69
|
-
si?: number;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* 性能监控配置
|
|
73
|
-
*/
|
|
74
|
-
export interface PerformanceMonitorConfig {
|
|
75
|
-
/**
|
|
76
|
-
* 是否自动收集 Web Vitals
|
|
77
|
-
*/
|
|
78
|
-
collectWebVitals?: boolean;
|
|
79
|
-
/**
|
|
80
|
-
* 性能指标上报回调
|
|
81
|
-
*/
|
|
82
|
-
onReport?: (metrics: PerformanceMetrics) => void;
|
|
83
|
-
/**
|
|
84
|
-
* 采样率 (0-1)
|
|
85
|
-
*/
|
|
86
|
-
sampleRate?: number;
|
|
87
|
-
/**
|
|
88
|
-
* 是否启用性能指标聚合
|
|
89
|
-
*/
|
|
90
|
-
enableAggregation?: boolean;
|
|
91
|
-
/**
|
|
92
|
-
* 性能指标聚合窗口大小(毫秒)
|
|
93
|
-
*/
|
|
94
|
-
aggregationWindow?: number;
|
|
95
|
-
/**
|
|
96
|
-
* 是否自动上报性能指标
|
|
97
|
-
*/
|
|
98
|
-
autoReport?: boolean;
|
|
99
|
-
/**
|
|
100
|
-
* 自动上报间隔(毫秒)
|
|
101
|
-
*/
|
|
102
|
-
autoReportInterval?: number;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* 性能监控类
|
|
106
|
-
*/
|
|
107
|
-
export declare class PerformanceMonitor {
|
|
108
|
-
private config;
|
|
109
|
-
private metrics;
|
|
110
|
-
private observers;
|
|
111
|
-
private aggregatedMetrics;
|
|
112
|
-
private aggregationTimer?;
|
|
113
|
-
private autoReportTimer?;
|
|
114
|
-
constructor(config?: PerformanceMonitorConfig);
|
|
115
|
-
/**
|
|
116
|
-
* 初始化 Web Vitals 收集
|
|
117
|
-
*/
|
|
118
|
-
private initWebVitals;
|
|
119
|
-
/**
|
|
120
|
-
* 观察 Paint 指标
|
|
121
|
-
*/
|
|
122
|
-
private observePaint;
|
|
123
|
-
/**
|
|
124
|
-
* 观察 LCP
|
|
125
|
-
*/
|
|
126
|
-
private observeLCP;
|
|
127
|
-
/**
|
|
128
|
-
* 观察 FID
|
|
129
|
-
*/
|
|
130
|
-
private observeFID;
|
|
131
|
-
/**
|
|
132
|
-
* 观察 CLS
|
|
133
|
-
*/
|
|
134
|
-
private observeCLS;
|
|
135
|
-
/**
|
|
136
|
-
* 计算 TTI
|
|
137
|
-
*/
|
|
138
|
-
private calculateTTI;
|
|
139
|
-
/**
|
|
140
|
-
* 内部上报性能指标(自动上报当前指标)
|
|
141
|
-
*/
|
|
142
|
-
private reportInternal;
|
|
143
|
-
/**
|
|
144
|
-
* 获取当前性能指标
|
|
145
|
-
*/
|
|
146
|
-
getMetrics(): PerformanceMetrics;
|
|
147
|
-
/**
|
|
148
|
-
* 手动记录自定义指标
|
|
149
|
-
*/
|
|
150
|
-
recordMetric(name: string, value: number): void;
|
|
151
|
-
/**
|
|
152
|
-
* 清理观察者
|
|
153
|
-
*/
|
|
154
|
-
disconnect(): void;
|
|
155
|
-
/**
|
|
156
|
-
* 启动性能指标聚合
|
|
157
|
-
*/
|
|
158
|
-
private startAggregation;
|
|
159
|
-
/**
|
|
160
|
-
* 聚合性能指标
|
|
161
|
-
*/
|
|
162
|
-
private aggregateMetrics;
|
|
163
|
-
/**
|
|
164
|
-
* 获取聚合后的性能指标
|
|
165
|
-
*/
|
|
166
|
-
getAggregatedMetrics(): PerformanceMetrics;
|
|
167
|
-
/**
|
|
168
|
-
* 启动自动上报
|
|
169
|
-
*/
|
|
170
|
-
private startAutoReport;
|
|
171
|
-
/**
|
|
172
|
-
* 手动上报性能指标
|
|
173
|
-
*/
|
|
174
|
-
report(metrics?: PerformanceMetrics): void;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* 带单位的性能指标类型
|
|
178
|
-
*/
|
|
179
|
-
export interface PerformanceMetricsWithUnits {
|
|
180
|
-
/**
|
|
181
|
-
* First Contentful Paint (首次内容绘制)
|
|
182
|
-
* 单位:毫秒(ms)
|
|
183
|
-
*/
|
|
184
|
-
fcp?: PerformanceMetricValue;
|
|
185
|
-
/**
|
|
186
|
-
* Largest Contentful Paint (最大内容绘制)
|
|
187
|
-
* 单位:毫秒(ms)
|
|
188
|
-
*/
|
|
189
|
-
lcp?: PerformanceMetricValue;
|
|
190
|
-
/**
|
|
191
|
-
* First Input Delay (首次输入延迟)
|
|
192
|
-
* 单位:毫秒(ms)
|
|
193
|
-
*/
|
|
194
|
-
fid?: PerformanceMetricValue;
|
|
195
|
-
/**
|
|
196
|
-
* Cumulative Layout Shift (累积布局偏移)
|
|
197
|
-
* 单位:无(分数)
|
|
198
|
-
*/
|
|
199
|
-
cls?: PerformanceMetricValue;
|
|
200
|
-
/**
|
|
201
|
-
* Time to Interactive (可交互时间)
|
|
202
|
-
* 单位:毫秒(ms)
|
|
203
|
-
*/
|
|
204
|
-
tti?: PerformanceMetricValue;
|
|
205
|
-
/**
|
|
206
|
-
* Total Blocking Time (总阻塞时间)
|
|
207
|
-
* 单位:毫秒(ms)
|
|
208
|
-
*/
|
|
209
|
-
tbt?: PerformanceMetricValue;
|
|
210
|
-
/**
|
|
211
|
-
* Speed Index (速度指数)
|
|
212
|
-
* 单位:毫秒(ms)
|
|
213
|
-
*/
|
|
214
|
-
si?: PerformanceMetricValue;
|
|
215
|
-
/**
|
|
216
|
-
* 服务初始化耗时
|
|
217
|
-
* 单位:毫秒(ms)
|
|
218
|
-
*/
|
|
219
|
-
serviceInitDuration?: PerformanceMetricValue;
|
|
220
|
-
/**
|
|
221
|
-
* 初始化耗时
|
|
222
|
-
* 单位:毫秒(ms)
|
|
223
|
-
*/
|
|
224
|
-
initializationDuration?: PerformanceMetricValue;
|
|
225
|
-
/**
|
|
226
|
-
* 首次渲染耗时
|
|
227
|
-
* 单位:毫秒(ms)
|
|
228
|
-
*/
|
|
229
|
-
firstRenderDuration?: PerformanceMetricValue;
|
|
230
|
-
/**
|
|
231
|
-
* 总启动耗时
|
|
232
|
-
* 单位:毫秒(ms)
|
|
233
|
-
*/
|
|
234
|
-
totalStartupDuration?: PerformanceMetricValue;
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* 性能指标单位映射(包含所有可能的指标键)
|
|
238
|
-
*/
|
|
239
|
-
export declare const PERFORMANCE_METRIC_UNIT_MAP: Record<string, PerformanceMetricUnit>;
|
|
240
|
-
/**
|
|
241
|
-
* 将性能指标转换为带单位的格式
|
|
242
|
-
*
|
|
243
|
-
* @param metrics - 性能指标对象(可能包含 Web Vitals 和启动性能指标)
|
|
244
|
-
* @returns 带单位的性能指标对象
|
|
245
|
-
*/
|
|
246
|
-
export declare function convertMetricsToWithUnits(metrics: PerformanceMetrics | Record<string, number>): PerformanceMetricsWithUnits;
|
|
1
|
+
export { PerformanceMonitor, PERFORMANCE_METRIC_UNITS, convertMetricsToWithUnits } from '@vlian/utils';
|
|
2
|
+
export type { PerformanceMetrics, PerformanceMonitorConfig, PerformanceMetricsWithUnits, PerformanceMetricValue, PerformanceMetricUnit, } from '@vlian/utils';
|