Svelte Framework

SvelteKit

SvelteKit es el framework oficial de aplicaciones para Svelte. Añade enrutamiento basado en archivos, funciones de carga en el servidor, acciones de formulario y adaptadores para desplegar en cualquier lugar.

intermediate14 min readUpdated 15 sept 2026
+page.server.js
js
// src/routes/blog/[slug]/+page.server.js
import { error } from "@sveltejs/kit";

export async function load({ params, fetch }) {
  const res = await fetch(`/api/posts/${params.slug}`);
  if (!res.ok) throw error(404, "Post not found");

  return { post: await res.json() };
}
Basado en
Svelte
Router
Basado en archivos (src/routes)
Datos
load functions
Mutaciones
Form actions
Servidor
Node, serverless, edge
Despliegue
Adaptadores para cualquier objetivo

Por que importa

Por qué SvelteKit es la configuración predeterminada de Svelte

Enrutamiento sin configuración

Las carpetas y archivos especiales definen rutas, layouts, estados de carga y páginas de error sin necesidad de mantener una tabla de rutas.

Carga de datos en el servidor

Las load functions se ejecutan en el servidor o en el edge, por lo que las páginas llegan con los datos ya resueltos.

Adaptadores para cada host

Una misma compilación puede dirigirse a Node, hosting estático, Vercel, Netlify, Cloudflare y más, simplemente cambiando el adaptador.

La imagen completa

Las tres ideas detrás de SvelteKit

Los archivos definen las rutas, las funciones de carga obtienen datos en el servidor y los adaptadores convierten la misma aplicación en cualquier objetivo de despliegue.

El router

Navegación

Los archivos +page, +layout y +server definen páginas, UI compartida y endpoints de API.

Load functions

Datos

Funciones de servidor o universales que obtienen datos antes de que se renderice la página.

Adaptadores

Despliegue

La salida de la compilación se ajusta a la plataforma donde despliegues.

SvelteKit de un vistazo

Qué añade SvelteKit a Svelte

Rutas basadas en archivos

src/routes mapea carpetas y archivos a URLs, incluyendo parámetros dinámicos.

Layouts

Los archivos +layout envuelven las rutas hijas y pueden anidarse para crear estructuras compartidas.

Load functions

Obtienen datos antes del renderizado, ya sea en el servidor o en el navegador.

Form actions

Gestionan el envío de formularios en el servidor con mejora progresiva.

Endpoints de API

Los archivos +server.js exportan manejadores GET, POST y otros métodos HTTP.

Hooks

Ejecutan lógica en cada solicitud para autenticación, logging y locals.

Una breve historia

De Sapper al framework oficial

  1. 2017

    Sapper

    El primer framework de aplicaciones de Svelte introduce el enrutamiento basado en archivos y SSR.

    17
  2. 2020

    Anuncio de SvelteKit

    El sucesor de Sapper se diseña en torno a adaptadores y estándares web.

    20
  3. 2021

    Beta pública

    SvelteKit estabiliza sus APIs de enrutamiento, carga y formularios.

    21
  4. 2022

    SvelteKit 1.0

    El lanzamiento estable se convierte en la forma recomendada de crear aplicaciones Svelte.

    22
  5. Hoy

    Integrado con Svelte 5

    SvelteKit adopta los runes y se mantiene como el framework oficial de aplicaciones.

    Hoy

La guia completa

SvelteKit: Todo lo que necesitas saber

¿Qué es SvelteKit?

SvelteKit es el framework oficial de aplicaciones para Svelte. Mientras que Svelte te proporciona los componentes y la reactividad, SvelteKit añade el enrutamiento, la carga de datos en el servidor, el manejo de formularios, endpoints de API y adaptadores de despliegue. Es la forma recomendada de construir cualquier proyecto más complejo que un simple widget, y se integra de forma natural con Svelte 5.

Si has utilizado Next.js o Nuxt, la estructura te resultará familiar. La diferencia es una fuerte inclinación hacia los estándares web: los formularios, las peticiones y las respuestas son primitivas de la plataforma, y SvelteKit las potencia en lugar de reemplazarlas.

Enrutamiento basado en archivos

Todo reside en src/routes. Las carpetas se convierten en segmentos de la URL y los archivos con nombres específicos definen el comportamiento.

src/routes/
├── +layout.svelte          # shared shell for all routes
├── +page.svelte            # /
├── about/+page.svelte      # /about
├── blog/
│   ├── +page.svelte        # /blog
│   └── [slug]/
│       ├── +page.svelte    # /blog/:slug
│       └── +page.server.js # data for that page
└── api/
    └── posts/+server.js    # GET/POST /api/posts

El prefijo + marca los archivos especiales de SvelteKit. +page.svelte renderiza una página, +layout.svelte envuelve las rutas hijas, +page.server.js proporciona datos exclusivos del servidor y +server.js define un endpoint de API.

Funciones de carga (Load functions)

Las load functions obtienen datos antes de que una página se renderice. Pueden ejecutarse en el servidor, en el navegador o en ambos.

// src/routes/posts/+page.server.js
export async function load({ fetch }) {
  const res = await fetch("/api/posts");
  if (!res.ok) throw error(500, "Failed to load posts");
  return { posts: await res.json() };
}
<!-- src/routes/posts/+page.svelte -->
<script>
  let { data } = $props();
</script>

<ul>
  {#each data.posts as post (post.id)}
    <li>{post.title}</li>
  {/each}
</ul>

Debido a que los datos se resuelven antes del renderizado, el primer paint ya contiene contenido. Usa +page.server.js cuando el código necesite secretos o una base de datos, y +page.js cuando pueda ejecutarse en ambos entornos. Los layouts también pueden tener load functions, y las cargas de los hijos reciben los datos del padre.

Form actions

Los formularios son ciudadanos de primera clase. Una form action se ejecuta en el servidor y gestiona el envío, sin necesidad de realizar un fetch en el lado del cliente.

// src/routes/posts/new/+page.server.js
export const actions = {
  default: async ({ request }) => {
    const data = await request.formData();
    const title = String(data.get("title") ?? "").trim();

    if (!title) {
      return { success: false, error: "Title is required" };
    }

    await db.post.create({ data: { title } });
    return { success: true };
  },
};
<!-- src/routes/posts/new/+page.svelte -->
<script>
  let { form } = $props();
</script>

<form method="POST">
  <input name="title" />
  {#if form?.error}<p class="error">{form.error}</p>{/if}
  <button>Create</button>
</form>

El formulario funciona incluso antes de que JavaScript se cargue, y SvelteKit lo mejora una vez que el cliente está listo. El valor devuelto está disponible en la prop form de la página, por lo que la retroalimentación de la validación es sencilla.

Endpoints de la API

Para las API JSON, un archivo +server.js exporta los handlers de HTTP.

// src/routes/api/posts/+server.js
import { json } from "@sveltejs/kit";

export async function GET() {
  const posts = await db.post.findMany();
  return json(posts);
}

export async function POST({ request }) {
  const body = await request.json();
  const post = await db.post.create({ data: body });
  return json(post, { status: 201 });
}

Estos son objetos Request y Response web ordinarios, por lo que los mismos conocimientos se transfieren a otros runtimes y frameworks.

Hooks

Un archivo hooks.server.js se ejecuta en cada solicitud. Es el lugar ideal para gestionar la autenticación, el registro de logs y poblar event.locals.

// src/hooks.server.js
export async function handle({ event, resolve }) {
  const session = await getSession(event.cookies);
  event.locals.user = session?.user ?? null;

  return resolve(event);
}

Cualquier valor que definas en locals estará disponible para las funciones de carga y las acciones, lo que permite mantener las preocupaciones transversales en un solo lugar en vez de dispersas por todas las rutas.

Renderizado y adaptadores

SvelteKit soporta diversas estrategias de renderizado y te permite elegir una por ruta:

  • SSR renderiza en el servidor e hidrata en el navegador.
  • Prerendering genera HTML estático en tiempo de compilación.
  • CSR renderiza únicamente en el navegador para las rutas que opten por este método.
  • Híbrido combina las tres opciones, permitiendo que una página de marketing sea estática mientras que una ruta de la aplicación se renderice en el servidor.

El despliegue se gestiona mediante adapters. Instala el adapter para tu destino — Node, static, Vercel, Netlify, Cloudflare y más —, configúralo y el mismo código fuente se compilará para esa plataforma. Cambiar de host suele requerir modificar una sola línea de código.

Mejores prácticas

  • Utiliza funciones load de +page.server.js para los datos que deben permanecer en el servidor.
  • Prioriza las form actions sobre las peticiones POST del lado del cliente para las mutaciones.
  • Mantén la autenticación y el registro de logs en hooks.server.js.
  • Elige el modo de renderizado más restrictivo que se ajuste a cada ruta.
  • Utiliza +layout.svelte para la UI compartida, de modo que el estado persista durante la navegación.
  • Define los tipos de los valores de retorno de tus funciones load cuando uses TypeScript.
  • Instala desde el principio un adaptador que coincida con tu entorno de despliegue.

Errores comunes

  • Hacer fetch en onMount y perder el renderizado del servidor.
  • Colocar secretos en un load universal de +page.js en lugar de +page.server.js.
  • Reconstruir formularios con fetch en el cliente cuando las actions ya funcionan.
  • Olvidar asignar claves a los bloques {#each} y romper las actualizaciones de las listas.
  • Hacer prerendering de una ruta que depende de datos específicos del usuario.
  • Ignorar los hooks y duplicar las comprobaciones de autenticación en cada función load.

Próximos pasos

SvelteKit es la forma completa de construir aplicaciones con Svelte. Profundiza tus conocimientos de Svelte, añade TypeScript y compara su arquitectura con Next.js, Nuxt y Astro. Después, construye una aplicación pequeña con una load function, una form action y un API endpoint para ver todo el modelo en acción.

Carga de datos

Una load function se ejecuta en el servidor antes de que la página se renderice. Hacer el fetch en onMount ocurre más tarde y provoca un flash de contenido vacío.

Preferir
// +page.js
export async function load({ fetch }) {
  const res = await fetch("/api/posts");
  return { posts: await res.json() };
}
Evitar
<script>
  import { onMount } from "svelte";
  let posts = [];
  onMount(async () => {
    posts = await fetch("/api/posts")
      .then((r) => r.json());
  });
</script>

Gestión de formularios

Una form action se ejecuta en el servidor y funciona sin JavaScript, y luego se mejora automáticamente cuando JS está disponible.

Preferir
// +page.server.js
export const actions = {
  default: async ({ request }) => {
    const data = await request.formData();
    await createPost(data.get("title"));
  },
};
Evitar
<script>
  async function submit(e) {
    e.preventDefault();
    await fetch("/api/posts", {
      method: "POST",
      body: new FormData(e.target),
    });
  }
</script>

Preguntas frecuentes

Preguntas frecuentes

Keep learning

Related topics from the roadmap.

$ comienza a aprender

Listo para aprender SvelteKit?

Nuestro tutorial interactivo te guia a traves de SvelteKit paso a paso — con quizzes y codigo real que puedes ejecutar en el navegador.