Headless PrestaShop con Next.js y GraphQL
隆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铆stica | Frontend Cl谩sico (Smarty) | Headless (Next.js + GraphQL) |
|---|---|---|
| Rendimiento | Limitado por el servidor monol铆tico | M谩ximo, con SSR/SSG/ISR |
| SEO | Bueno, pero menos controlable | Excelente, control total sobre meta tags y estructura |
| Personalizaci贸n | Dif铆cil, limitada por el tema | Ilimitada, con componentes React |
| Escalabilidad | Escalar el monolito es complejo | Frontend y backend escalan de forma independiente |
| Mantenimiento | Actualizaciones de PrestaShop pueden romper el tema | El 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) oPrestashopGraphQLde 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:
- PrestaShop 8.x: Instalado y funcionando. Recomendamos una instalaci贸n limpia.
- M贸dulo GraphQL: Instala y configura un m贸dulo GraphQL (ej.
prestashop-graphql). - Node.js 18+ y npm/yarn: Para el proyecto Next.js.
- Editor de c贸digo: VS Code o similar.
### Configuraci贸n del M贸dulo GraphQL en PrestaShop
- Ve a tu panel de administraci贸n de PrestaShop.
- Ve a M贸dulos -> Cat谩logo de m贸dulos.
- Busca "GraphQL" e instala el m贸dulo oficial de PrestaShop.
- Configura el endpoint (normalmente
https://tutienda.com/module/graphql/api). - 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:
- API Routes de Next.js: Crea rutas en
pages/api/cart/add.tspara actuar como proxy. - 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.
- 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.
