Spoosh
Plugins

Prefetch

Preload data before it's needed

The prefetch plugin lets you load data ahead of time, so it's ready when the user navigates.

Installation

npm install @spoosh/plugin-prefetch

Usage

import { Spoosh } from "@spoosh/core";
import { prefetchPlugin } from "@spoosh/plugin-prefetch";
import { cachePlugin } from "@spoosh/plugin-cache";

const spoosh = new Spoosh<ApiSchema, Error>("/api").use([
  prefetchPlugin(),
  cachePlugin({ staleTime: 5000 }),
]);

const { useRead, useWrite, prefetch } = create(spoosh);

Basic Prefetch

// Prefetch data
await prefetch((api) => api("posts").GET());

// Prefetch with query parameters
await prefetch((api) => api("posts").GET({ query: { page: 1, limit: 10 } }));

Prefetch with Options

Pass plugin options as the second argument:

await prefetch((api) => api("users/:id").GET({ params: { id: userId } }), {
  staleTime: 60000,
  retry: { retries: 3 },
});

Prefetch on Hover

A common pattern is prefetching when the user hovers over a link:

<Link
  href="/posts/1"
  onMouseEnter={() => prefetch((api) => api("posts/:id").GET({ params: { id: 1 } }))}
>
  View Post
</Link>

Prefetch on Route Change

Prefetch data before navigating:

async function handleNavigation(postId: number) {
  await prefetch((api) => api("posts/:id").GET({ params: { id: postId } }));
  router.push(`/posts/${postId}`);
}

In-Flight Deduplication

Multiple calls to prefetch the same data will return the same promise, avoiding duplicate network requests. This is built into the prefetch plugin - no deduplication plugin required.

// These will only make ONE network request
prefetch((api) => api("posts").GET());
prefetch((api) => api("posts").GET());
prefetch((api) => api("posts").GET());

Custom Tags

By default, a tag is auto-generated from the resolved path. You can override with custom tags:

// Auto-generated tag (default)
await prefetch((api) => api("users/:id/posts").GET({ params: { id: "123" } }));
// → tag: "users/123/posts"

// Single custom tag
await prefetch((api) => api("posts").GET(), {
  tags: "my-posts",
});
// → tag: "my-posts"

// Multiple custom tags
await prefetch((api) => api("posts").GET(), {
  tags: ["posts", "dashboard"],
});
// → tags: ["posts", "dashboard"]

Options

Plugin Config

OptionTypeDefaultDescription
staleTimenumber-Default stale time for prefetched data (ms)
timeoutnumber30000Timeout to auto-clear stale promises (ms). Prevents memory leaks from requests that never settle.

Prefetch Options

The second argument accepts any plugin options plus:

OptionTypeDescription
tagsstring | string[]Custom tags (overrides auto-generated tag)

On this page