Página de Categoría
La página de categoría se encuentra en /pages/c/[...slug].tsx y es responsable de mostrar los productos de una categoría específica. Esta página utiliza Typesense como motor de búsqueda pero implementa los componentes de Algolia para la interfaz de usuario.
1. Prebuild script
El archivo /lib/pre-build/category-prebuild.ts se encarga de generar un archivo JSON con los slugs de las categorías habilitadas durante el proceso de build
Este script:
- Consulta la base de datos Directus para obtener todas las categorías que tienen la propiedad
headlessestablecida comotrue - Extrae los slugs de estas categorías
- Guarda la lista de slugs en un archivo JSON en
_content_cache/category-slugs-enabled.json
2. Ejecución del prebuild
El script se ejecuta durante el proceso de build a través del archivo /lib/prebuild.ts, que carga y ejecuta todos los scripts de prebuild:
3. Middleware para verificación de acceso
En el archivo middleware.ts, se implementa la lógica para verificar si una URL de categoría está habilitada:
Este middleware:
- Importa la lista de slugs habilitados desde
_content_cache/category-slugs-enabled.json - Verifica si la URL solicitada está en esa lista
- Si está habilitada, reescribe la URL a
/category/{slug}para que Next.js la procese - Si no está habilitada, permite que la solicitud continue, lo que probablemente resultará en una página 404 o en una redirección a Magento
Flujo completo
- Durante el build, se ejecuta el script de prebuild que consulta las categorías habilitadas
- Se genera un archivo JSON con los slugs habilitados
- Cuando un usuario solicita una URL con formato de categoría (terminada en .html), el middleware verifica si está en la lista de habilitadas
- Si está habilitada, la solicitud se reescribe y se procesa por la página
/pages/c/[...slug].tsx - Esta página realiza una consulta a DatoCMS/Directus para obtener los datos completos de la categoría
- Se configura el cliente de Typesense y se renderiza la interfaz de usuario con los componentes InstantSearch
Propiedad 'headless' en categorías
La decisión de si una categoría debe mostrarse a través de la aplicación headless se basa en la propiedad headless en el modelo de datos:
- Si
headlessestrue, la categoría se incluirá en la lista de slugs habilitados - Si
headlessesfalseo no está definida, la categoría no se incluirá y las solicitudes a esa URL continuarán al backend de Magento
Esta propiedad permite una migración gradual de categorías desde Magento a la aplicación headless.
Flujo de renderizado
Una vez que se ha determinado que una categoría está habilitada:
- getStaticPaths: Define qué rutas se pre-renderizan durante el build
- getStaticProps: Obtiene los datos de la categoría desde Directus
- El componente CategoryPage renderiza la interfaz utilizando:
- InstantSearch para la estructura de búsqueda
- Configure para los parámetros de búsqueda
- CategoryView para el layout visual
- Typesense como motor de búsqueda subyacente
Estructura de la URL
La página utiliza rutas dinámicas de Next.js con el patrón [...slug], lo que permite capturar cualquier número de segmentos de ruta después de /c/. Por ejemplo:
/c/muebles/c/muebles/sala/c/muebles/sala/sofas
Integración con Directus
La página utiliza el tipo CategoryBySlugQuery para tipar los datos recibidos desde Directus, que incluye:
- Información básica de la categoría (nombre, slug)
- Metadatos (descripción, consulta de Algolia)
- Configuración de filtros
- Banners
- Configuración específica para Typesense
Configuración de Typesense
Configura un cliente de búsqueda utilizando:
typescript import {getNewSearchClient} from "@/utils/typesense"
// En el componente const searchClient = getNewSearchClient('category-page', category.distinctResult)
Estructura de filtros
Los filtros se configuran según el modelo de Directus:
- Filtros individuales: Definidos en el campo
filtersdel modelo de categoría. - Grupos de filtros: Definidos en
filtersGroupspara agrupar filtros relacionados.
Cada filtro incluye:
algoliaFieldName: El nombre del campo en el índice de AlgoliatypesenseFieldName: El nombre del campo en el índice de TypesensedisplayName: El nombre que se muestra al usuariorefinementType: El tipo de refinamiento (lista, rango, etc.)
Componentes principales
La página utiliza varios componentes de Algolia InstantSearch adaptados para funcionar con Typesense:
- InstantSearch: Componente principal que configura el contexto de búsqueda.
- Configure: Configura los parámetros de búsqueda como hits por página y la consulta.
- RefinementList: Muestra listas de valores para los filtros.
- RangeInput: Muestra controles de rango para filtros numéricos.
- Hits: Muestra los resultados de la búsqueda.
- Pagination: Muestra los controles de paginación.
Personalización de la búsqueda
La página permite personalizar la búsqueda mediante varios parámetros:
- algoliaQuery: Consulta personalizada para la categoría.
- hitsPerPage: Número de productos por página.
- customSort: Orden personalizado para los resultados.
- filters: Filtros predefinidos para la categoría.
Navegación entre categorías
La página implementa navegación entre categorías mediante:
subCategoryMenuLink: Enlaces rápidos a subcategorías.
Manejo de SEO
La página implementa configuración SEO utilizando metadatos del modelo de Directus:
- metaDescription: Descripción para los metadatos.
- categoryName: Nombre para el título de la página.
- customImage: Imagen personalizada en el listado de productos
Funcionamiento de URL y rutas
Las rutas de categoría siguen el formato /c/[...slug] o /category/[slug] donde slug puede ser uno o varios segmentos. El middleware procesa estas rutas y las reescribe internamente a /[slug] si la categoría está habilitada.
Optimización de rendimiento
- Caché de resultados: Typesense implementa caché de resultados por 5 segundos.
- Muestreo de facets: Se utiliza para mejorar el rendimiento con conjuntos de datos grandes.
- Paginación: Implementa paginación para no cargar todos los resultados a la vez.
- Limitación de campos: Solo recupera los campos necesarios para mejorar el rendimiento.