or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

examples

edge-cases.mdreal-world-scenarios.md
index.md
tile.json

load-functions.mddocs/reference/

Load Functions

Load functions run before a page is rendered, allowing you to fetch data and return it to the page. They can be universal (running on both server and client) or server-only.

Capabilities

Universal Load Function

Load functions that run on both server and client.

/**
 * Universal load function that runs on server and client
 * Defined in +page.ts or +layout.ts files
 */
type Load<
  Params extends Partial<Record<string, string>> = Partial<Record<string, string>>,
  Data extends Record<string, unknown> | null = Record<string, any> | null,
  ParentData extends Record<string, any> = Record<string, any>,
  OutputData extends Record<string, any> | void = Record<string, any> | void,
  RouteId extends string | null = string | null
> = (event: LoadEvent<Params, Data, ParentData, RouteId>) => OutputData | Promise<OutputData>;

interface LoadEvent<
  Params extends Partial<Record<string, string>> = Partial<Record<string, string>>,
  Data extends Record<string, unknown> | null = Record<string, any> | null,
  ParentData extends Record<string, any> = Record<string, any>,
  RouteId extends string | null = string | null
> {
  fetch: typeof fetch;
  params: Params;
  route: { id: RouteId };
  url: URL;
  /**
   * Contains the data returned by the route's server load function (in +layout.server.js or +page.server.js), if any.
   */
  data: Data;
  /**
   * Returns data from parent +layout.js load functions.
   */
  parent(): Promise<ParentData>;
  depends(...deps: Array<`${string}:${string}`>): void;
  untrack<T>(fn: () => T): T;
  setHeaders(headers: Record<string, string>): void;
  tracing: {
    enabled: boolean;
    root: Span;
    current: Span;
  };
}

Usage Examples:

// src/routes/blog/[slug]/+page.ts
import type { Load } from './$types';

export const load: Load = async ({ fetch, params }) => {
  const response = await fetch(`/api/posts/${params.slug}`);
  const post = await response.json();

  return { post };
};

// Using parent data
export const load: Load = async ({ parent, fetch }) => {
  const { user } = await parent();
  const posts = await fetch(`/api/users/${user.id}/posts`).then(r => r.json());

  return { posts };
};

// Explicit dependencies for invalidation
export const load: Load = async ({ fetch, depends }) => {
  depends('app:posts');

  const posts = await fetch('/api/posts').then(r => r.json());
  return { posts };
};

// Untrack specific reads to prevent reactivity
export const load: Load = async ({ url, untrack }) => {
  const filter = url.searchParams.get('filter');
  // This won't trigger rerun when untracked param changes
  const stable = untrack(() => url.searchParams.get('stable'));

  return { filter, stable };
};

Server Load Function

Server-only load functions with access to server-side resources.

/**
 * Server-only load function with access to cookies, locals, and request
 * Defined in +page.server.ts or +layout.server.ts files
 */
type ServerLoad<
  Params extends Partial<Record<string, string>> = Partial<Record<string, string>>,
  ParentData extends Record<string, any> = Record<string, any>,
  OutputData extends Record<string, any> | void = Record<string, any> | void,
  RouteId extends string | null = string | null
> = (event: ServerLoadEvent<Params, ParentData, RouteId>) => OutputData | Promise<OutputData>;

interface ServerLoadEvent<
  Params extends Partial<Record<string, string>> = Partial<Record<string, string>>,
  ParentData extends Record<string, any> = Record<string, any>,
  RouteId extends string | null = string | null
> extends RequestEvent<Params, RouteId> {
  /**
   * Returns data from parent +layout.server.js load functions.
   */
  parent(): Promise<ParentData>;
  /**
   * Declares that the load function has a dependency on one or more URLs or custom identifiers.
   */
  depends(...deps: string[]): void;
  /**
   * Opt out of dependency tracking for everything synchronously called within the callback.
   */
  untrack<T>(fn: () => T): T;
  /**
   * Access to spans for tracing (available when tracing is enabled).
   */
  tracing: {
    enabled: boolean;
    root: Span;
    current: Span;
  };
}

Usage Examples:

// src/routes/dashboard/+page.server.ts
import { error } from '@sveltejs/kit';
import type { ServerLoad } from './$types';

export const load: ServerLoad = async ({ locals, cookies }) => {
  if (!locals.user) {
    error(401, 'Must be logged in');
  }

  const preferences = cookies.get('preferences');

  return {
    user: locals.user,
    preferences: preferences ? JSON.parse(preferences) : null
  };
};

// Set response headers
export const load: ServerLoad = async ({ setHeaders, fetch }) => {
  const data = await fetch('/api/data').then(r => r.json());

  setHeaders({
    'Cache-Control': 'public, max-age=3600'
  });

  return { data };
};

// Access platform-specific context (e.g., Cloudflare)
export const load: ServerLoad = async ({ platform }) => {
  const kv = platform?.env?.MY_KV_NAMESPACE;
  const value = await kv?.get('key');

  return { value };
};

// Get client IP address
export const load: ServerLoad = async ({ getClientAddress }) => {
  const ip = getClientAddress();
  console.log('Request from:', ip);

  return {};
};

Load Function Return Values

Load functions can return various data structures.

// Return data object
type LoadOutput = Record<string, any> | void;

// Returned data is automatically serialized and passed to page
// Supports: JSON-serializable data, Promises, nested objects

Usage Examples:

// Return plain data
export const load = async () => {
  return {
    title: 'My Page',
    count: 42,
    items: ['a', 'b', 'c']
  };
};

// Return promises (will be awaited)
export const load = async ({ fetch }) => {
  return {
    posts: fetch('/api/posts').then(r => r.json()),
    users: fetch('/api/users').then(r => r.json())
  };
};

// Return void (no data)
export const load = async ({ depends }) => {
  depends('app:reload');
  // No return statement or return nothing
};

Types

interface Cookies {
  get(name: string, opts?: CookieParseOptions): string | undefined;
  getAll(opts?: CookieParseOptions): Array<{ name: string; value: string }>;
  set(name: string, value: string, opts?: CookieSerializeOptions): void;
  delete(name: string, opts?: CookieSerializeOptions): void;
  serialize(name: string, value: string, opts?: CookieSerializeOptions): string;
}

Notes

  • Universal load (+page.ts, +layout.ts):

    • Runs on server during SSR and on client during navigation
    • No access to cookies, locals, or request
    • Use for data that can be fetched from public APIs
  • Server load (+page.server.ts, +layout.server.ts):

    • Only runs on server
    • Has access to cookies, locals, request, platform
    • Use for private data, database queries, API calls with secrets
  • Load function features:

    • fetch: Use this instead of native fetch for correct cookie handling
    • params: Route parameters (e.g., [slug] → params.slug)
    • url: Full URL object with searchParams
    • parent(): Get data from parent layout load functions
    • depends(): Mark custom dependencies for invalidation
    • untrack(): Prevent specific property reads from triggering reruns
    • setHeaders(): Set response headers (server-only)
  • Data returned from load functions:

    • Must be serializable (no functions, classes, etc.)
    • Available in page as data prop
    • Promises are automatically awaited
    • Errors thrown become error pages