Saltar al contenido

Lección 6 de 20 · Lectura y práctica

Implementa load functions para fetch de datos

Concepto claveLas load functions en SvelteKit son funciones especiales que se ejecutan en el servidor (o en el cliente durante la navegación) para cargar datos antes de renderizar una página. Piensa en ellas como el "camarero" de.

Del concepto a la práctica

Taller de esta lección

Una load function debe devolver exactamente los datos que la página necesita y nada sensible. Para una lista, filtra por propietario antes de devolver registros. También conviene definir qué ocurre cuando el origen no responde: un estado de error explícito es más útil que una lista vacía indistinguible de “no hay tareas”.

Ejemplo resuelto

Con estos registros locales, el usuario u1 solo debe recibir dos:

js
const tasks = [
  { id: 'a1', owner: 'u1', title: 'Enviar factura' },
  { id: 'b2', owner: 'u2', title: 'Revisar contrato' },
  { id: 'c3', owner: 'u1', title: 'Cerrar informe' }
];
const visible = tasks.filter(task => task.owner === 'u1');
// visible.length === 2

Añade a ese mismo archivo src/routes/tareas/+page.server.js el contrato real; locals.user debe resolverlo el hook de sesión:

js
import { error } from '@sveltejs/kit';
export function load({ locals }) {
  if (!locals.user) error(401, 'Sesión requerida');
  return { tasks: tasks.filter(t => t.owner === locals.user.id)
    .map(({id,title}) => ({id,title})) };
}

Los tres registros constantes son un fixture público, no un repositorio mutable entre usuarios. Si usas una API, event.fetch permite lecturas dentro de load, pero valida su respuesta y sus permisos; no conviertas un fallo503 en una lista vacía200.

Pruébalo

  1. Define el usuario de sesión en el contexto del servidor.

  2. Filtra por owner antes de construir la respuesta.

  3. Devuelve id y title, pero no secretos internos.

  4. Prueba con u1 y u2 por separado.

Comprueba tu resultado

Error frecuente: devolver todos los registros y filtrar en el componente; corrígelo filtrando en servidor.

Ejercicio: verifica ambos usuarios con los tres registros. Resultado esperado: u1 recibe a1 y c3; u2 recibe solo b2.

Servidor que produce HTML y navegador que lo muestra y gestiona la interacción; claves sensibles permanecen en el servidor.
CursaloMapa de práctica
Dónde se ejecuta cada parte

El servidor puede obtener datos y producir el HTML inicial. El navegador muestra el resultado y ejecuta las interacciones que necesitan estado local. Mantén las claves sensibles en el servidor y define qué parte se ejecuta en cada entorno.

Ver la infografía en tamaño completo ↗

Concepto clave

Las load functions en SvelteKit son funciones especiales que se ejecutan en el servidor (o en el cliente durante la navegación) para cargar datos antes de renderizar una página. Piensa en ellas como el "camarero" de tu aplicación: cuando un cliente llega al restaurante (tu sitio web), el camarero va a la cocina (servidor) a preparar los platos (datos) antes de sentar al cliente en la mesa (renderizar la página).

Esto es fundamental para aplicaciones performantes porque permite que SvelteKit pre-renderice páginas con datos ya disponibles, eliminando el "flash" de contenido vacío que ocurre cuando cargas datos desde el cliente. En el contexto full-stack, las load functions son tu puente entre el frontend y el backend, permitiendo fetch de datos desde APIs, bases de datos, o cualquier fuente externa antes de que el usuario vea la página.

Cómo funciona en la práctica

Para implementar una load function, sigue estos pasos:

  1. Crea un archivo +page.server.js (o +page.server.ts) en la ruta de tu página SvelteKit
  2. Exporta una función llamada load que recibe un objeto con parámetros como params, url, y fetch
  3. La función debe devolver un objeto con los datos que quieres pasar al componente de la página
  4. SvelteKit ejecutará esta función automáticamente y pasará los datos a tu componente mediante la prop data

Veamos un ejemplo básico: supongamos que tienes una página de blog en /blog/[slug]. La load function buscará el post correspondiente al slug antes de renderizar la página.

Código en acción

Primero, el "antes": cómo se haría sin load function (carga de datos en el cliente):

// En +page.svelte (NO RECOMENDADO para datos críticos)
<script>
  import { onMount } from 'svelte';
  let post = null;
  let loading = true;

  onMount(async () => {
    const response = await fetch(`/api/posts/${$params.slug}`);
    post = await response.json();
    loading = false;
  });
</script>

{#if loading}
  <p>Cargando...</p>
{:else}
  <h1>{post.title}</h1>
  <p>{post.content}</p>
{/if}

Ahora, el "después" con load function (carga en servidor):

// En /blog/[slug]/+page.server.js
export async function load({ params, fetch }) {
  const response = await fetch(`https://api.miblog.com/posts/${params.slug}`);
  
  if (!response.ok) {
    return { status: 404, error: 'Post no encontrado' };
  }

  const post = await response.json();
  
  return {
    post,
    meta: { title: post.title, description: post.excerpt }
  };
}

// En +page.svelte
<script>
  export let data;
</script>

<h1>{data.post.title}</h1>
<p>{data.post.content}</p>

Errores comunes

  • No manejar errores en la load function: Siempre verifica el status de las respuestas HTTP y devuelve códigos de error apropiados usando return { status: 404 } o lanzando errores con error() de SvelteKit.
  • Exponer datos sensibles: Recuerda que las load functions se ejecutan en el servidor, pero los datos que devuelven se envían al cliente. Nunca devuelvas contraseñas, tokens privados, o información sensible del servidor.
  • No usar el fetch proporcionado: SvelteKit pasa un fetch especializado a las load functions que mantiene cookies y headers en SSR. Si usas fetch global, perderás esta funcionalidad.
  • Cargas bloqueantes innecesarias: Si una load function hace múltiples fetch independientes, úsalos con Promise.all() para cargarlos en paralelo y mejorar el rendimiento.
  • Olvidar que load functions pueden ejecutarse en cliente: Durante la navegación client-side, las load functions se ejecutan en el navegador. Asegúrate de que tu código funcione en ambos entornos o usa +page.server.js para forzar ejecución solo en servidor.

Checklist de dominio

  • ✓ Sé crear una load function básica en +page.server.js que devuelva datos a un componente
  • ✓ Sé manejar parámetros de ruta (params) y query strings (url.searchParams) en load functions
  • ✓ Sé implementar manejo de errores con códigos HTTP (404, 500) en load functions
  • ✓ Sé usar el fetch especializado que SvelteKit proporciona a las load functions
  • ✓ Sé optimizar múltiples fetch con Promise.all() para cargas paralelas
  • ✓ Sé diferenciar cuándo usar +page.server.js (solo servidor) vs +page.js (servidor y cliente)
  • ✓ Sé pasar metadatos desde load functions para SEO (títulos, descripciones)

Implementa una load function para un dashboard de productos

Vas a crear un dashboard de productos que muestra una lista de productos y estadísticas. Sigue estos pasos:

  1. Crea una nueva ruta en tu proyecto SvelteKit: /src/routes/dashboard/
  2. Dentro de esta ruta, crea un archivo +page.server.js con una load function que:
    • Haga fetch a dos endpoints simultáneamente:
      1) https://api.tutienda.com/products (lista de productos)
      2) https://api.tutienda.com/stats (estadísticas)
    • Use Promise.all() para cargarlos en paralelo
    • Maneje el caso de error: si alguna petición falla, devuelve { status: 500, error: 'Error cargando datos' }
    • Devuelva un objeto con: { products, stats, lastUpdated: new Date().toISOString() }
  3. Crea el componente +page.svelte que:
    • Reciba los datos mediante export let data
    • Muestre la lista de productos en una tabla con nombre, precio y categoría
    • Muestre las estadísticas en tarjetas separadas (total productos, valor promedio, etc.)
    • Muestre la fecha de última actualización
    • Maneje el estado de carga/error apropiadamente
  4. Verifica que la página se renderiza correctamente sin "flash" de contenido vacío
Pistas
  • Recuerda que el fetch que recibe la load function ya está adaptado para SSR. Úsalo en lugar de fetch global.
  • Puedes usar destructuring en Promise.all: const [productsResponse, statsResponse] = await Promise.all([...])
  • Para simular los endpoints, puedes crear archivos JSON locales y servirlos con un endpoint de SvelteKit o usar servicios como JSONPlaceholder.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.

Sigue con SvelteKit Full-Stack: Construye Aplicaciones Web Performantes con Server Actions

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.