SEO para Svelte
Svelte se renderiza en el cliente; SvelteKit corrige esa limitación con SSR predeterminado. Guía sobre modos de renderizado, svelte:head, funciones load, adaptadores y sitemaps.
Idiomas
El SEO para Svelte depende de una distinción: Svelte por sí solo entrega una estructura HTML vacía, mientras que SvelteKit renderiza en servidor de forma predeterminada. Para contenido indexable deben usarse SvelteKit, svelte:head, funciones load en +page.server.js y un adaptador apropiado. El modo SPA con ssr: false debe evitarse en páginas que necesitan visibilidad orgánica.
Evidence for this claim The article's described svelte-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: SvelteKit page options 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 GuideTL;DR — La distinción principal para el SEO es que Svelte y SvelteKit no son lo mismo. Svelte por sí solo genera la página en el navegador, por lo que los buscadores reciben primero una estructura vacía. SvelteKit, el entorno oficial de Svelte, genera la página en el servidor y entrega HTML completo. Para el contenido que debe posicionarse, conviene utilizar SvelteKit.
Svelte frente a SvelteKit
Svelte es una herramienta para crear interfaces. En lugar de enviar una biblioteca grande de JavaScript al navegador, compila los componentes como código JavaScript compacto durante la compilación. Esto puede producir páginas rápidas.
Sin embargo, la velocidad y la compatibilidad con buscadores son aspectos distintos. Una aplicación Svelte básica se renderiza en el cliente: el servidor envía una página casi vacía y JavaScript añade el contenido en el navegador. El HTML sin procesar contiene muy poca información.
SvelteKit es el entorno oficial construido sobre Svelte. Su ventaja principal para el SEO es que renderiza las páginas primero en el servidor, de modo que el HTML inicial ya incluye contenido, encabezados y enlaces. Este es el comportamiento predeterminado. Los sitios que necesitan visibilidad orgánica deben usar SvelteKit en lugar de Svelte sin un entorno de renderizado.
Por qué importa para los buscadores
- Google puede ejecutar JavaScript y leer posteriormente una página Svelte renderizada en el cliente, pero el proceso puede retrasar el contenido nuevo.
- Bing y otros buscadores pueden ejecutar JavaScript con distinta fiabilidad.
- Los rastreadores de IA, como GPTBot, ClaudeBot y PerplexityBot, tienen comportamientos que varían por proveedor y cambian con el tiempo; la documentación actual no permite asumir un paso de renderizado común que complete una estructura vacía.
El renderizado en servidor de SvelteKit evita esta dependencia. El contenido aparece en el HTML inicial, por lo que los rastreadores pueden leerlo sin depender de un paso posterior de renderizado.
Lista de comprobación básica
- Utilizar SvelteKit, no Svelte por sí solo, para el contenido que debe posicionarse.
- Asignar a cada página un
<title>y un<meta name="description">únicos mediante<svelte:head>. - Mantener activo el renderizado en servidor para las páginas que deben encontrarse; no usar el modo SPA.
- Crear un sitemap y
robots.txt, ya que SvelteKit no los genera. - No bloquear los archivos JavaScript o CSS en
robots.txt.
La pestaña Advanced explica los cuatro modos de renderizado, las diferencias entre adaptadores, el riesgo de ssr: false y el patrón de funciones load para metadatos.
Evidence for this claim The article's described svelte-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: SvelteKit page options 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 GuideTL;DR — El SEO de Svelte es, en realidad, una cuestión de SvelteKit. Svelte básico usa solo CSR y no coloca el contenido en el HTML inicial. SvelteKit usa SSR de forma predeterminada, permite prerenderizado (SSG) por ruta y combina modos. Los metadatos se gestionan con
<svelte:head>y funciones load de+page.server.js. La trampa principal esadapter-staticconssr: false: no prerenderiza, sino que produce estructuras vacías. La documentación advierte que el modo SPA tiene “large negative performance and SEO impacts” (traducción) «un gran impacto negativo en rendimiento y SEO». Deben configurarse History API,trailingSlashy un adaptador adecuado.
Svelte no es SvelteKit, una diferencia decisiva para SEO
Svelte es un compilador que transforma componentes .svelte en JavaScript ligero,
sin DOM virtual ni biblioteca de ejecución. Esto reduce el paquete, pero no cambia el
renderizado. Una aplicación Svelte básica sigue siendo una SPA renderizada en el
cliente: el servidor devuelve una estructura HTML vacía y el navegador construye
la página. El contenido no aparece al ver la fuente.
Esta es la principal confusión al buscar «SEO para Svelte». La compilación no añade contenido al HTML; SvelteKit sí. Es el metaframework oficial, equivalente a Next.js para React o Nuxt para Vue, y renderiza en el servidor de forma predeterminada. Añade SSR, prerenderizado, rutas por archivos, funciones load y adaptadores. En resumen: Svelte básico = solo CSR; SvelteKit = SSR primero.
Las opciones (ssr, csr, prerender, trailingSlash) se definen por ruta y
se heredan: +layout.js o +layout.server.js establece valores para sus rutas hijas,
que pueden sobrescribirlos. Por eso debe revisarse cada ruta. La documentación vincula
la salida vacía específicamente a ssr: false: “If you set ssr to false,
it renders an empty ‘shell’ page instead.” (traducción) «Si se define ssr como
false, se renderiza una página de estructura vacía». La guía corresponde a Svelte
5.x y SvelteKit 2.x; las runes afectan a la autoría de componentes, no al modo de
renderizado.
El modo importa por el funcionamiento de los buscadores. Google procesa JavaScript
mediante rastreo, renderizado e indexación: “all pages with a 200 HTTP status code
are sent to the rendering queue” (traducción) «todas las páginas con estado 200
se envían a la cola de renderizado». La cola añade demora. Google recomienda SSR o
prerenderizado porque acelera la página y no todos los bots ejecutan JavaScript.
Los cuatro modos de renderizado de SvelteKit
SvelteKit decide el renderizado por ruta. Las opciones son jerárquicas: un valor
en +layout.js o +layout.server.js se hereda, salvo que la ruta hija lo sobrescriba.
Debe comprobarse la opción efectiva de cada ruta, no solo la raíz del proyecto.
- SSR (predeterminado). La respuesta inicial contiene HTML completo; conviene para contenido dinámico, personalizado o cambiante.
- Prerender (
export const prerender = true). Genera HTML estático al compilar, ideal para blogs, documentación y marketing. Es SSR durante la compilación, por lo que SSR debe permanecer activo. - SPA (
ssr: false). Devuelve una estructura sin renderizado de servidor. La documentación advierte de consecuencias negativas para rendimiento y SEO; no es apropiado para contenido indexable. - Híbrido. Combina modos por ruta: marketing prerenderizado, productos con SSR y administración tipo SPA tras inicio de sesión.
La trampa de ssr: false
Es el error más costoso: usar adapter-static y definir ssr: false pensando que se
obtendrá HTML prerenderizado. No ocurre así.
El prerenderizado es SSR durante la compilación. Si se desactiva, no hay nada que
renderizar y adapter-static publica la estructura vacía descrita por la
documentación. El contenido aparece solo al ejecutar JavaScript. Con
adapter-static, debe mantenerse ssr activo para producir HTML real. ssr: false se reserva para una SPA que acepte el coste de SEO.
Gestión de metadatos con <svelte:head>
El elemento <svelte:head> inserta contenido en <head> sin bibliotecas externas.
Cada página debe tener <title> y <meta name="description"> únicos, además de URL
preferida, Open Graph, Twitter Card, hreflang, directivas robots y JSON-LD según
corresponda.
Patrón recomendado para metadatos dinámicos:
- Devolver metadatos desde
load()en+page.server.js. - Acceder mediante
page.dataen el layout. - Renderizar en
<svelte:head>dentro de+layout.svelte.
<!-- +layout.svelte -->
<script>
import { page } from '$app/state';
</script>
<svelte:head>
<title>{page.data.title}</title>
<meta name="description" content={page.data.description} />
<link rel="canonical" href={page.data.canonical} />
</svelte:head>Como alternativa, el paquete externo
svelte-seo envuelve <svelte:head> con
propiedades para etiquetas comunes; es una comodidad, no un requisito.
<svelte:head> inserta las etiquetas, pero no valida su exactitud. Cada ruta debe
renderizar título y descripción únicos, la URL preferida debe coincidir entre una
solicitud directa y la navegación cliente, y robots y JSON-LD deben aparecer en la
respuesta sin procesar, no solo tras la hidratación.
Funciones load: importa dónde se obtienen los datos
load() en +page.server.js se ejecuta en el servidor, de modo que sus datos
aparecen en el HTML inicial. load() en +page.js se ejecuta en el servidor al
primer renderizado y en el cliente durante la navegación. Obtener título, descripción
o URL preferida en un bloque <script> mediante onMount es un error: solo se ejecuta
en el cliente. Los datos críticos deben obtenerse en una función load de servidor.
El nombre del archivo no prueba por sí solo el límite: load() de +page.js también
se ejecuta en el servidor en la primera solicitud y luego en el cliente. Su retorno
debe poder serializarse. Conviene verificar tanto el HTML de solicitud directa como
la vista tras navegación cliente.
Enrutamiento y estructura de URL
- Rutas por archivos con
[param]producen URL limpias y previsibles. - History API es el valor predeterminado. Evita rutas hash como
#/page, que Google no resuelve de forma fiable. trailingSlashensvelte.config.jsacepta'always','never'o'ignore'. Una configuración incoherente puede crear duplicados; debe elegirse una opción estable.- Las rutas dinámicas prerenderizadas necesitan una función
entriesque enumere las rutas durante la compilación.
Elección del adaptador para SEO
El adaptador decide cómo y dónde se despliega SvelteKit y afecta sobre todo a TTFB, que influye en LCP:
| Adaptador | Renderizado | Implicación para SEO |
|---|---|---|
adapter-static | SSG completo | HTML estático; ideal para contenido, con ssr activo |
adapter-node | SSR en Node | SSR dinámico y flexible; requiere servidor |
adapter-vercel | SSR + edge | SSR con funciones edge opcionales |
adapter-cloudflare | SSR en Workers | SSR edge global |
adapter-netlify | SSR + CDN | Perfil similar a Vercel |
Para blogs o documentación, adapter-static con prerenderizado ofrece velocidad y
rastreabilidad. En sitios dinámicos, adapter-cloudflare o adapter-vercel acercan
SSR al perímetro de la red. El TTFB real depende de datos, caché y arranque en frío; debe medirse la
página desplegada en vez de atribuir el resultado al adaptador.
Un adaptador también delimita streaming, sistema de archivos, caché, API, redirecciones
y errores. Una ruta correcta en desarrollo o con adapter-node puede comportarse de
otro modo en Cloudflare o Vercel. Debe probarse la compilación en el destino real, no
solo con npm run preview.
Sitemaps y robots.txt
SvelteKit no incluye sitemap ni robots.txt; deben crearse explícitamente.
- Sitemap manual:
src/routes/sitemap.xml/+server.jsdevuelve XML; conadapter-staticse añadeexport const prerender = true. - Sitemap dinámico: un endpoint consulta CMS o base de datos en cada solicitud, útil para sitios grandes o cambiantes.
- Paquetes:
svelte-sitemapysveltekit-static-sitemapgeneran sitemaps de rutas estáticas. - robots.txt: puede guardarse en
static/(y servirse en/robots.txt) o generarse desdesrc/routes/robots.txt/+server.js. No deben bloquearse.jsni.css, pues Google necesita esos archivos para renderizar.
Rendimiento y Core Web Vitals
El compilador ofrece una ventaja estructural, pero no garantiza Core Web Vitals.
SvelteKit suele enviar menos JavaScript que una aplicación React equivalente y ofrece
división de código, precarga, caché y despliegue edge. El peso, las imágenes, scripts
externos, hidratación y destino determinan las métricas reales. La documentación
recomienda: “Google’s PageSpeed Insights and WebPageTest are excellent ways to
understand the performance characteristics of a site.” (traducción) «PageSpeed
Insights y WebPageTest ayudan a comprender el rendimiento». La optimización de
imágenes está disponible mediante @sveltejs/enhanced-img.
Rastreadores de IA y necesidad de SSR
En 2026, el comportamiento de GPTBot, ClaudeBot, PerplexityBot y Bingbot depende del proveedor y la versión; la documentación no establece un renderizado común. Conviene planificar suponiendo que se obtiene HTML estático sin ejecutar JavaScript, no tratarlo como garantía universal. Una ruta CSR entrega una estructura vacía, mientras SSR de SvelteKit coloca el contenido en el HTML inicial. SSR mejora la accesibilidad, pero no garantiza aparecer en respuestas de IA.
Errores frecuentes de SEO en SvelteKit
- Obtener datos en
onMount()en vez de una función load de servidor. - Publicar modo SPA (
ssr: false) para contenido indexable. - Combinar
adapter-staticconssr: false: produce estructuras vacías. - Bloquear JS o CSS en
robots.txt: rompe el renderizado. - Omitir
trailingSlash: puede crear variantes duplicadas. - Usar rutas hash: Googlebot no resuelve esas URL de forma fiable.
Svelte o SvelteKit puede funcionar como frontend desacoplado de un CMS headless. La lógica de modos de renderizado es la misma que rige el SEO para JavaScript en general.
Resumen de IA
Versión condensada de la lente avanzada:
- Svelte no es SvelteKit. Svelte básico usa solo CSR; SvelteKit usa SSR por defecto y entrega HTML completo.
- El modo importa: SSR o prerenderizado coloca el contenido en la primera respuesta, sin depender del renderizado del rastreador.
- Por qué importa: Google envía todas las páginas con estado
200a renderizado; SSR evita esa demora y ayuda a los bots que no ejecutan JavaScript. - Cuatro modos: SSR, prerender/SSG (
prerender = true), SPA conssr: falsee híbrido por ruta. - Trampa:
adapter-static+ssr: falseproduce estructuras vacías; SSR debe permanecer activo. - Metadatos:
<title>y otras etiquetas en<svelte:head>, alimentado por load de+page.server.js, noonMount(). - Rutas: History API predeterminada,
trailingSlashexplícito yentriespara rutas dinámicas prerenderizadas. - Adaptadores:
adapter-staticpara SSG;adapter-node,vercelocloudflarepara SSR. Debe medirse el destino real. - Sitemap y robots.txt: no vienen integrados; se crean con una ruta
+server.jso un paquete. Nunca se bloquean.jso.css. - CWV: Svelte ofrece menos JavaScript y herramientas de rendimiento, pero el resultado depende de la implementación.
Documentación oficial
Documentación de fuentes primarias de SvelteKit y los buscadores.
SvelteKit
- SEO • Documentación de SvelteKit, título oficial: “SEO • SvelteKit Docs” (traducción) — SSR predeterminado,
<svelte:head>, barras finales, rendimiento y sitemap. - Opciones de página, título oficial: “Page options (prerender, ssr, csr) • SvelteKit Docs” (traducción) — modos por ruta y advertencia SPA.
- Generación estática, título oficial: “Static site generation (adapter-static) • SvelteKit Docs” (traducción) — prerenderizado y requisito de
ssr. - Carga de datos, título oficial: “Loading data • SvelteKit Docs” (traducción) — funciones load universales y de servidor.
- Rendimiento, título oficial: “Performance • SvelteKit Docs” (traducción) — división, precarga, caché y medición.
- Conceptos básicos de SEO para JavaScript, título oficial: “Understand JavaScript SEO Basics” (traducción) — fases, cola de renderizado y History API.
- El nuevo Googlebot evergreen, título oficial: “The new evergreen Googlebot” (traducción) — migración a Chromium evergreen.
- Guía de SEO para desarrolladores web, título oficial: “SEO Guide for Web Developers” (traducción) — recomendación de SSR o prerenderizado.
Citas de la fuente
Declaraciones públicas de la documentación de SvelteKit y Google. Cada enlace salta al pasaje citado.
Documentación de SvelteKit — renderizado y SEO
- “This option has large negative performance and SEO impacts” — sobre ejecutar una
aplicación como SPA renderizada en el cliente (modo
ssr: false). (traducción) «Esta opción tiene grandes efectos negativos en rendimiento y SEO». Jump to quote - “Google’s PageSpeed Insights and WebPageTest are excellent ways to understand the performance characteristics of a site.” (traducción) «PageSpeed Insights y WebPageTest son excelentes para comprender el rendimiento de un sitio». Jump to quote
Google — JavaScript y renderizado
- “All pages with a 200 HTTP status code are sent to the rendering queue, no matter whether JavaScript is present on the page.” (traducción) «Todas las páginas con estado HTTP 200 se envían a la cola de renderizado, tengan o no JavaScript». Jump to quote
- “Server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript.” (traducción) «El renderizado de servidor o previo sigue siendo recomendable porque acelera el sitio y no todos los bots ejecutan JavaScript». Jump to quote
- “Google Search won’t render JavaScript from blocked files or on blocked pages.” (traducción) «Google Search no renderiza JavaScript de archivos ni páginas bloqueados». Jump to quote
Patrick Stox (artículo propio: Guía definitiva de SEO para JavaScript)
- “JavaScript is not bad for SEO, and it’s not evil. It’s just different from what many SEOs are used to, and there’s a bit of a learning curve.” (traducción) «JavaScript no es malo para SEO; es distinto de lo habitual y exige cierto aprendizaje».
- Sobre modos de renderizado: “Any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines.” (traducción) «Cualquier configuración de SSR, renderizado estático o prerenderizado funcionará para los buscadores».
- Sobre CSR: “The most problematic one is going to be full client-side rendering where all of the rendering happens in the browser. While Google will probably be OK client-side rendering, it’s best to choose a different rendering option to support other search engines.” (traducción) «El renderizado totalmente cliente es el más problemático. Aunque Google probablemente lo procese, conviene elegir otra opción para admitir otros buscadores».
Lista de comprobación de SEO para SvelteKit
Una revisión rápida para confirmar que buscadores y rastreadores de IA pueden leer el contenido:
- Se usa SvelteKit, no Svelte básico, para contenido indexable.
- SSR está activo en rutas indexables; no hay
ssr: falseaccidental. - Las páginas de contenido usan prerender (
export const prerender = true) cuando corresponde. - Con
adapter-static,ssrpermanece activo para producir HTML real. - Cada página tiene
<title>y<meta name="description">únicos mediante<svelte:head>. - Los metadatos se obtienen en load de
+page.server.js, no enonMount(). - URL preferida, Open Graph y JSON-LD se renderizan en el servidor.
-
trailingSlashse define ensvelte.config.js. - Las rutas dinámicas prerenderizadas tienen una función
entries. - Existe sitemap mediante una ruta
+server.jso un paquete, y robots.txt enstatic/o una ruta. -
robots.txtno bloquea.jsni.css. - Se usa History API, sin rutas hash.
- Se verificó el HTML renderizado en Inspección de URL de GSC.
Modelos mentales
1. Distinción Svelte frente a SvelteKit. Svelte básico usa CSR y no coloca contenido en el HTML; SvelteKit prioriza SSR. Casi todos los problemas nacen de usar Svelte básico o desactivar SSR en contenido indexable.
2. Prerenderizado = SSR durante la compilación.
«Estático» no significa ausencia de renderizado. ssr: false no puede prerenderizar;
SSR debe quedar activo y solo cambia cuándo se ejecuta.
3. Modo por ruta. SvelteKit permite adaptar cada ruta:
- Contenido casi estático → prerender (SSG).
- Contenido dinámico → SSR.
- Interfaz privada no indexada → SPA solo en ese ámbito.
4. Metadatos primero en HTML.
Título, descripción, URL preferida y JSON-LD deben estar en el HTML de servidor
mediante <svelte:head> y una función load. onMount() llega tarde.
5. El adaptador define el despliegue. El modo estático sirve para contenido; Node, Vercel o Cloudflare para SSR. Datos, caché, arranque en frío, streaming y errores determinan el resultado, que debe verificarse en producción.
6. Planificar para rastreadores sin JavaScript. El comportamiento depende de proveedor y versión. Si el contenido no está en el HTML inicial, debe considerarse invisible para rastreadores de solo obtención. SSR elimina esa dependencia, pero no garantiza el uso posterior del contenido.
SEO para SvelteKit: hoja de referencia
Modos de renderizado (se configuran por ruta mediante las opciones de página)
| Modo | Cómo | SEO | Uso recomendado |
|---|---|---|---|
| SSR | predeterminado | ✅ HTML completo en la primera solicitud | Contenido dinámico o actualizado |
| Prerenderizado (SSG) | export const prerender = true | ✅ Óptimo: HTML estático en la compilación | Blog, documentación y marketing |
| Alternativa SPA | export const ssr = false | ⚠️ “Large negative … SEO impacts” (traducción: «Grandes efectos negativos… para el SEO») | Solo interfaces de aplicaciones tras un inicio de sesión |
| Híbrido | combinación por ruta | ✅ Lo mejor de cada modo | La mayoría de los sitios reales |
La trampa
adapter-static+ssr: false→ contenedores vacíos, no HTML prerenderizado. Se debe mantenerssractivado conadapter-static.
Adaptadores
| Adaptador | Renderizado | Nota |
|---|---|---|
adapter-static | SSG | Estático real, sin servidor; se mantiene SSR activado |
adapter-node | SSR | Servidor Node; flexibilidad total |
adapter-vercel | SSR + perímetro | El perímetro puede reducir TTFB → medir su efecto en LCP |
adapter-cloudflare | SSR en Workers | TTFB a menudo bajo; probar la ruta desplegada |
adapter-netlify | SSR + CDN | Perfil similar al de Vercel |
Reglas rápidas
- Metadatos →
<svelte:head>(sin biblioteca adicional); se alimentan desde la función load de+page.server.js, nunca desdeonMount(). Cada ruta debe tener título y descripción únicos. - Enrutamiento → History API (predeterminado). No usar rutas con hashes o fragmentos.
- Configurar
trailingSlashexplícitamente. - Rutas dinámicas prerenderizadas → agregar una función
entries. - No hay sitemap ni robots.txt integrados: se deben crear (ruta
+server.jso paquete). - Nunca bloquear
.jsni.cssen robots.txt. - Rastreadores de IA → por lo general solo obtienen contenido y dependen del proveedor → mantener SSR activado para que el contenido no dependa de una etapa de renderizado.
- Las opciones (
ssr/csr/prerender/trailingSlash) son jerárquicas: se debe comprobar el valor aplicable a la ruta concreta, no solo el predeterminado del proyecto.
¿Svelte básico o SvelteKit?
Choose the rendering path
Errores de SEO con Svelte
- Usar Svelte básico solo del cliente para páginas de destino de búsqueda. Las rutas posicionables deben pasar a SSR o prerenderizado de SvelteKit.
- Configurar
ssr = falseglobalmente. Esto convierte el sitio en una SPA y elimina el HTML inicial completo. El comportamiento solo del cliente debe limitarse a rutas que no necesiten visibilidad en buscadores. - Actualizar
<svelte:head>solo después de las solicitudes del navegador. Los metadatos deben cargarse con los mismos datos de servidor o compilación que renderizan la página. - Usar URL basadas en hashes para rutas de contenido. Los fragmentos hash no son rutas de servidor independientes. Debe usarse el enrutamiento normal por ruta URL.
- Probar solo después de la hidratación. Se debe comparar el HTML sin procesar con el DOM renderizado para que el código del cliente no oculte contenido ausente en la fuente.
El HTML sin procesar es un contenedor de aplicación vacío
Causa probable: salida SPA de Svelte básico o ssr = false. Solución: usar SSR o prerenderizado de SvelteKit para la ruta y trasladar la carga esencial a una función load compatible con el servidor. Comprobación: curl devuelve el encabezado, el contenido y los enlaces internos.
Los títulos y las URL canónicas aparecen solo después de JavaScript
Causa probable: los valores de la cabecera dependen del ciclo de vida del cliente o de solicitudes exclusivas del navegador. Solución: devolver los datos durante SSR o el prerenderizado y mostrarlos mediante <svelte:head>. Comprobación: los valores de cabecera sin procesar y renderizados coinciden.
Falta una ruta dinámica en una compilación estática
Causa probable: el prerenderizador no puede descubrir la ruta parametrizada. Solución: exponer enlaces rastreables, configurar entradas o renderizar esa ruta bajo demanda. Comprobación: la ruta desplegada devuelve una página completa con estado 200.
La página funciona localmente, pero falla después del despliegue
Causa probable: incompatibilidad del adaptador, falta de soporte del servidor o solicitudes de datos dependientes del entorno. Solución: probar la salida del adaptador de producción y sus variables de ejecución. Comprobación: el HTML fuente de producción coincide con la compilación probada.
Confirmar que SvelteKit realmente sirve HTML renderizado
El objetivo de SSR en SvelteKit es que el contenido esté en el HTML sin procesar, antes
de que se ejecute JavaScript. La forma más rápida de confirmar que no se publicó por accidente
un contenedor CSR consiste en obtener la respuesta sin procesar y buscar el contenido. Un curl
normal no ejecuta JavaScript, por lo que ve exactamente lo mismo que un rastreador sin renderizado.
macOS / Linux
# Raw HTML as the server sends it (no JS executed)
curl -sL "https://example.com/your-page/" -o raw.html
# Is your real content in the raw HTML? (empty result = you're shipping a CSR shell)
grep -o "Your unique headline text" raw.html
# Is your title/description in the initial response?
grep -iE "<title>|name=\"description\"" raw.htmlWindows (PowerShell)
Invoke-WebRequest -Uri "https://example.com/your-page/" -OutFile raw.html
Select-String -Path raw.html -Pattern "Your unique headline text"
Select-String -Path raw.html -Pattern "<title>","name=`"description`""Si el encabezado y los metadatos aparecen en raw.html, SSR o el prerenderizado funcionan.
Si faltan allí, pero son visibles en el navegador, el contenido depende del renderizado del
cliente: debe comprobarse que ssr no esté en false y que el contenido no se solicite
únicamente en onMount().
Comprobar que no se bloqueen JS ni CSS
curl -sL "https://example.com/robots.txt" | grep -iE "disallow.*\.(js|css)|Disallow:\s*/(_app|assets)"Una regla Disallow que coincida con /_app/ (la salida empaquetada de SvelteKit) o con
los archivos CSS impide que Google renderice la página, lo que casi siempre es un error.
Herramientas para depurar el SEO de SvelteKit
- Inspección de URL (Google Search Console): la fuente de referencia. Se ejecuta una prueba en vivo y luego se revisan el HTML renderizado, la captura de pantalla y los recursos de la página para confirmar que el contenido y los metadatos estén presentes y que nada esté bloqueado.
- PageSpeed Insights: la documentación de SvelteKit lo recomienda expresamente; comprueba las Core Web Vitals (LCP/INP/CLS), que la salida ligera de SvelteKit busca optimizar.
- WebPageTest: la otra herramienta citada por la documentación de SvelteKit; su cascada y tira de fotogramas ayudan a diagnosticar TTFB y los tiempos de renderizado.
- Prueba de resultados enriquecidos: forma rápida de confirmar que JSON-LD llegó a la salida renderizada.
- Screaming Frog SEO Spider: rastrea con el renderizado de JS activado y desactivado para comparar el HTML sin procesar y el renderizado en todo el sitio de SvelteKit.
- Ahrefs Site Audit: detecta URL canónicas rotas, metadatos ausentes, cadenas de redirecciones y problemas de indexabilidad a escala.
- Ver código fuente /
curl: la comprobación más rápida de si el contenido está en el HTML sin procesar (véase la pestaña Scripts).
Evaluación: SEO para Svelte
Cinco preguntas rápidas sobre cómo Svelte y SvelteKit afectan la visibilidad en buscadores. Se elige una respuesta para cada una y luego se comprueba el resultado.
Recursos recomendados
Mis artículos relacionados
- JavaScript SEO: A Definitive Guide — mi referencia completa sobre renderizado, paridad del DOM y las concesiones entre modos de renderizado que sustentan todo lo explicado aquí. Menciona Svelte junto con React, Vue y Angular como frameworks con módulos de cabecera y metadatos para SEO.
- The Beginner’s Guide to Technical SEO — explica dónde encajan el renderizado y el rastreo en el panorama general.
Mis charlas
- How Search Works (SlideShare) — mi explicación del rastreo, renderizado, indexación y posicionamiento. (Se aplica mi advertencia habitual: “This is my understanding of systems… not going to be 100% complete or accurate.” (traducción: «Esta es mi interpretación de los sistemas… no será 100 % completa ni exacta»).)
Fuentes del sector
- SEO • SvelteKit Docs — punto de partida oficial y autoritativo: SSR predeterminado,
<svelte:head>, barras finales y patrón del sitemap. - Page options (prerender, ssr, csr) • SvelteKit Docs — controles de renderizado por ruta y advertencia sobre SEO en modo SPA, en palabras del propio equipo.
- Understand JavaScript SEO Basics (Google Search Central) — cola de renderizado, “not all bots can run JavaScript” (traducción: «no todos los bots pueden ejecutar JavaScript») y orientación sobre History API.
- SvelteKit SEO: Your Secret Weapon (Okupter) — guía práctica sobre etiquetas meta, prerenderizado, modos de renderizado, datos estructurados y sitemaps.
- SvelteKit SEO: Search Engine Optimization Metadata (Rodney Lab) — etiquetas meta esenciales, patrón de componente SEO, tarjetas sociales y declaración de idioma.
- How to add a basic SEO component to SvelteKit (Thilo Maier) — explicación centrada en código de un componente SEO reutilizable.
- Creating a Sitemap in SvelteKit (Bryan Anthonio) — guía clara y actual del enfoque de endpoint de sitemap con
+server.js. - Rich Harris explains why SvelteKit pushes for SSR (DEV Community) — contexto sobre por qué el creador de SvelteKit estableció SSR como opción predeterminada y desaconseja SPA/CSR.
Registro de cambios
Actualizado el 14 ago 2026.
Resumen editorial y detalles registrados del cambio.Detalles del cambio
-
Los detalles del cambio están disponibles actualmente en inglés.
La comparación completa no está disponible: no se archivó una instantánea anterior para esta revisión.
Actualizado el 14 ago 2026.
Resumen editorial y detalles registrados del cambio.Detalles del cambio
-
Los detalles del cambio están disponibles actualmente en inglés.
La comparación completa no está disponible: no se archivó una instantánea anterior para esta revisión.
Actualizado el 18 jul 2026.
Resumen editorial y detalles registrados del cambio.Detalles del cambio
-
Los detalles del cambio están disponibles actualmente en inglés.
-
Los detalles del cambio están disponibles actualmente en inglés.
-
Los detalles del cambio están disponibles actualmente en inglés.
-
Los detalles del cambio están disponibles actualmente en inglés.
La comparación completa no está disponible: no se archivó una instantánea anterior para esta revisión.