Cómo verifiqué que el prerenderizado sí funciona en producción: el caso Alem Automotores
¿Cómo se distingue, desde afuera, un prerenderizado que funciona de uno que no, sin acceso al código?
Por Pietro Fiorillo ·
Índice del artículo
Por qué revisé este proyecto después de encontrar un problema en otro similar
Después de verificar que el prerenderizado por ruta de AV Automotores no estaba funcionando en producción, quise revisar un proyecto del mismo tipo (SPA en React con Firestore, catálogo de vehículos) para confirmar si el problema era del patrón de arquitectura en general o específico de ese caso.
Lo que encontré: una ficha de vehículo real, no un shell genérico
Pedí con curl -sL la URL de un Audi A3 2010 listada en el sitemap público del sitio. A diferencia de lo que encontré en AV Automotores, la respuesta tenía un <title> específico del vehículo (con año y precio incluidos), un <link rel="canonical"> que apunta a esa misma URL, y un bloque <script type="application/ld+json"> real.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Audi A3 2010",
"brand": { "@type": "Brand", "name": "Audi" },
"offers": {
"@type": "Offer",
"priceCurrency": "USD",
"price": 8800,
"availability": "https://schema.org/InStock"
}
}Vale la pena precisar algo: Schema.org tiene un tipo Vehicle más específico que Product, y la documentación original de este proyecto mencionaba «schema markup para organización, breadcrumbs y reviews» sin especificar cuál. Lo que encontré en esta ficha es Product con Offer y Brand, que Google interpreta correctamente para precio y disponibilidad, aunque no sea el tipo más específico posible. Prefiero corregir esta imprecisión acá en vez de dejarla.
Un detalle real que podría explicar un LCP más lento de lo esperado
El catálogo de este proyecto es más chico que el de otros similares (31 URLs en el sitemap, contra 171 de otro proyecto de la misma categoría), así que esperaba un Lighthouse más alto. No fue el caso: 45 sobre 100 en móvil, con un LCP de 12,5 segundos.
Revisando el HTML, encontré que las URLs de las imágenes de vehículo tienen espacios sin codificar: https://automotoresalem877.com/vehicles/autos/Audi A3 2010/1.png, en vez de %20 en lugar de los espacios. No puedo confirmar que esto sea la causa principal del LCP sin perfilar el navegador a fondo, pero es un detalle técnico real y observable, no una especulación sin base.
Resultados medibles
| Métrica | Resultado | Entorno / evidencia |
|---|---|---|
| Lighthouse Performance (móvil, lab) | 45 / 100 | Lighthouse 13.5.0, throttling simulado |
| LCP (lab) | 12,5 s | Misma medición Lighthouse, no es un dato de campo (CrUX) |
| URLs en el sitemap | 31 | sitemap.xml público, confirmado con curl |
| Title y canonical por vehículo | Confirmado, único por ruta | Verificado en la ficha de Audi A3 2010 |
La diferencia entre un patrón que funciona y uno que no, muchas veces no está en la arquitectura elegida, está en si alguien verificó que siguiera corriendo.
Mi participación en este proyecto
Mi participación en Alem Automotores incluyó la migración del catálogo a Firestore, el panel admin y el SEO técnico del sitio, como parte de mi trabajo en MANYA Digital.
Lo que haría distinto: una precisión pendiente sobre el tipo de schema
La descripción original de este proyecto no especificaba el tipo exacto de Schema.org usado. Ya la actualicé para reflejar lo que confirmé en producción: Product, Offer y Brand, no Vehicle. Es una corrección menor comparada con otras de esta serie, pero la misma regla aplica: si lo puedo verificar, lo preciso.
Qué probaría después
Si tuviera acceso al repositorio, codificaría correctamente las URLs de imagen (reemplazando los espacios por %20) como primer paso antes de buscar causas más complejas para el LCP lento, y evaluaría si vale la pena migrar el JSON-LD de Product a Vehicle para ser más específico.
Fuentes
Preguntas frecuentes
¿Por qué el JSON-LD usa Product en vez de Vehicle?
Schema.org tiene un tipo Vehicle más específico, pero Product (con Offer y Brand) también es válido y Google lo entiende bien para fichas con precio y disponibilidad. No es un error, es una elección distinta a la que mencioné en la documentación original del proyecto, y prefiero corregirlo acá en vez de dejarlo impreciso.
¿Por qué el LCP es tan lento si el sitio es chico?
No lo sé con certeza sin perfilar el navegador a fondo, pero encontré un detalle técnico real: las URLs de imagen en el HTML tienen espacios sin codificar (/Audi A3 2010/1.png en vez de %20). Es el tipo de detalle que vale la pena revisar antes de buscar explicaciones más complejas.
¿Esto contradice lo que escribiste sobre AV Automotores?
Al contrario, lo confirma: los dos proyectos usan un enfoque similar (SPA con prerenderizado), pero acá el prerenderizado sí está funcionando. Es la prueba de que el patrón funciona cuando se ejecuta correctamente, no de que el patrón en sí sea el problema.
¿Cómo verificaste esto sin acceso al repositorio?
Pedí con curl una URL real del sitemap público y leí el HTML completo que devuelve, exactamente lo que vería un crawler que no ejecuta JavaScript. No necesité el código para confirmar que el title, el canonical y el JSON-LD son reales y específicos de ese vehículo.
¿El sitemap de este proyecto está completo?
Tiene 31 URLs, consistente con un catálogo más chico que el de otros proyectos similares. No encontré URLs rotas ni duplicadas en la muestra que revisé.
¿Cuánto cuesta mantener un catálogo así?
El hosting de una SPA estática con Firestore es bajo. El costo real está en cargar fotos y datos de cada vehículo desde el panel admin, y en el tiempo de revisar periódicamente detalles técnicos como la codificación de URLs de imagen.