Home / Function/ astroPrefetch() — astro Function Reference

astroPrefetch() — astro Function Reference

Architecture documentation for the astroPrefetch() function in vite-plugin-prefetch.ts from the astro codebase.

Entity Profile

Dependency Diagram

graph TD
  6a380e60_23fd_da7f_b5cc_44cd6752dd4f["astroPrefetch()"]
  7d0db979_04e5_6208_3779_565d025f4ceb["vite-plugin-prefetch.ts"]
  6a380e60_23fd_da7f_b5cc_44cd6752dd4f -->|defined in| 7d0db979_04e5_6208_3779_565d025f4ceb
  style 6a380e60_23fd_da7f_b5cc_44cd6752dd4f fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

packages/astro/src/prefetch/vite-plugin-prefetch.ts lines 9–79

export default function astroPrefetch({ settings }: { settings: AstroSettings }): vite.Plugin {
	const prefetchOption = settings.config.prefetch;
	const prefetch = prefetchOption
		? typeof prefetchOption === 'object'
			? prefetchOption
			: {}
		: undefined;

	// Check against existing scripts as this plugin could be called multiple times
	if (prefetch && settings.scripts.every((s) => s.content !== prefetchCode)) {
		// Inject prefetch script to all pages
		settings.scripts.push({
			stage: 'page',
			content: `import { init } from 'astro/virtual-modules/prefetch.js';init()`,
		});
	}

	// Throw a normal error instead of an AstroError as Vite captures this in the plugin lifecycle
	// and would generate a different stack trace itself through esbuild.
	const throwPrefetchNotEnabledError = () => {
		throw new Error('You need to enable the `prefetch` Astro config to import `astro:prefetch`');
	};

	return {
		name: 'astro:prefetch',
		resolveId: {
			filter: {
				id: new RegExp(`^${VIRTUAL_MODULE_ID}$`),
			},
			handler() {
				if (!prefetch) throwPrefetchNotEnabledError();
				return RESOLVED_VIRTUAL_MODULE_ID;
			},
		},
		load: {
			filter: {
				id: new RegExp(`^${RESOLVED_VIRTUAL_MODULE_ID}$`),
			},
			handler() {
				if (!prefetch) throwPrefetchNotEnabledError();
				return { code: `export { prefetch } from "astro/virtual-modules/prefetch.js";` };
			},
		},
		transform: {
			filter: {
				// NOTE: Handle replacing the specifiers even if prefetch is disabled so View Transitions
				// can import the internal module and not hit runtime issues.
				id: new RegExp(`${prefetchInternalModuleFsSubpath}`),
			},
			handler(code) {
				// We perform a simple replacement with padding so that the code offset is not changed and
				// we don't have to generate a sourcemap. This has the assumption that the replaced string
				// will always be shorter than the search string to work.
				code = code
					.replace(
						'__PREFETCH_PREFETCH_ALL__', // length: 25
						`${JSON.stringify(prefetch?.prefetchAll)}`.padEnd(25),
					)
					.replace(
						'__PREFETCH_DEFAULT_STRATEGY__', // length: 29
						`${JSON.stringify(prefetch?.defaultStrategy)}`.padEnd(29),
					)
					.replace(
						'__EXPERIMENTAL_CLIENT_PRERENDER__', // length: 33
						`${JSON.stringify(settings.config.experimental.clientPrerender)}`.padEnd(33),
					);
				return { code, map: null };
			},
		},
	};
}

Domain

Subdomains

Frequently Asked Questions

What does astroPrefetch() do?
astroPrefetch() is a function in the astro codebase, defined in packages/astro/src/prefetch/vite-plugin-prefetch.ts.
Where is astroPrefetch() defined?
astroPrefetch() is defined in packages/astro/src/prefetch/vite-plugin-prefetch.ts at line 9.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free