La llegada de Next.js 15 y React 19 redefine la construcción de paneles SaaS multi-tenant. La arquitectura híbrida entre Server Components (RSC) y Server Actions permite mantener los bundles de JavaScript en el cliente por debajo de los 100kB, mejorando drásticamente el índice Largest Contentful Paint (LCP).
# 1. Server Actions Tipadas con Validación Zod
En lugar de mantener docenas de endpoints API REST con boilerplate repetitivo, las Server Actions permiten ejecutar lógica de negocio directamente en el servidor con seguridad criptográfica en los tokens de sesión.
'use server';
import { z } from 'zod';
import { db } from '@/lib/db';
import { verifyTenantAccess } from '@/lib/auth';
const ConfigSchema = z.object({
tenantId: z.string().uuid(),
companyName: z.string().min(3).max(100),
timezone: z.string().default('America/Lima'),
});
export async function updateTenantConfig(formData: FormData) {
const session = await verifyTenantAccess();
const parsed = ConfigSchema.safeParse({
tenantId: session.tenantId,
companyName: formData.get('companyName'),
timezone: formData.get('timezone'),
});
if (!parsed.success) {
return { success: false, errors: parsed.error.flatten() };
}
await db.tenant.update({
where: { id: parsed.data.tenantId },
data: { name: parsed.data.companyName, timezone: parsed.data.timezone },
});
return { success: true };
}# 2. Estrategia de Caché Granular con revalidateTag
Next.js 15 sustituye la sobre-caché de versiones previas por un modelo predeterminado de 'no-store' salvo que se declare explícitamente. Usamos etiquetas de caché (`cacheTag`) para invalidar únicamente los datos del cliente que realizó la mutación, conservando la caché compartida de catálogos públicos.
- Cero llamadas a API no deseadas en transiciones de navegación instantáneas.
- Compatibilidad nativa con streaming parcial de componentes pesados (PPR).
- Renderizado estático generado en compilación para páginas de portafolio y tienda.