Skip to content

Commit c7f23d1

Browse files
committed
refactor(preloader): move into preloader-impl
1 parent 76c42a7 commit c7f23d1

File tree

2 files changed

+76
-56
lines changed

2 files changed

+76
-56
lines changed

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

Lines changed: 71 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import { Fragment, jsx, type JSXNode } from '@builder.io/qwik';
22
import type { ResolvedManifest } from '../optimizer/src/types';
33
import { expandBundles } from './preload-strategy';
4-
import type { PreloaderOptions } from './types';
4+
import type { PreloaderOptions, RenderToStreamOptions, SnapshotResult } from './types';
5+
import { initPreloader } from '../core/preloader/bundle-graph';
6+
import { getPreloadPaths } from './preload-strategy';
57

6-
export function includePreloader(
8+
export const includePreloader = (
79
base: string,
8-
manifest: ResolvedManifest | undefined,
10+
resolvedManifest: ResolvedManifest | undefined,
911
options: PreloaderOptions | boolean | undefined,
1012
referencedBundles: string[],
1113
nonce?: string
12-
): JSXNode | null {
14+
): JSXNode | null => {
1315
if (referencedBundles.length === 0 || options === false) {
1416
return null;
1517
}
@@ -30,9 +32,9 @@ export function includePreloader(
3032

3133
const links = [];
3234

33-
const manifestHash = manifest?.manifest.manifestHash;
35+
const manifestHash = resolvedManifest?.manifest.manifestHash;
3436
if (allowed) {
35-
const expandedBundles = expandBundles(referencedBundles, manifest);
37+
const expandedBundles = expandBundles(referencedBundles, resolvedManifest);
3638
// Keep the same as in getQueue (but *10)
3739
let probability = 4;
3840
const tenXMinProbability = ssrPreloadProbability * 10;
@@ -51,7 +53,7 @@ export function includePreloader(
5153
}
5254
}
5355

54-
const preloadChunk = manifestHash && manifest?.manifest.preloader;
56+
const preloadChunk = manifestHash && resolvedManifest?.manifest.preloader;
5557
if (preloadChunk) {
5658
const insertLinks = links.length
5759
? /**
@@ -117,7 +119,68 @@ export function includePreloader(
117119
}
118120

119121
return null;
120-
}
122+
};
123+
124+
export const preloaderPre = (
125+
base: string,
126+
resolvedManifest: ResolvedManifest | undefined,
127+
options: PreloaderOptions | boolean | undefined,
128+
beforeContent: JSXNode<string>[]
129+
) => {
130+
const preloadChunk = resolvedManifest?.manifest?.preloader;
131+
if (preloadChunk && options !== false) {
132+
const bundleGraph = resolvedManifest?.manifest.bundleGraph;
133+
if (bundleGraph) {
134+
const preloaderOpts: Parameters<typeof initPreloader>[1] =
135+
typeof options === 'object'
136+
? {
137+
debug: options.debug,
138+
preloadProbability: options.ssrPreloadProbability,
139+
}
140+
: undefined;
141+
initPreloader(bundleGraph, preloaderOpts);
142+
}
143+
const core = resolvedManifest?.manifest.core;
144+
beforeContent.push(
145+
jsx('link', { rel: 'modulepreload', href: `${base}${preloadChunk}` }),
146+
jsx('link', {
147+
rel: 'preload',
148+
href: `${base}q-bundle-graph-${resolvedManifest?.manifest.manifestHash}.json`,
149+
as: 'fetch',
150+
crossorigin: 'anonymous',
151+
})
152+
);
153+
if (core) {
154+
beforeContent.push(jsx('link', { rel: 'modulepreload', href: `${base}${core}` }));
155+
}
156+
}
157+
};
158+
159+
export const preloaderPost = (
160+
base: string,
161+
snapshotResult: SnapshotResult,
162+
opts: RenderToStreamOptions,
163+
resolvedManifest: ResolvedManifest | undefined,
164+
output: (JSXNode | null)[]
165+
) => {
166+
if (opts.preloader !== false) {
167+
// skip prefetch implementation if prefetchStrategy === null
168+
const preloadBundles = getPreloadPaths(snapshotResult, opts, resolvedManifest);
169+
// If no preloadBundles, there is no reactivity, so no need to include the preloader
170+
if (preloadBundles.length > 0) {
171+
const result = includePreloader(
172+
base,
173+
resolvedManifest,
174+
opts.preloader,
175+
preloadBundles,
176+
opts.serverData?.nonce
177+
);
178+
if (result) {
179+
output.push(result);
180+
}
181+
}
182+
}
183+
};
121184

122185
function normalizePreLoaderOptions(
123186
input: PreloaderOptions | undefined

packages/qwik/src/server/render.ts

Lines changed: 5 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import type { QContext } from '../core/state/context';
55
import { QInstance } from '../core/util/markers';
66
import type { ResolvedManifest, SymbolMapper } from '../optimizer/src/types';
77
import { getSymbolHash, setServerPlatform } from './platform';
8-
import { includePreloader } from './preload-impl';
9-
import { getPreloadPaths } from './preload-strategy';
8+
import { preloaderPre, preloaderPost } from './preload-impl';
109
import { getQwikLoaderScript } from './scripts';
1110
import type {
1211
QwikManifest,
@@ -18,7 +17,6 @@ import type {
1817
} from './types';
1918
import { createTimer, getBuildBase } from './utils';
2019
import { manifest as builtManifest } from '@qwik-client-manifest';
21-
import { initPreloader } from '../core/preloader/bundle-graph';
2220

2321
const DOCTYPE = '<!DOCTYPE html>';
2422

@@ -127,17 +125,6 @@ export async function renderToStream(
127125
);
128126
}
129127
await setServerPlatform(opts, resolvedManifest);
130-
const bundleGraph = resolvedManifest?.manifest.bundleGraph;
131-
if (bundleGraph) {
132-
const preloaderOpts: Parameters<typeof initPreloader>[1] =
133-
typeof opts.preloader === 'object'
134-
? {
135-
debug: opts.preloader.debug,
136-
preloadProbability: opts.preloader.ssrPreloadProbability,
137-
}
138-
: undefined;
139-
initPreloader(bundleGraph, preloaderOpts);
140-
}
141128

142129
const injections = resolvedManifest?.manifest.injections;
143130
const beforeContent = injections
@@ -165,22 +152,7 @@ export async function renderToStream(
165152
})
166153
);
167154
}
168-
const preloadChunk = resolvedManifest?.manifest?.preloader;
169-
if (preloadChunk && opts.preloader !== false) {
170-
const core = resolvedManifest?.manifest.core;
171-
beforeContent.push(
172-
jsx('link', { rel: 'modulepreload', href: `${buildBase}${preloadChunk}` }),
173-
jsx('link', {
174-
rel: 'preload',
175-
href: `${buildBase}q-bundle-graph-${resolvedManifest?.manifest.manifestHash}.json`,
176-
as: 'fetch',
177-
crossorigin: 'anonymous',
178-
})
179-
);
180-
if (core) {
181-
beforeContent.push(jsx('link', { rel: 'modulepreload', href: `${buildBase}${core}` }));
182-
}
183-
}
155+
preloaderPre(buildBase, resolvedManifest, opts.preloader, beforeContent);
184156

185157
const renderTimer = createTimer();
186158
const renderSymbols: string[] = [];
@@ -201,24 +173,9 @@ export async function renderToStream(
201173
snapshotResult = await _pauseFromContexts(contexts, containerState, undefined, textNodes);
202174

203175
const children: (JSXNode | null)[] = [];
204-
if (opts.preloader !== false) {
205-
// skip prefetch implementation if prefetchStrategy === null
206-
const preloadBundles = getPreloadPaths(snapshotResult, opts, resolvedManifest);
207-
const base = containerAttributes['q:base']!;
208-
// If no preloadBundles, there is no reactivity, so no need to include the preloader
209-
if (preloadBundles.length > 0) {
210-
const prefetchImpl = includePreloader(
211-
base,
212-
resolvedManifest,
213-
opts.preloader,
214-
preloadBundles,
215-
opts.serverData?.nonce
216-
);
217-
if (prefetchImpl) {
218-
children.push(prefetchImpl);
219-
}
220-
}
221-
}
176+
177+
preloaderPost(buildBase, snapshotResult, opts, resolvedManifest, children);
178+
222179
const jsonData = JSON.stringify(snapshotResult.state, undefined, isDev ? ' ' : undefined);
223180
children.push(
224181
jsx('script', {

0 commit comments

Comments
 (0)