Skip to content

Commit 953e059

Browse files
committed
feat(preloads): implement preload view model and filtering logic
- Added `computePreloadViewModel` function to aggregate preload data. - Introduced `PreloadViewModel`, `PreloadRowVm`, and related types for structured data representation. - Implemented filtering functions for preload rows based on status and phase. - Created utility functions for summarizing hrefs and calculating average durations. - Added tests for `findBestQrlRequestMatch` to ensure correct matching logic for QRL requests. - Established a new preload runtime in `preloads.ts` to manage preload entries and their states. - Integrated performance resource timing to enhance preload tracking.
1 parent b35565b commit 953e059

21 files changed

Lines changed: 2410 additions & 10 deletions

File tree

.gitignore

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,6 @@ Thumbs.db
6767
.pnpm-store/*
6868
qwik/*
6969
.cursor/skills/*
70-
**/build-analysis/**/*
71-
related-folder/**
70+
related-folder/**
71+
**/.qwik-devtools/
72+
**/.qwik-devtools/

packages/kit/src/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export const VIRTUAL_QWIK_DEVTOOLS_KEY = 'virtual-qwik-devtools.ts';
4848
export const INNER_USE_HOOK = 'useCollectHooks';
4949

5050
export const QWIK_DEVTOOLS_GLOBAL_STATE = 'QWIK_DEVTOOLS_GLOBAL_STATE';
51+
export const QWIK_PRELOADS_UPDATE_EVENT = 'qwik:preloads-update';
5152

5253
export const QRL_KEY = '$qrl$';
5354
export const COMPUTED_QRL_KEY = '$computeQrl$';

packages/kit/src/globals.ts

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,82 @@ export interface QwikPerfStoreRemembered {
4646

4747
}
4848

49+
export type QwikPreloadStatus = 'pending' | 'loaded' | 'error' | 'unknown';
50+
export type QwikPreloadSource =
51+
| 'initial-dom'
52+
| 'mutation'
53+
| 'performance'
54+
| 'qrl-correlation';
55+
export type QwikPreloadOriginKind =
56+
| 'current-project'
57+
| 'vite-plugin-injected'
58+
| 'node_modules'
59+
| 'virtual-module'
60+
| 'generated'
61+
| 'external'
62+
| 'unknown';
63+
export type QwikPreloadPhase = 'csr' | 'ssr' | 'unknown';
64+
export type QwikPreloadMatchMode =
65+
| 'href'
66+
| 'normalized-href'
67+
| 'chunk-hash'
68+
| 'resource-name'
69+
| 'none';
70+
export type QwikPreloadLoadMatchQuality = 'best-effort' | 'none';
71+
72+
export interface QwikPreloadQrlRequestRemembered {
73+
symbol: string;
74+
href?: string;
75+
normalizedHref?: string;
76+
requestedAt: number;
77+
originKind?: QwikPreloadOriginKind;
78+
phase?: QwikPreloadPhase;
79+
matchedEntryId?: number;
80+
}
81+
82+
export interface QwikPreloadEntryRemembered {
83+
id: number;
84+
href: string;
85+
normalizedHref: string;
86+
rel: string;
87+
as: string;
88+
resourceType: string;
89+
status: QwikPreloadStatus;
90+
source: QwikPreloadSource;
91+
originKind: QwikPreloadOriginKind;
92+
phase: QwikPreloadPhase;
93+
discoveredAt: number;
94+
requestedAt?: number;
95+
completedAt?: number;
96+
importDuration?: number;
97+
loadDuration?: number;
98+
duration?: number;
99+
transferSize?: number;
100+
decodedBodySize?: number;
101+
initiatorType?: string;
102+
qrlSymbol?: string;
103+
qrlRequestedAt?: number;
104+
qrlToLoadDuration?: number;
105+
loadMatchQuality?: QwikPreloadLoadMatchQuality;
106+
matchedBy: QwikPreloadMatchMode;
107+
error?: string;
108+
}
109+
110+
export type QwikSsrPreloadSnapshotRemembered =
111+
Partial<QwikPreloadEntryRemembered> &
112+
Pick<QwikPreloadEntryRemembered, 'href'>;
113+
114+
export interface QwikPreloadStoreRemembered {
115+
entries: QwikPreloadEntryRemembered[];
116+
qrlRequests: QwikPreloadQrlRequestRemembered[];
117+
startedAt: number;
118+
clear: () => void;
119+
_id: number;
120+
_initialized: boolean;
121+
_byHref: Record<string, number>;
122+
_byId: Record<number, QwikPreloadEntryRemembered>;
123+
}
124+
49125
export interface DevtoolsRenderStats {
50126
/**
51127
* In-memory performance store written by devtools instrumentation.
@@ -67,6 +143,8 @@ declare global {
67143
* Written by `@devtools/plugin` instrumentation.
68144
*/
69145
__QWIK_PERF__?: QwikPerfStoreRemembered;
146+
__QWIK_PRELOADS__?: QwikPreloadStoreRemembered;
147+
__QWIK_SSR_PRELOADS__?: QwikSsrPreloadSnapshotRemembered[];
70148
}
71149
}
72150

@@ -76,6 +154,7 @@ declare global {
76154
namespace NodeJS {
77155
interface Process {
78156
__QWIK_SSR_PERF__?: QwikPerfEntryRemembered[];
157+
__QWIK_SSR_PRELOADS__?: QwikSsrPreloadSnapshotRemembered[];
79158
__QWIK_SSR_PERF_SET__?: Set<string>;
80159
__QWIK_SSR_PERF_ID__?: number;
81160
__QWIK_SSR_PERF_INDEX__?: Record<string, number>;

0 commit comments

Comments
 (0)