Skip to content

Commit 4c51497

Browse files
committed
perf(preloader): init asap
this doesn't seem to interfere with LCP because it's small and async, and it allows listening to qwikloader events sooner.
1 parent c7f23d1 commit 4c51497

File tree

3 files changed

+40
-23
lines changed

3 files changed

+40
-23
lines changed

packages/qwik/src/server/preload-impl.ts

+38-21
Original file line numberDiff line numberDiff line change
@@ -68,28 +68,12 @@ export const includePreloader = (
6868
`document.head.appendChild(e)` +
6969
`});`
7070
: '';
71-
const opts: string[] = [];
72-
if (debug) {
73-
opts.push('d:1');
74-
}
75-
if (maxIdlePreloads) {
76-
opts.push(`P:${maxIdlePreloads}`);
77-
}
78-
if (preloadProbability) {
79-
opts.push(`Q:${preloadProbability}`);
80-
}
81-
const optsStr = opts.length ? `,{${opts.join(',')}}` : '';
8271
// We are super careful not to interfere with the page loading.
8372
const script =
84-
// First we wait for the onload event
85-
`let b=fetch("${base}q-bundle-graph-${manifestHash}.json");` +
8673
insertLinks +
74+
// First we wait for the onload event
8775
`window.addEventListener('load',f=>{` +
88-
`f=_=>{` +
89-
`import("${base}${preloadChunk}").then(({l,p})=>{` +
90-
`l(${JSON.stringify(base)},b${optsStr});` +
91-
`p(${JSON.stringify(referencedBundles)});` +
92-
`})};` +
76+
`f=_=>import("${base}${preloadChunk}").then(({p})=>p(${JSON.stringify(referencedBundles)}));` +
9377
// then we ask for idle callback
9478
`try{requestIdleCallback(f,{timeout:2000})}` +
9579
// some browsers don't support requestIdleCallback
@@ -124,8 +108,9 @@ export const includePreloader = (
124108
export const preloaderPre = (
125109
base: string,
126110
resolvedManifest: ResolvedManifest | undefined,
127-
options: PreloaderOptions | boolean | undefined,
128-
beforeContent: JSXNode<string>[]
111+
options: PreloaderOptions | false | undefined,
112+
beforeContent: JSXNode<string>[],
113+
nonce?: string
129114
) => {
130115
const preloadChunk = resolvedManifest?.manifest?.preloader;
131116
if (preloadChunk && options !== false) {
@@ -140,16 +125,48 @@ export const preloaderPre = (
140125
: undefined;
141126
initPreloader(bundleGraph, preloaderOpts);
142127
}
143-
const core = resolvedManifest?.manifest.core;
128+
129+
const opts: string[] = [];
130+
if (options?.debug) {
131+
opts.push('d:1');
132+
}
133+
if (options?.maxIdlePreloads) {
134+
opts.push(`P:${options.maxIdlePreloads}`);
135+
}
136+
if (options?.preloadProbability) {
137+
opts.push(`Q:${options.preloadProbability}`);
138+
}
139+
const optsStr = opts.length ? `,{${opts.join(',')}}` : '';
140+
141+
const hash = resolvedManifest?.manifest.manifestHash;
142+
143+
const script =
144+
`let b=fetch("${base}q-bundle-graph-${hash}.json");` +
145+
`import("${base}${preloadChunk}").then(({l})=>` +
146+
`l(${JSON.stringify(base)},b${optsStr})` +
147+
`);`;
148+
144149
beforeContent.push(
150+
/**
151+
* We add modulepreloads even when the script is at the top because they already fire during
152+
* html download
153+
*/
145154
jsx('link', { rel: 'modulepreload', href: `${base}${preloadChunk}` }),
146155
jsx('link', {
147156
rel: 'preload',
148157
href: `${base}q-bundle-graph-${resolvedManifest?.manifest.manifestHash}.json`,
149158
as: 'fetch',
150159
crossorigin: 'anonymous',
160+
}),
161+
jsx('script', {
162+
type: 'module',
163+
async: true,
164+
dangerouslySetInnerHTML: script,
165+
nonce,
151166
})
152167
);
168+
169+
const core = resolvedManifest?.manifest.core;
153170
if (core) {
154171
beforeContent.push(jsx('link', { rel: 'modulepreload', href: `${base}${core}` }));
155172
}

packages/qwik/src/server/render.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ export async function renderToStream(
152152
})
153153
);
154154
}
155-
preloaderPre(buildBase, resolvedManifest, opts.preloader, beforeContent);
155+
preloaderPre(buildBase, resolvedManifest, opts.preloader, beforeContent, opts.serverData?.nonce);
156156

157157
const renderTimer = createTimer();
158158
const renderSymbols: string[] = [];

packages/qwik/src/server/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ export interface RenderOptions extends SerializeDocumentOptions {
157157
*/
158158
qwikLoader?: QwikLoaderOptions;
159159

160-
preloader?: PreloaderOptions | boolean;
160+
preloader?: PreloaderOptions | false;
161161

162162
/** @deprecated Use `preloader` instead */
163163
qwikPrefetchServiceWorker?: QwikPrefetchServiceWorkerOptions;

0 commit comments

Comments
 (0)