El SEO en las SPA es imposible ?

En mi artículo podrás obtener una opinión sincera e información obtenida con una síntesis de todas las fuentes de información consultadas. 

Mucho he leído sobre SEO, sobre SEO ORGANICO, sobre SEO DE PAGO, sobre BACKLINKS, LINKS internos. En Youtube puedes obtener abundante información de gurús, youtubers que desean atraer más atención hacia sus proyectos, información que una y otra vez te repiten muchas recetas casi iguales, con matices y actualizaciones según la evolución de los buscadores.

Las buenas prácticas siempre tienen su recompensa pero la prisa por obtener buenos resultados es el gran problema de muchos proyectos. No confíes en agencias o responsables de SEO que te aseguren un resultado inmediato y todavía no hemos entrado a clasificar los distintos nichos, no es igual un ecommerce que una web de un artista, fotógrafo, artesano,...etc.

El SEO DE PAGO habitualmente se produce a través de la prisa, pagar por anuncios, comprar BACKLINS (muy mala práctica), la idea del fracaso nos lleva a acelerar el proceso. Pero esto lleva aparejado cometer muchos errores como invertir un gran presupuesto en promoción, confiar en plataformas que no puedes controlar y que en un momento pueden bloquear todo tu esfuerzo.

El SEO ORGANICO se produce a partir del esfuerzo y la paciencia, aplicando recetas, mejorando los ajustes y sobre todo armándose de paciencia. Es fundamental no perder el objetivo final y aprender cada día, no me considero un experto en SEO pero estudiar toda la información que cae en mis manos, me indica que este es el camino correcto. 

La Payasa


Cuando contratas una plataforma para configurar tu página web, habitualmente ya incorporan una serie de utilidades o plugins, o es posible incorporarlas para mejorar tu visibilidad en internet. La comercialización de plugins permiten monetizar los desarrollos alrededor de plataformas y este aspecto facilita acelerar y limitar el presupuesto en implantación de un proyecto. Habitualmente las actualizaciones de estos plugins son constantes, pueden realizarse de forma automática sin nuestra atención y pueden provocar alguna incidencia.

Cuando contratas el desarrollo de una página web te enfrentas a varias tecnologías, pero fundamentalmente hablaremos de SSR ( Server-Side Rendering ) o SPA ( Single Page Application )

SSR crea dinámicamente la página web desde el servidor web y solo mostrará el resultado, lo que es muy útil para los buscadores, aunque cada nueva página se debe solicitar al servidor. Ha sido la tecnología más habitual y todavía hoy día es la más extendida.

SPA también crea la página web dinámicamente pero en el cliente, este tipo de tecnología no solicita nuevas páginas al servidor, solo descargará los módulos que necesita para recrear la página web en el cliente y solicitará los datos necesarios a partir del servidor o una API. Los buscadores pueden tener alguna dificultad en leer este tipo de páginas, sobre todo si no se renderizan en un tiempo mínimo, ya que los robots tienen un tiempo limitado para realizar las lecturas. 

En todos los casos es importante configurar adecuadamente los ficheros ROBOTS.TXT y SITEMAP.XML y facilitar la lectura por los robots, pero son mucho más importantes en el caso de SPA. Las SPA son el objeto de este artículo ya que la mayoría de las referencias indican que son inadecuadas para realizar un buen SEO.

Las webs desarrolladas como SPA facilitan la impresión del usuario de responder de forma inmediata además de limitar las solicitudes al servidor y mejorar la respuesta en dispositivos móviles.  La combinación de una SPA ligera y una API eficiente garantiza una experiencia de usuario rápida y fluida.

Otras ventajas :

  • Escalabilidad Horizontal: La arquitectura desacoplada permite escalar tanto el frontend (añadiendo más servidores para servir la aplicación) como el backend (escalando la API y la base de datos) de forma independiente según la demanda.
  • Adaptabilidad y Flexibilidad: La modularidad tanto en el frontend como en el backend facilita la incorporación de nuevas funcionalidades y la adaptación a diferentes tipos de productos y servicios sin afectar la estabilidad del núcleo de la aplicación.
  • Mantenimiento Simplificado: La separación de capas facilita la identificación y resolución de problemas, así como la implementación de actualizaciones.

El framework seleccionado para este proyecto ha sido QUASAR v2 que dispone de recursos como 'useMeta' que facilita :

  • Gestión Dinámica de Metadatos: Actualización de títulos, descripciones y etiquetas meta en función del contenido dinámico de la página implementando fecha de actualización de datos.
  • Generación de Sitemap XML Dinámico: Para asegurar la correcta indexación de todas las URLs se genera varios ficheros xml desde la API, ya que la SPA solo se sirve como frontend. También se generan de forma automática ficheros markdown LLMS.TXT una estrategia centrada en la Generación y Extracción Óptima de información para los modelos de lenguaje grandes (LLMs) y otros crawlers de IA.
  • Implementación de Schema Markup: Para proporcionar información estructurada a los motores de búsqueda sobre los productos y la empresa.
  • Url's combinadas con códigos y slugs: Se muestran dinámicamente o bien crean una dirección desde sitemap.xml. 

Desarrollando tres web ecommerce con la tecnología SPA he aplicado dinámicamente todos estos puntos y este ha sido el resultado.

universofiesta.com

 Si tienes la precaución de explorar las páginas creadas dinámicamente desde este apartado de código :  

const metaData = computed(() => ({
      title: `${config.value.TITLE.slice(0, 69)}`,
      meta: {
        description: {
          name: 'description',
          content: `${config.value.META_DESCRIPTION.slice(0, 150)}`,
        },
        keywords: {
          name: 'keywords',
          content: `${config.value.META_KEYWORDS}`,
        },
        twitterTitle: {
          name: 'twitter:title',
          content: `${config.value.META_KEYWORDS}`,
        },
        twitterDescription: {
          name: 'twitter:description',
          content: `${config.value.META_DESCRIPTION.slice(0, 150)}`,
        },
        twitterCard: { name: 'twitter:card', content: 'product' },
        ogLocale: {
          property: 'og:locale',
          content: import.meta.env.VITE_DEFAULT_LOCALE,
        },
        ogTitle: {
          property: 'og:title',
          content: `${config.value.TITLE.slice(0, 69)}`,
        },
        ogDescription: {
          property: 'og:description',
          content: `${config.value.META_DESCRIPTION.slice(0, 150)}`,
        },
        robots: {
          name: 'robots',
          content: 'index, follow',
        },
      },
      link: {
        canonical: {
          rel: 'canonical',
          href: `${window.location.origin}${isHashMode ? '/#' : ''}${
            route.fullPath
          }`,
        },
      },
    }));
podrás ver las etiquetas TITLE, DESCRIPTION, KEYWORDS,...

Y otra etiqueta muy importante que muestra al crawler datos esenciales sobre la entidad que publica la web, situación gps, dirección, población, ...

<script type="application/ld+json">...</script>

Si la página muestra productos o servicios, también se utiliza, pero en este caso mostrando datos del producto o servicio como precios, nombre, etc. Y se puede generar con : 
const generateJsonLd = computed(() => {
      const existingScripts = document.head.querySelectorAll(
        'script[type="application/ld+json"]'
      );
      existingScripts.forEach((s) => s.remove());
      return jsonLd.value;
    });

    let jsonLdScript: HTMLScriptElement | null = null;

    jsonLdScript = document.createElement('script');
    jsonLdScript.setAttribute('type', 'application/ld+json');
    jsonLdScript.textContent = JSON.stringify(generateJsonLd.value);
    document.head.appendChild(jsonLdScript);
 
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Product","description":"CAJONERA 3 SOBREMESA CAJONES VERDE 441 F18 JAR 8414926593577","name":"CAJONERA 3 SOBREMESA CAJONES VERDE 441 F18 JAR","image":"https://dacartoys.es/product/view/16214","url":"https://dacartoys.es/product/view/16214","offers":{"@type":"Offer","availability":"https://schema.org/InStock","price":0,"priceCurrency":"EUR","priceValidUntil":"2025-05-22"},"aggregateRating":{"@type":"AggregateRating","ratingValue":4.5,"reviewCount":89}}</script>

dacartoys.es


Otro apartado igualmente importante es generar los SITEMAP.XML. No es posible generar de forma autónoma el fichero desde la SPA, porque como anteriormente he indicado, la SPA se despliega en el cliente y cualquier acción que realice no afecta al servidor.

Este aspecto, después de mucho investigar, se genera dinámicamente desde la API. Generando un SITEMAP.XML índice que apunta a otros ficheros con el mismo formato y que contienen la referencia a productos, categorías, ...etc.  Vuelvo a recordar que la referencia a las páginas, se crea en la SPA desplegada en el cliente pero a todos los efectos, para un robot es como si fuera una página diferente. El robot se comporta como un cliente.

Es muy importante que en la URL de la página de un producto o un servicio o un artículo de un blog, aparezca información de su contenido, todo suma, es lo que llamamos habitualmente 'slug' : 

<url>
<loc>https://lapayasa.com/product/view/disfraz_guerrero_infantil/00003</loc>
<lastmod>2025-04-18T14:00:19.000Z</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>

El secreto de este tipo de URL: aunque el robot necesita esta información para el SEO, la SPA solo utiliza el SKU final para solicitar el dato necesario.

Los BACKLINKS es el otro punto esencial que debemos planificar. Me refiero a los LINKS que apuntan a nuestra web desde otras webs, cuando mejor reputación tengan, más fácil será conseguir un buen SEO.  Los BACKLINKS puede provenir de publicaciones digitales y blogs. Publicar información original y de calidad atrae las miradas de otros medios que linkarán nuestra publicación.  

Y hasta aquí todo lo que puede ser de utilidad para mis lectores.

Comentarios

Entradas populares