SEO para SolidJS

Cómo lograr que los sitios de SolidJS sean rastreables, indexables y rápidos mediante SolidStart, SSR o SSG, @solidjs/meta y carga de datos en el servidor.

Publicado por primera vez: 26 jun 2026 · Última actualización: 13 ago 2026 · Avanzado
Idiomas

SolidJS usa CSR de forma predeterminada, por lo que el HTML inicial puede estar vacío. SolidStart permite SSR, SSG y streaming por ruta; @solidjs/meta incorpora títulos y metadatos al HTML, HttpStatusCode devuelve el estado HTTP correcto y createAsync carga los datos en el servidor. Cada ruta debe comprobarse por separado.

TL;DR — SolidJS ofrece reactividad granular mediante señales y no usa DOM virtual, pero de forma predeterminada funciona como una biblioteca CSR: entrega un contenedor vacío y plantea el mismo problema de indexación en la primera oleada que React sin framework de servidor. SolidStart lo resuelve: SSR, SSG mediante prerenderizado por ruta y SSR por streaming incluyen contenido y metadatos en la primera respuesta. Las etiquetas de cabecera se administran con @solidjs/meta (<Title>, <Meta> y <Link> dentro de <MetaProvider>), los estados HTTP reales se devuelven con <HttpStatusCode> y los datos se cargan en el servidor con createAsync para incorporarlos al HTML SSR. La precisión esencial es esta: SolidJS hidrata; NO es reanudable. La reanudación corresponde a Qwik. La reactividad granular optimiza las actualizaciones del cliente, no el arranque entre servidor y cliente; su posible ventaja SEO se concentra en Core Web Vitals —como INP y TBT— sobre un SSR convencional.

Evidence for this claim The article's described solidjs-seo capabilities must be evaluated against the platform's current documentation rather than assumed to be search-engine behavior. Scope: Platform-specific capability documentation. Confidence: high · Verified: SolidStart documentation Evidence for this claim Regardless of platform, Google needs crawlable URLs, accessible rendered content, descriptive metadata, and valid search directives. Scope: Google requirements independent of platform. Confidence: high · Verified: Google Search Central: SEO Starter Guide

Arquitectura de SolidJS: diferencias reales

SolidJS usa un JSX que se parece al de React y primitivas similares a hooks (createSignal, createEffect, createMemo), pero su modelo de ejecución es fundamentalmente distinto:

  • React vuelve a ejecutar toda la función del componente cuando cambia el estado y compara un DOM virtual para decidir qué debe actualizar.
  • SolidJS compila JSX como operaciones del DOM real durante la construcción. Los componentes se ejecutan una sola vez; las señales reactivas conectan cada valor directamente con los nodos específicos del DOM que dependen de él. Cuando cambia una señal, Solid actualiza solo ese nodo, sin reconciliación ni costo de un DOM virtual.

Por ello, SolidJS suele aparecer cerca de los primeros puestos de js-framework-benchmark y su entorno de ejecución es mucho más ligero que el modelo de rerenderizado de React. La biblioteca ocupa aproximadamente 7 KB comprimida con gzip. Un entorno pequeño y actualizaciones selectivas explican su rendimiento, pero no modifican el modo de renderizado, que es el factor decisivo para el SEO.

CSR predeterminado: el problema de SEO

Si se construye solo con SolidJS, sin SolidStart, se obtiene una aplicación renderizada del lado del cliente:

  1. El servidor envía index.html con un cuerpo casi vacío, normalmente un <div id="root"></div> y una etiqueta de script.
  2. El navegador descarga el paquete de JS, ejecuta el código reactivo de Solid y completa el DOM.
  3. La primera oleada de Googlebot encuentra el contenedor vacío, sin contenido ni metadatos.
  4. La segunda oleada de Googlebot, es decir, la cola de renderizado, termina por ejecutar el JS y ver el contenido; el plazo es impredecible y puede ir de horas a semanas.
  5. Bing, los rastreadores sociales y los bots sin JS quizá nunca vean el contenido.

Este es el proceso de renderizado en dos oleadas y afecta a cualquier SPA con CSR. Sus consecuencias prácticas son una indexación inicial lenta del contenido nuevo, títulos y descripciones ausentes del HTML sin procesar —con fragmentos erróneos o vacíos en las SERP— y errores blandos de página no encontrada, porque una aplicación CSR no puede devolver un HTTP 404 real: el servidor siempre responde 200 con el contenedor de la aplicación.

SolidStart: la solución

SolidStart (1,0, estable) es el metaframework oficial de SolidJS, construido sobre Vinxi (Vite + Nitro). Ofrece:

  • Enrutamiento isomórfico basado en archivos: los archivos de src/routes/ se asignan a URL (src/routes/blog/[slug].tsx/blog/:slug). Debe precisarse una corrección: SolidStart no incluye de forma integrada un router ni una biblioteca de metadatos. Su documentación dice: “SolidStart itself does not ship with a Router or Metadata library. Rather, it leaves that open for you to use any library you want.” (traducción) «SolidStart no incluye un router ni una biblioteca de metadatos; deja abierta la posibilidad de usar la biblioteca que se prefiera». El enrutamiento y el comportamiento de @solidjs/meta descritos aquí proceden de añadir explícitamente @solidjs/router y @solidjs/meta. Las plantillas oficiales incorporan ambos paquetes, por lo que puede parecer automático; conviene revisar package.json en vez de suponer que forman parte del framework.
  • Varios modos de renderizado elegidos por ruta: CSR, SSR —sincrónico, asincrónico o por streaming— y SSG o prerenderizado de rutas. Un proyecto de SolidStart no es «SSR» o «CSR» en su conjunto: cada ruta selecciona su modo. Deben comprobarse la configuración y el HTML resultante de la ruta específica, sin presuponer que todo el sitio heredó la misma opción.
  • Funciones de servidor: la directiva "use server" permite código de servidor con un patrón similar a RPC, como acceso a datos y bases de datos.
  • Adaptadores para Cloudflare y Vercel; también para Netlify, Deno, Node y alojamiento estático.

Nota de versión: esta explicación refleja la documentación vigente de SolidStart 1,0, que se presenta como beta y se actualizó por última vez el 28/4/2026. Antes de considerar permanente cualquier API, deben confirmarse los detalles en la documentación correspondiente a la versión utilizada.

SSR, SSG y streaming desde la perspectiva del SEO

  • SSR —sincrónico, asincrónico o por streaming, que SolidStart identifica como submodos distintos— entrega todo el contenido en la primera solicitud y permite indexarlo en la primera oleada. Resulta adecuado para páginas que cambian con frecuencia.
  • SSG (prerenderizado de rutas) construye el HTML durante el despliegue. Ofrece TTFB y LCP bajos, admite caché en CDN y evita trabajo del servidor en cada solicitud. Es apropiado para blogs, documentación y páginas de marketing. Las rutas prerenderizadas se configuran en app.config.ts:
// app.config.ts
import { defineConfig } from "@solidjs/start/config";

export default defineConfig({
  server: {
    prerender: {
      routes: ["/", "/about", "/blog"],
    },
  },
});
  • SSR por streaming envía el HTML de forma progresiva para mejorar el TTFB en páginas con muchos datos; Google renderiza toda la salida transmitida.
  • CSR es adecuado para paneles autenticados y herramientas que no necesitan posicionarse, pero no para contenido público.

Gestión de etiquetas de cabecera con @solidjs/meta

El paquete @solidjs/meta equivale en SolidJS a React Helmet o al <Head> de Next.js. Admite SSR y funcionamiento asincrónico. La aplicación debe envolverse con <MetaProvider> para recopilar las etiquetas durante el SSR; después se definen las etiquetas de cada página dentro de los componentes de ruta:

// src/routes/about.tsx
import { Title, Meta, Link } from "@solidjs/meta";

export default function AboutPage() {
  return (
    <>
      <Title>About Us — My Site</Title>
      <Meta name="description" content="Learn more about us." />
      <Link rel="canonical" href="https://example.com/about" />
      <Meta property="og:title" content="About Us" />
      <Meta property="og:description" content="Learn more about us." />
      <Meta property="og:image" content="https://example.com/og-about.jpg" />
      <main>...</main>
    </>
  );
}

Los componentes disponibles son <Title>, <Meta>, <Link>, <Style>, <Base> y el contenedor <MetaProvider>. La deduplicación está integrada: las etiquetas <Meta> con el mismo atributo name sustituyen las definiciones superiores. Gana la más profunda y específica, también durante el SSR. Por tanto, un título predeterminado en la raíz y las sustituciones de cada página funcionan de la manera prevista.

La documentación incluye una advertencia directa: no deben añadirse etiquetas <title> sin procesar a los archivos del servidor, porque sustituyen la función de @solidjs/meta. Debe usarse siempre el componente <Title>, no un título HTML escrito a mano en la plantilla del servidor.

Datos estructurados (JSON-LD)

Google admite JSON-LD tanto en el HTML sin procesar como cuando JavaScript lo inyecta, pero el JSON-LD generado mediante SSR es la opción más confiable. En SolidStart se renderiza en el componente de ruta:

export default function ArticlePage() {
  const schema = {
    "@context": "https://schema.org",
    "@type": "Article",
    "headline": "My Article",
    "author": { "@type": "Person", "name": "Author Name" },
  };

  return (
    <>
      <script
        type="application/ld+json"
        innerHTML={JSON.stringify(schema)}
      />
      <article>...</article>
    </>
  );
}

Con SSR habilitado, el JSON-LD aparece en el HTML renderizado por el servidor, el enfoque preferible para que funcione de manera confiable con todos los rastreadores. Debe validarse con la Prueba de resultados enriquecidos o la herramienta de inspección de URL.

Hidratación, no reanudación

La hidratación es el proceso por el cual, después de que el SSR entrega el HTML renderizado, el framework se conecta al DOM existente para volverlo interactivo: descarga el paquete de JS, ejecuta el código, concilia el estado con los nodos existentes y añade detectores de eventos. SolidJS usa hidratación, el mismo mecanismo fundamental que hydrate de React, createSSRApp de Vue o el SSR de Angular.

La reanudación, arquitectura de Qwik, es distinta: el servidor serializa el estado de ejecución del framework dentro del HTML y el cliente continúa desde ese punto sin volver a ejecutar los componentes; la página es interactiva antes de que se ejecute cualquier JS.

Debe descartarse un mito: a veces se confunde la reactividad granular de SolidJS con la reanudación porque ambas evitan «volver a ejecutar» componentes en el sentido tradicional. No son equivalentes. La reactividad granular optimiza las actualizaciones del cliente; la reanudación es un mecanismo de arranque entre servidor y cliente. SolidJS todavía descarga y ejecuta su entorno antes de que la página sea interactiva.

Para el SEO, tanto SSR con hidratación —SolidJS— como la reanudación —Qwik— incluyen HTML renderizado en la respuesta del servidor y favorecen la indexación. La diferencia afecta al tiempo hasta la interactividad y al INP en dispositivos lentos, donde Qwik tiene ventaja por su JS de arranque casi nulo. Para rastrear e indexar, el SSR de SolidStart ya es suficiente.

Core Web Vitals

Las ventajas del entorno de SolidJS pueden mejorar las métricas de Core Web Vitals en rutas con SSR, pero el efecto no es automático ni universal. Ninguna fuente primaria garantiza una hidratación barata ni mejores resultados para todas las rutas de Solid o SolidStart: el tamaño del paquete, la carga de datos, los scripts de terceros, el dispositivo y el modo real de renderizado determinan el costo. Los puntos siguientes describen el mecanismo por el que SolidJS puede ayudar; deben medirse las rutas propias para confirmarlo:

  • LCP puede mejorar porque el elemento de contenido más grande está en el HTML renderizado por el servidor y no espera al JS.
  • INP puede mejorar porque el entorno granular de Solid gestiona las interacciones con eficiencia, sin comparar un DOM virtual.
  • CLS puede disminuir porque el contenido generado con SSR no se desplaza cuando se incorpora el JS tardío.

Conviene mantener una cautela: cifras como «SolidJS es aproximadamente un 70 % más rápido que el DOM virtual de React» proceden de pruebas sintéticas (js-framework-benchmark), no de datos de campo reales. Las CWV dependen mucho más de la calidad de la implementación, la carga de datos y el alojamiento que del framework. Estas cifras solo indican una tendencia; los datos propios deben medirse en CrUX y Search Console.

Enrutamiento, carga de datos y estados de error reales

Enrutamiento. SolidStart usa la History API de forma predeterminada. No debe usarse el enrutamiento con hash (#/page), que impide descubrir URL de manera confiable. El comportamiento de la barra final debe ser coherente y aplicarse con redirecciones del servidor, no solo con etiquetas canónicas.

Carga de datos para SEO. El contenido que debe posicionarse se carga en el servidor para incluirlo en el HTML SSR. Deben usarse createAsync y funciones de servidor, no onMount ni efectos del cliente, que se ejecutan después de enviar el HTML:

// Server-side data fetch — content lands in the initial HTML ✓
import { createAsync } from "@solidjs/router";
import { getPost } from "~/lib/api";

export const route = {
  load: ({ params }) => getPost(params.slug),
};

export default function BlogPost(props) {
  const post = createAsync(() => getPost(props.params.slug));
  return <article>{post()?.content}</article>;
}

Estados de página no encontrada reales. Una ruta comodín junto con <HttpStatusCode> de @solidjs/start establece en el servidor el código real de la respuesta HTTP: un 404 verdadero en lugar de un 404 blando:

// src/routes/[...404].tsx
import { HttpStatusCode } from "@solidjs/start";

export default function NotFound() {
  return (
    <>
      <HttpStatusCode code={404} />
      <h1>Page Not Found</h1>
    </>
  );
}

Sitemaps, robots.txt y SEO internacional

  • robots.txt: se añade public/robots.txt en la raíz del proyecto y se incluye la ubicación del sitemap. No deben bloquearse las rutas /api/ utilizadas para cargar datos mediante XHR.
  • Sitemap: el complemento externo solid-start-sitemap, de madaxen86, genera sitemap.xml durante la construcción y admite rutas dinámicas mediante asignación de parámetros o una ruta de API en tiempo de ejecución.
  • SEO internacional: se emite hreflang con <Link rel="alternate" hreflang="…"> de @solidjs/meta y se prefiere una estructura de subdirectorios (/en/, /fr/) a subdominios o parámetros de consulta.

Errores comunes de SEO en SolidJS

  1. Ejecutar CSR de SolidJS sin SSR o SSG de SolidStart.
  2. Cargar contenido posicionable en onMount o en efectos del cliente.
  3. Omitir el contenedor <MetaProvider>; las etiquetas no se renderizarán con SSR.
  4. Añadir etiquetas HTML <title> sin procesar en las plantillas del servidor, lo que sustituye la salida de @solidjs/meta.
  5. Usar enrutamiento basado en hash.
  6. Servir errores blandos de página no encontrada sin <HttpStatusCode>.
  7. Bloquear rutas de API en robots.txt.
  8. No asignar huellas a los recursos JS; Google almacena los scripts en caché de forma intensiva.
  9. Ocultar contenido tras un clic, acordeón o pestaña que nunca se carga automáticamente en el DOM.
  10. Suponer que SSR funciona sin comprobarlo mediante el código fuente o la inspección de URL.
  11. Suponer que @solidjs/router y @solidjs/meta vienen integrados con SolidStart. No es así: su documentación indica que “does not ship with a Router or Metadata library” (traducción) «no incluye un router ni una biblioteca de metadatos». Las plantillas oficiales añaden ambos, pero una configuración desde cero o personalizada debe instalarlos explícitamente.
  12. Considerar que todo el proyecto es «SSR» o «CSR». SolidStart configura el modo por ruta, por lo que una ruta supuestamente renderizada por el servidor podría no estarlo.

Contexto dentro del SEO técnico

SolidJS pertenece al subgrupo de frameworks de JavaScript junto con Qwik, dentro del grupo más amplio de SEO para JavaScript. El paralelo más cercano es SEO para React: SolidJS comparte con React el uso de JSX y el problema de CSR predeterminado, pero lo corrige con SolidStart en vez de Next.js y funciona sin DOM virtual. Para entender cómo Google ve el contenido generado, pueden consultarse renderizado y rastreo.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.