馃帹 Sysprovider Code
Sysprovider LogoWiki
馃嚜馃嚫Hosting espa帽ol para ecommerce

Headless PrestaShop con Next.js y GraphQL

Actualizado el 15 de marzo de 2026

隆Excelente! Vamos a construir un art铆culo t茅cnico detallado sobre Headless PrestaShop con Next.js y GraphQL, optimizado para SEO y SysAdmins.


Introducci贸n al Ecosistema Headless con PrestaShop

El comercio electr贸nico tradicional, con su arquitectura monol铆tica, est谩 dando paso a modelos m谩s flexibles y potentes. Headless PrestaShop representa la evoluci贸n natural de una de las plataformas de c贸digo abierto m谩s populares del mundo. Al separar el frontend (la capa de presentaci贸n) del backend (la l贸gica de negocio y la base de datos), se abre un abanico de posibilidades en rendimiento, escalabilidad y personalizaci贸n.

En este art铆culo, exploraremos c贸mo construir una tienda headless utilizando Next.js como framework de frontend y GraphQL como capa de comunicaci贸n con PrestaShop. Este stack no solo optimiza la velocidad de carga y la experiencia de usuario (UX), sino que tambi茅n simplifica el mantenimiento y permite integrar funcionalidades modernas como Server-Side Rendering (SSR) y Static Site Generation (SSG).

[INFO] El enfoque headless no modifica el core de PrestaShop. Tu panel de administraci贸n, m贸dulos de pago y l贸gica de negocio siguen intactos. Solo se sustituye el frontend cl谩sico por una aplicaci贸n React/Next.js.


驴Por Qu茅 Elegir Next.js para tu Frontend PrestaShop?

Next.js, el framework de React para producci贸n, ofrece ventajas decisivas para un ecommerce:

  • Rendimiento Superior: Gracias al Server-Side Rendering (SSR) y la generaci贸n de p谩ginas est谩ticas (SSG), las p谩ginas se cargan m谩s r谩pido. Google premia esto con un mejor posicionamiento.
  • SEO Optimizado: A diferencia de una SPA (Single Page Application) tradicional, Next.js renderiza HTML completo en el servidor, permitiendo a los crawlers indexar todo el contenido sin necesidad de JavaScript.
  • Experiencia de Desarrollo Moderna: Hot reloading, routing basado en archivos, soporte nativo para TypeScript y un ecosistema de plugins enorme.
  • Incremental Static Regeneration (ISR): Para cat谩logos de productos que cambian con frecuencia, ISR permite actualizar p谩ginas est谩ticas sin tener que reconstruir todo el sitio.

### Comparativa: Frontend Cl谩sico vs. Headless con Next.js

Caracter铆sticaFrontend Cl谩sico (Smarty)Headless (Next.js + GraphQL)
RendimientoLimitado por el servidor monol铆ticoM谩ximo, con SSR/SSG/ISR
SEOBueno, pero menos controlableExcelente, control total sobre meta tags y estructura
Personalizaci贸nDif铆cil, limitada por el temaIlimitada, con componentes React
EscalabilidadEscalar el monolito es complejoFrontend y backend escalan de forma independiente
MantenimientoActualizaciones de PrestaShop pueden romper el temaEl frontend es independiente, menos riesgo

GraphQL: La Capa de Comunicaci贸n Perfecta para PrestaShop

La API tradicional de PrestaShop (WebService REST) est谩 bien, pero es r铆gida y a menudo devuelve datos que no necesitas (over-fetching) o requiere m煤ltiples llamadas para obtener informaci贸n relacionada (under-fetching). GraphQL PrestaShop resuelve esto de forma elegante.

En lugar de m煤ltiples endpoints, GraphQL expone un 煤nico punto de entrada. Tu frontend de Next.js puede consultar exactamente los datos que necesita en una sola petici贸n.

Ejemplo de consulta GraphQL para obtener productos:

query GetProducts {
  products(pagination: { limit: 10, page: 1 }) {
    items {
      id
      name
      price {
        gross
        currency
      }
      cover {
        url
        alt
      }
      url
    }
    pagination {
      totalItems
      totalPages
      currentPage
    }
  }
}

[TIP] Para habilitar GraphQL en PrestaShop, puedes usar m贸dulos como PrestaShop GraphQL API (de PrestaShop oficial) o PrestashopGraphQL de la comunidad. Ambos exponen un schema completo de tu tienda.


Preparando el Entorno: Requisitos y Configuraci贸n Inicial

Antes de escribir c贸digo, aseg煤rate de tener lo siguiente:

  1. PrestaShop 8.x: Instalado y funcionando. Recomendamos una instalaci贸n limpia.
  2. M贸dulo GraphQL: Instala y configura un m贸dulo GraphQL (ej. prestashop-graphql).
  3. Node.js 18+ y npm/yarn: Para el proyecto Next.js.
  4. Editor de c贸digo: VS Code o similar.

### Configuraci贸n del M贸dulo GraphQL en PrestaShop

  1. Ve a tu panel de administraci贸n de PrestaShop.
  2. Ve a M贸dulos -> Cat谩logo de m贸dulos.
  3. Busca "GraphQL" e instala el m贸dulo oficial de PrestaShop.
  4. Configura el endpoint (normalmente https://tutienda.com/module/graphql/api).
  5. Si tu tienda tiene protecci贸n por token, aseg煤rate de configurarlo en el m贸dulo.

Creando el Proyecto Next.js para tu Headless PrestaShop

Ahora, crearemos la aplicaci贸n Next.js que consumir谩 la API GraphQL de PrestaShop.

### Inicializaci贸n del Proyecto

Abre tu terminal y ejecuta:

npx create-next-app@latest headless-prestashop --typescript --tailwind
cd headless-prestashop

### Instalaci贸n de Dependencias Clave

Necesitamos un cliente GraphQL. urql es ligero y excelente para SSR. Tambi茅n instalaremos graphql para el tipado.

npm install urql graphql

### Configuraci贸n del Cliente GraphQL

Crea un archivo lib/graphql-client.ts:

import { createClient, dedupExchange, fetchExchange } from 'urql';
import { cacheExchange } from '@urql/exchange-graphcache';

const API_URL = process.env.NEXT_PUBLIC_GRAPHQL_ENDPOINT || 'http://localhost:8080/module/graphql/api';

export const client = createClient({
  url: API_URL,
  exchanges: [dedupExchange, cacheExchange, fetchExchange],
  // Si tu API requiere token:
  // fetchOptions: () => ({
  //   headers: { authorization: 'Bearer ' + process.env.GRAPHQL_API_TOKEN },
  // }),
});

[WARNING] Nunca expongas tokens de API en el frontend. Usa variables de entorno con prefijo NEXT_PUBLIC_ solo para datos p煤blicos. Para operaciones sensibles (carrito, login), crea un proxy API en Next.js.


Construyendo Componentes Esenciales: Productos y Categor铆as

Vamos a crear dos componentes clave: una lista de productos y una p谩gina de categor铆a.

### Componente de Lista de Productos

Crea components/ProductList.tsx:

import { useQuery } from 'urql';
import Link from 'next/link';

const PRODUCTS_QUERY = `
  query GetProducts($limit: Int!) {
    products(pagination: { limit: $limit, page: 1 }) {
      items {
        id
        name
        price {
          gross
          currency
        }
        cover {
          url
          alt
        }
        url
      }
    }
  }
`;

interface ProductListProps {
  limit?: number;
}

export default function ProductList({ limit = 8 }: ProductListProps) {
  const [result] = useQuery({ query: PRODUCTS_QUERY, variables: { limit } });
  const { data, fetching, error } = result;

  if (fetching) return <p>Cargando productos...</p>;
  if (error) return <p>Error: {error.message}</p>;

  return (
    <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
      {data.products.items.map((product: any) => (
        <Link key={product.id} href={`/product/${product.id}`}>
          <div className="border rounded-lg p-4 hover:shadow-lg transition-shadow">
            
            <h3 className="text-lg font-semibold">{product.name}</h3>
            <p className="text-gray-700">{product.price.gross} {product.price.currency}</p>
          </div>
        </Link>
      ))}
    </div>
  );
}

### P谩gina de Inicio (Home)

Modifica pages/index.tsx:

import ProductList from '../components/ProductList';

export default function Home() {
  return (
    <div className="container mx-auto px-4 py-8">
      <h1 className="text-3xl font-bold mb-8">Headless PrestaShop con Next.js</h1>
      <ProductList limit={12} />
    </div>
  );
}

Optimizaci贸n y Rendimiento: SSR, SSG e ISR

El verdadero poder de Next.js PrestaShop reside en las estrategias de renderizado.

### Server-Side Rendering (SSR) para P谩ginas Din谩micas

Para una p谩gina de producto que necesita datos en tiempo real (stock, precio), usa getServerSideProps:

// pages/product/[id].tsx
import { client } from '../../lib/graphql-client';
import { gql } from 'urql';

const PRODUCT_QUERY = gql`
  query GetProduct($id: Int!) {
    product(id: $id) {
      id
      name
      description
      price { gross }
      images { url }
    }
  }
`;

export async function getServerSideProps(context: { params: { id: string } }) {
  const { id } = context.params;
  const result = await client.query(PRODUCT_QUERY, { id: parseInt(id) }).toPromise();
  return { props: { product: result.data.product } };
}

export default function ProductPage({ product }: any) {
  return (
    <div>
      <h1>{product.name}</h1>
      <div dangerouslySetInnerHTML={{ __html: product.description }} />
      <p>Precio: {product.price.gross}</p>
    </div>
  );
}

### Static Site Generation (SSG) + ISR para Cat谩logos

Para categor铆as con muchos productos, genera p谩ginas est谩ticas en build time y actual铆zalas peri贸dicamente con ISR:

// pages/category/[slug].tsx
export async function getStaticProps(context: { params: { slug: string } }) {
  // ... consulta GraphQL para obtener productos de la categor铆a
  return {
    props: { products: data.products.items },
    revalidate: 60, // ISR: regenera la p谩gina cada 60 segundos si hay solicitudes
  };
}

export async function getStaticPaths() {
  // ... consulta GraphQL para obtener todas las categor铆as
  const paths = data.categories.items.map((cat: any) => ({ params: { slug: cat.slug } }));
  return { paths, fallback: 'blocking' };
}

[INFO] Con fallback: 'blocking', las p谩ginas de categor铆as nuevas se renderizan bajo demanda y se almacenan en cach茅 para futuras visitas. Esto es ideal para cat谩logos en crecimiento.


Gesti贸n del Carrito y Autenticaci贸n (Pistas)

Un ecommerce real necesita carrito y login. Aqu铆 hay un enfoque pr谩ctico:

  1. API Routes de Next.js: Crea rutas en pages/api/cart/add.ts para actuar como proxy.
  2. Tokens de Sesi贸n: Cuando un usuario inicia sesi贸n en PrestaShop (a trav茅s de GraphQL), obtienes un token. Almac茅nalo en una cookie HTTP-only.
  3. Operaciones de Carrito: Las mutaciones GraphQL para a帽adir/quitar productos deben incluir el token de sesi贸n en el header.

Ejemplo de mutaci贸n para a帽adir al carrito:

mutation AddToCart($productId: Int!, $quantity: Int!) {
  addToCart(input: { productId: $productId, quantity: $quantity }) {
    id
    total
    items {
      product { name }
      quantity
    }
  }
}

Consideraciones de Seguridad y Buenas Pr谩cticas

  • Protege tu Endpoint GraphQL: No expongas tu endpoint p煤blico directamente. Configura un proxy inverso (Nginx, Cloudflare) para limitar peticiones o a帽adir autenticaci贸n b谩sica.
  • Validaci贸n de Datos: Siempre valida los datos en el backend de PrestaShop, no conf铆es solo en el frontend.
  • Rate Limiting: Implementa l铆mites de peticiones para evitar abusos.
  • HTTPS: Obligatorio tanto en el frontend como en el backend.
  • Monitorizaci贸n: Usa herramientas como Sentry para errores y Lighthouse para rendimiento.

[WARNING] Nunca ejecutes l贸gica de negocio sensible (c谩lculos de impuestos, descuentos) en el frontend. Siempre debe hacerse en PrestaShop.


Conclusi贸n: 驴Merece la Pena el Cambio?

Implementar Headless PrestaShop con Next.js y GraphQL no es un proyecto trivial, pero las recompensas son enormes:

  • Velocidad de carga excepcional: Mejora el Core Web Vitals y la experiencia de usuario.
  • Flexibilidad de dise帽o: Libertad total para crear experiencias de compra 煤nicas.
  • Escalabilidad independiente: Puedes escalar tu frontend y backend por separado seg煤n la demanda.
  • Preparaci贸n para el futuro: Este stack es moderno, tiene una comunidad enorme y es mantenido activamente.

Si tu tienda actual sufre por lentitud, tienes problemas de personalizaci贸n o quieres diferenciarte de la competencia, este es el camino. Empieza con un prototipo, migra una categor铆a de prueba y mide los resultados. Te sorprender谩 la diferencia.

[TIP] Para proyectos m谩s peque帽os, considera soluciones h铆bridas (ej. usar Next.js solo para el cat谩logo y mantener el frontend cl谩sico para el checkout). Reduce el riesgo y el esfuerzo inicial.

驴Necesitas ayuda?Son dos de nuestros t茅cnicos, Agust铆n y Mikel, y est谩n disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agust铆n y Mikel