DocumentaciónGuía para DesarrolladoresIntegración con Strapi v5 y Zonas Dinámicas

Integración con Strapi v5 CMS, Webhooks y Sincronización Automática Sin Terminal

El sistema Strapi v5 CMS es responsable de almacenar la estructura de páginas, configuraciones globales, banners, sliders y artículos de blog.

1. ¿Por qué las rutas de Next.js 16 usan Force-Cache?

En Next.js 16 App Router, todas las solicitudes fetch se almacenan en caché agresivamente por defecto (Force-Cache) para lograr aperturas en milisegundos. Cuando se actualiza contenido en Strapi o Medusa, se utiliza la arquitectura de Revalidación de Caché On-Demand para invalidar y purgar la caché al instante.

2. Guía Paso a Paso para Configurar Webhooks en Strapi CMS

Para que guardar o publicar una página en Strapi purgue de inmediato la caché del frontend sin reiniciar el servidor:

  1. Inicia sesión en Strapi y ve a Settings > Webhooks.
  2. Haz clic en el botón Create new Webhook.
  3. Name: Asigna un nombre claro como Next.js Revalidation Webhook.
  4. URL: Introduce http://storefront:3000/api/revalidate (red interna de Docker) o https://tudominio.com/api/revalidate.
  5. Events: Marca los eventos de Entry (create, update, delete, publish y unpublish).
Configuración de Encabezados de Seguridad y Clave Secreta
En la sección Headers de la configuración del webhook en Strapi:
  • Name: Escribe exactamente x-strapi-secret.
  • Value: Introduce el valor secreto de la variable REVALIDATE_SECRET de tu archivo .env.
  • (Alternativa: Añade la clave secreta como parámetro de consulta en la URL: ?secret=TU_REVALIDATE_SECRET).
  • Validación de Autenticidad: Comprobación de la clave secreta desde el encabezado x-strapi-secret o el parámetro de consulta.
  • Purga Selectiva de Caché: Limpieza de las etiquetas de caché correspondientes al modelo de Strapi (ej. strapi-homepage).

Lista de Verificación de Webhooks Requeridos

Para un funcionamiento óptimo, debes configurar los siguientes webhooks en Strapi, todos con el encabezado x-strapi-secret:

  • 1. Inicio (home-page): URL: /api/revalidate/home-page — Purga la caché de inicio al cambiar la configuración. Eventos: Delete, Publish, Unpublish.
  • 2. Menú (menu): URL: /api/revalidate/menu — Purga la caché del menú de navegación. Nota: No requiere eventos automáticos; al modificar menús, haz clic en el botón Trigger para aplicar cambios.
  • 3. Blog (blog): URL: /api/revalidate/blog — Actualiza la lista y artículos de blog al editar o publicar. Eventos: Delete, Publish.
  • 4. Páginas (pages): URL: /api/revalidate — Webhook genérico para otras colecciones dinámicas según sus etiquetas. Eventos: Create, Update, Delete.
  • 5. Ajustes Globales y Diccionario: URL: /api/revalidate/strapi-settings — Purga inmediata para ajustes globales (colores, estilos) y traducciones. Eventos: Delete, Publish, Unpublish.
Ejemplo de Verificación de Seguridad en Next.js (app/api/revalidate/route.ts)
typescript
import crypto from "node:crypto"
import { revalidateTag } from "next/cache"
import { NextRequest, NextResponse } from "next/server"
function isValidSecret(providedSecret: string | null): boolean {
if (!providedSecret || !process.env.REVALIDATE_SECRET) return false
const actual = new Uint8Array(crypto.createHash("sha256").update(providedSecret).digest())
const expected = new Uint8Array(crypto.createHash("sha256").update(process.env.REVALIDATE_SECRET).digest())
return crypto.timingSafeEqual(actual, expected)
}
export async function POST(request: NextRequest) {
const secret = request.headers.get("x-strapi-secret") || request.nextUrl.searchParams.get("secret")
if (!isValidSecret(secret)) {
return NextResponse.json({ message: "Invalid secret" }, { status: 401 })
}
const body = await request.json()
if (body.model) {
revalidateTag(`strapi-${body.model}`)
}
return NextResponse.json({ revalidated: true, now: Date.now() })
}

3. Estructura de Datos y Mapeo de Dynamic Zones

La matriz de bloques de Strapi se asigna con seguridad de tipos a componentes React según el tipo __component y la variante style.

4. Optimización de Imágenes y Almacenamiento en MinIO S3

Todas las imágenes subidas en Strapi se almacenan en un contenedor MinIO S3 local, se convierten automáticamente a formato WebP y se sirven a gran velocidad a través de Caddy.

API de Despacho para Gestión de Tiendas (Dispatch API)
bash
# Trigger component style sync via Strapi Admin API:
POST /api/storefront/sync-component
{
"componentName": "home/components/ProductShowcase",
"style": "style-2",
"action": "add",
"autoDeploy": false
}
# Trigger batch production build to GitHub Actions:
POST /api/storefront/build

Esta arquitectura aísla por completo los archivos subidos del sistema de archivos del servidor, garantizando máxima seguridad y rendimiento.

5. Consejos de Estabilidad para Entornos de Producción

Mejores Prácticas para la Gestión de Caché en Strapi
Utiliza siempre una clave aleatoria y robusta para REVALIDATE_SECRET. Para evitar purgas prematuras con contenidos en borrador (Draft), activa el webhook únicamente en eventos de publicación.