Concepto clave
En SvelteKit, el estado global se refiere a datos que necesitan ser accesibles desde múltiples componentes sin tener que pasarlos explícitamente a través de props. Imagina que estás construyendo una aplicación de comercio electrónico: el carrito de compras debe estar disponible en la página de productos, en el encabezado y en la página de pago. Pasar el carrito como prop a través de toda la jerarquía de componentes sería engorroso y propenso a errores.
La autenticación en SvelteKit se maneja típicamente mediante cookies o tokens, con Server Actions que verifican credenciales en el servidor antes de permitir el acceso a rutas protegidas. Piensa en esto como un guardia de seguridad en un edificio: verifica tu identidad antes de dejarte entrar a áreas restringidas.
La optimización implica técnicas como code splitting, lazy loading y caching para asegurar que tu aplicación cargue rápido y responda de manera eficiente, similar a cómo un restaurante organiza su cocina para servir platos rápidamente sin sacrificar calidad.
Cómo funciona en la práctica
Para implementar estado global en SvelteKit, puedes usar stores de Svelte. Primero, crea un store en un archivo separado (por ejemplo, stores.js). Luego, importa este store en cualquier componente que necesite acceder o modificar el estado. Por ejemplo, un store para el tema de la aplicación permitiría que todos los componentes sepan si el modo oscuro está activado.
La autenticación se configura en hooks de SvelteKit. En src/hooks.server.js, puedes verificar la sesión del usuario en cada solicitud y decidir si permitir el acceso a ciertas rutas. Las Server Actions se usan para manejar el inicio de sesión y cierre de sesión, procesando formularios en el servidor de manera segura.
La optimización se logra mediante la configuración de SvelteKit, como usar export const prerender = true para páginas estáticas o implementar lazy loading para componentes pesados que no se necesitan inmediatamente.
Codigo en accion
Ejemplo de un store para estado global de autenticación:
// src/lib/stores/authStore.js
import { writable } from 'svelte/store';
export const user = writable(null);
export async function login(email, password) {
const response = await fetch('/api/auth/login', {
method: 'POST',
body: JSON.stringify({ email, password })
});
const data = await response.json();
if (data.user) {
user.set(data.user);
}
return data;
}
export function logout() {
user.set(null);
fetch('/api/auth/logout', { method: 'POST' });
}Ejemplo de una Server Action para autenticación:
// src/routes/api/auth/login/+server.js
export async function POST({ request, cookies }) {
const { email, password } = await request.json();
// Verificar credenciales en una base de datos
const user = await db.getUserByEmail(email);
if (user && await verifyPassword(password, user.passwordHash)) {
const sessionId = generateSessionId();
cookies.set('sessionId', sessionId, { path: '/', httpOnly: true });
await db.saveSession(sessionId, user.id);
return new Response(JSON.stringify({ user: { id: user.id, email: user.email } }), {
status: 200
});
}
return new Response(JSON.stringify({ error: 'Credenciales inválidas' }), {
status: 401
});
}Errores comunes
- Almacenar datos sensibles en el store del cliente: Los stores en el cliente son accesibles desde las herramientas de desarrollo. Nunca guardes tokens o contraseñas aquí; usa cookies seguras o almacenamiento en el servidor.
- No proteger rutas en el servidor: Incluso si ocultas elementos en el cliente, los usuarios pueden acceder a rutas directamente. Siempre verifica la autenticación en hooks o load functions del servidor.
- Sobrecargar el estado global: No todo debe ir en un store global. Usa props para datos que solo se necesitan en componentes hijos directos, para mantener el código simple y eficiente.
- Ignorar la optimización de imágenes y assets: Imágenes grandes pueden ralentizar tu aplicación. Usa formatos modernos como WebP y configura lazy loading para mejorar el rendimiento.
- No manejar estados de carga y error: Cuando usas Server Actions, muestra indicadores de carga y mensajes de error amigables para mejorar la experiencia del usuario.
Checklist de dominio
- Puedo crear y usar un store de Svelte para estado global en una aplicación real.
- Implemento autenticación con Server Actions y protejo rutas en el servidor.
- Uso hooks de SvelteKit para manejar sesiones y autorización.
- Aplico técnicas de optimización como code splitting y lazy loading en mis proyectos.
- Manejo adecuadamente errores y estados de carga en operaciones asíncronas.
- Evito errores comunes como almacenar datos sensibles en el cliente.
- Puedo explicar la diferencia entre estado local, estado global y autenticación en SvelteKit.
Implementa un sistema de carrito de compras con autenticación y optimización
En este ejercicio, construirás un carrito de compras para una aplicación de comercio electrónico usando SvelteKit. Sigue estos pasos:
- Crea un store global en
src/lib/stores/cartStore.jsque maneje los items del carrito (id, nombre, precio, cantidad). Incluye funciones para agregar, eliminar y actualizar items. - Implementa una ruta protegida
/checkoutque solo usuarios autenticados puedan acceder. Usa un hook ensrc/hooks.server.jspara verificar una cookie de sesión. - Crea una Server Action en
src/routes/api/cart/add/+server.jsque agregue items al carrito y actualice el store. Asegúrate de validar los datos en el servidor. - Optimiza la carga de la página de productos usando
export const prerender = truepara productos estáticos y lazy loading para imágenes grandes. - Agrega un indicador de carga cuando se agreguen items al carrito y maneja errores si la Server Action falla.
- Usa
writablede Svelte para el store ygetpara acceder a su valor en componentes. - En el hook, verifica la cookie y redirige a /login si no hay sesión válida.
- Para lazy loading de imágenes, usa el atributo
loading="lazy"en etiquetas img.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.