SEO de Implantação do SvelteKit: Adaptadores, Pré-renderização e Renderização de Borda
As configurações de adaptador e pré-renderização por rota do SvelteKit decidem onde e quando suas páginas são renderizadas — e isso impulsiona TTFB, LCP e orçamento de rastreamento. Um mergulho profundo focado em implantação: escolhendo adapter-static/node/vercel/cloudflare/netlify, prerender = true/false/'auto', restrições de runtime de borda e construção de sitemap.xml e robots.txt.
O adaptador do SvelteKit e a configuração de pré-renderização por rota decidem onde e quando uma página é renderizada — HTML estático no momento da compilação, SSR em um servidor ou SSR na borda — e essa decisão impulsiona o TTFB, que alimenta o LCP e a capacidade de rastreamento. Escolha adapter-static para sites de conteúdo puro, um adaptador node/vercel/cloudflare com pré-renderização por rota para sites mistos de conteúdo e aplicativo, e um adaptador de borda quando o TTFB global importa (aceitando inicializações a frio e sem fs de Node). prerender = 'auto' é a ferramenta para sites mistos. Runtimes de borda não podem ler o sistema de arquivos. E o SvelteKit não gera sitemap.xml ou robots.txt — você os constrói como endpoints +server.js, com a estratégia dependendo do seu adaptador.
«> TL;DR — SvelteKit already renders your pages on the server — that part is
handled. This page is about the next decision: how your site gets built and deployed. An adapter packages your SvelteKit app for a host (a static file host, a Node server, or a service like Vercel or Cloudflare), and a per-page prerender setting decides whether a page is turned into a plain HTML file ahead of time or rendered fresh on every visit. Those two choices decide how fast crawlers get your HTML — and SvelteKit won’t make your sitemap or robots.txt, so you have to add those yourself. » (Tradução) (Síntese localizada do trecho três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## What an adapter is (in plain terms) » (Tradução) (Síntese localizada do trecho quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«If you’ve already built a SvelteKit site, you know it sends real HTML to the browser — the content is there before any JavaScript runs. Good. That’s the hard SEO problem already solved (and if it isn’t solved for you yet, the SvelteKit fundamentals article in this same section covers the rendering modes and the “empty shell” trap you want to avoid first). » (Tradução) (Síntese localizada do trecho cinco, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«An adapter is the small plugin that takes your finished SvelteKit build and turns it into something a specific host can run. Evidência desta afirmação SvelteKit adapters transform a built application for deployment to a particular environment. Escopo: SvelteKit adapters. Confiança: alta · Verificado: SvelteKit: Adapters Same site, different package: » (Tradução) (Síntese localizada do trecho seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
adapter-statictransforma cada página em um arquivo HTML simples, criado uma vez. Ótimo para um blog, documentação ou site de marketing que não muda por visitante.adapter-nodeenvolve seu aplicativo em um servidor Node.js que você mesmo executa.adapter-vercel,adapter-netlify,adapter-cloudflareempacotam para esses serviços de hospedagem, que renderizam páginas sob demanda — às vezes em servidores “na borda”, fisicamente próximos aos seus visitantes.
«The content is identical in all cases. What changes is when the HTML is made (ahead of time, or on each request) and where (one server, or a global network). » (Tradução) (Síntese localizada do trecho oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Why this is an SEO decision, not just a tech one » (Tradução) (Síntese localizada do trecho nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The main thing: speed. A page that’s already a static file loads almost instantly. A page that has to be built on the server takes a moment. And Google has said plainly that if your site “responds quickly for a while, the limit goes up, meaning more connections can be used to crawl. If the site slows down… the limit goes down and Google crawls less.” So a slow deployment doesn’t just annoy users — it can mean Google reads less of your site. » (Tradução) (Síntese localizada do trecho dez, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## The simple version of the decision » (Tradução) (Síntese localizada do trecho onze, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
- Um site de conteúdo (blog, documentação, marketing) → use
adapter-statice faça prerender de tudo. O mais rápido possível, nada para quebrar. - Um site de conteúdo com alguns elementos dinâmicos (busca, comentários) → use
um adapter de servidor (
node/vercel/cloudflare) e marque suas páginas de conteúdo comprerender = true, deixando os elementos dinâmicos para renderizar sob demanda. - Um aplicativo ou dashboard com páginas personalizadas para usuários logados → renderize no servidor (SSR), faça prerender apenas das páginas públicas de marketing.
«## Don’t forget the two files SvelteKit won’t make for you » (Tradução) (Síntese localizada do trecho treze, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«SvelteKit doesn’t generate a sitemap.xml or a robots.txt automatically. You
add them yourself — usually as a small endpoint file (sitemap.xml/+server.js)
and either a file in your static/ folder or another endpoint for
robots.txt. Evidência desta afirmação SvelteKit can serve static assets from its static directory and create custom responses with +server route files. Escopo: Mechanisms for robots.txt and sitemap.xml; files are not generated automatically. Confiança: alta · Verificado: SvelteKit: Project structure SvelteKit: Routing It’s easy to forget because most frameworks that render HTML for
you feel “complete.” These two aren’t.
» (Tradução) (Síntese localizada do trecho catorze, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Want the deeper version — what each adapter does to rendering, how
prerender = 'auto' handles a mixed site, why edge functions can’t read files,
and how the sitemap strategy changes with your adapter? Switch to the
Avançado tab.
» (Tradução) (Síntese localizada do trecho quinze, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«> TL;DR — The adapter doesn’t change what SvelteKit renders — it changes
where and when: build-time static (
adapter-static), request-time on a server you run (adapter-node), or request-time on serverless/edge functions (adapter-vercel/-netlify/-cloudflare). Per-routeprerender = truebuilds static HTML and drops the route from the dynamic manifest;prerender = 'auto'prerenders and keeps it in the manifest — the tool for mixed/blog/[slug]sites. Edge runtimes run on V8 isolates: no Nodefs, and cold starts hurt TTFB, which feeds LCP and (per Google’s crawl-budget doc) crawl capacity. SvelteKit generates no sitemap.xml or robots.txt — build them as+server.jsendpoints, and note the strategy depends on the adapter. This is a narrower, deployment-focused companion to the SvelteKit SEO fundamentals article in this section; I assume you already know SvelteKit is SSR-by-default and won’t re-litigate that here. » (Tradução) (Síntese localizada do trecho dezoito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## The one idea that makes all of this click » (Tradução) (Síntese localizada do trecho dezenove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The adapter does not change what renders. It changes where and when.
That’s the whole thing. The SvelteKit docs put it precisely: adapters “take the
built app as input and generate output for deployment.” Evidência desta afirmação SvelteKit adapters take the built application as input and generate deployment-specific output. Escopo: Deployment output; adapter choice can still constrain supported runtime features. Confiança: alta · Verificado: SvelteKit: Adapters Your components, your
load functions, your <svelte:head> metadata — identical across every adapter.
What differs is:
» (Tradução) (Síntese localizada do trecho vinte, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«- When the HTML is produced: at build time (static/prerendered) or at request time (SSR on a server, serverless function, or edge function).
- Where it’s produced: on a single origin server, on a regional serverless function, or on an edge network close to the visitor. » (Tradução) (Síntese localizada do trecho vinte e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Everything below is a consequence of those two axes. » (Tradução) (Síntese localizada do trecho vinte e dois, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Why deployment choices are SEO choices » (Tradução) (Síntese localizada do trecho vinte e três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The chain is short and well-documented: TTFB → LCP → crawl capacity. » (Tradução) (Síntese localizada do trecho vinte e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Time to first byte is how long the host takes to start sending the response. A prerendered file served from a CDN cache has a near-zero TTFB. A server that has to render the page has a higher one. A cold-starting serverless or edge function can have a much higher one on the first hit. TTFB is a direct input to Largest Contentful Paint — you can’t paint what you haven’t received — and LCP is a Core Web Vitals signal. » (Tradução) (Síntese localizada do trecho vinte e cinco, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The crawl side is where Google is most explicit. From the crawl-budget documentation: “If the site responds quickly for a while, the limit goes up, meaning more connections can be used to crawl. If the site slows down or responds with server errors, the limit goes down and Google crawls less.” And the best-practice line: “Make your pages efficient to load. If Google can load and render your pages faster, we might be able to read more content from your site.” A cold-starting edge function that’s slow to respond is subject to the same dynamic as a slow origin server. » (Tradução) (Síntese localizada do trecho vinte e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«One honesty note up front: Google publishes no SvelteKit-specific guidance.
There’s no doc or Search Off the Record episode naming SvelteKit adapters,
prerender = 'auto', or edge cold starts. What I’m doing here is applying
Google’s general rendering and crawl-budget guidance to SvelteKit’s specific
mechanics — not quoting a rep who commented on SvelteKit, because none has. The
Google framing that “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” is the closest official anchor, and it’s framework-agnostic.
» (Tradução) (Síntese localizada do trecho vinte e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Choosing an adapter for SEO outcomes » (Tradução) (Síntese localizada do trecho vinte e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### adapter-auto — the zero-config default, and its ceiling
» (Tradução) (Síntese localizada do trecho vinte e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«New SvelteKit projects ship with adapter-auto. It detects the platform —
Vercel, Netlify, Cloudflare Pages, Azure, AWS — and installs the matching adapter
at build time. It’s a fine starting point, but there’s a hard ceiling worth
knowing: adapter-auto does not take any options. The moment you need
{ edge: true }, Cloudflare bindings, Vercel ISR, or any platform-specific
configuration, you install the underlying adapter (adapter-vercel,
adapter-cloudflare, etc.) directly. Treat auto as a scaffold, not a production
decision.
» (Tradução) (Síntese localizada do trecho trinta, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### adapter-static — full SSG, for content-first sites
» (Tradução) (Síntese localizada do trecho trinta e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«adapter-static prerenders your whole site to static files at build time. No
server runs; a host serves flat HTML. Evidência desta afirmação adapter-static prerenders a SvelteKit site as static files. Escopo: Routes must be prerenderable; performance outcomes depend on hosting and page design. Confiança: alta · Verificado: SvelteKit: Static site generation For a content-first site this is the
strongest SEO profile you can have — lowest TTFB, no cold starts, nothing to fall
over. The one requirement is the trap covered at length in the fundamentals
article: SSR must stay on during the build, or you get empty shells instead of
rendered HTML. I won’t re-explain that here beyond flagging it.
» (Tradução) (Síntese localizada do trecho trinta e dois, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The catch is rigidity. Anything that genuinely needs server logic per request (true search, per-user content, form handling without a third-party endpoint) can’t live on a purely static build — which is exactly what the next adapters are for. » (Tradução) (Síntese localizada do trecho trinta e três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### adapter-node — a server you control
» (Tradução) (Síntese localizada do trecho trinta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«adapter-node produces a standalone Node.js server. You run it, you scale it, you
own the TTFB. This is the most flexible option and the one with the fewest runtime
surprises — full Node APIs, including fs. It’s a good fit when you have
infrastructure already, need Node libraries that edge runtimes can’t run, or want
predictable (non-cold-starting) response times from a warm server. The tradeoff is
operational: you’re running a server, and its speed and uptime are now your crawl
capacity.
» (Tradução) (Síntese localizada do trecho trinta e cinco, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### adapter-vercel — serverless, edge, and ISR
» (Tradução) (Síntese localizada do trecho trinta e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«adapter-vercel deploys to Vercel’s serverless functions by default, with several
SEO-relevant levers set per route via export const config:
» (Tradução) (Síntese localizada do trecho trinta e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
runtime: 'edge'move essa rota para o runtime de edge da Vercel (mais abaixo).regionscontrola onde as funções serverless rodam — mais perto dos seus usuários (ou do seu banco de dados) significa menor latência.isrhabilita a Regeneração Estática Incremental:isr: { expiration: 60 }serve um ativo estático em cache e o regenera após a janela, dando “as vantagens de desempenho e custo de conteúdo pré-renderizado com a flexibilidade de conteúdo renderizado dinamicamente.” ISR é um verdadeiro quarto caminho entre puramente estático e puramente SSR — mas observe a ressalva da própria documentação: “Usar ISR em uma rota comexport const prerender = truenão terá efeito, pois a rota é pré-renderizada no momento do build.” ISR e prerender são alternativas, não empilháveis.
«### adapter-cloudflare — Workers/Pages, global edge
» (Tradução) (Síntese localizada do trecho trinta e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«adapter-cloudflare targets Cloudflare Workers and Pages — SSR on a global edge
network, often the lowest TTFB for a geographically spread audience. The important
constraint is the runtime: Workers run on V8 isolates, not Node. From the docs:
“You can’t use fs in Cloudflare Workers.” Some Node APIs work only behind the
nodejs_compat compatibility flag, and even then support isn’t one-to-one. If you
were reading files at request time (a redirect map, a data file, custom OG-image
inputs), that code needs a rethink — covered in the edge section below.
» (Tradução) (Síntese localizada do trecho quarenta, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«(The older adapter-cloudflare-workers is deprecated; new projects use
adapter-cloudflare, which handles both Workers and Pages. If you’re on the old
one, migrating is the recommended path.)
» (Tradução) (Síntese localizada do trecho quarenta e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### adapter-netlify — functions or Edge Functions (Deno)
» (Tradução) (Síntese localizada do trecho quarenta e dois, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«adapter-netlify deploys to Netlify’s Node-based functions by default, or to
Deno-based Edge Functions with edge: true. Same shape as Vercel: default
serverless with an edge opt-in. One SvelteKit-specific footnote — Netlify Forms
require the form’s page to be prerendered so Netlify can detect the form markup
at deploy time, which is a small “prerender this route” requirement layered on top
of the adapter choice.
» (Tradução) (Síntese localizada do trecho quarenta e três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### The decision, in one line each » (Tradução) (Síntese localizada do trecho quarenta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
- Site de conteúdo puro →
adapter-static, prerenderize tudo. - Site de conteúdo com áreas dinâmicas →
adapter-node/-vercel/-cloudflare,prerender = trueno conteúdo,false/'auto'nas rotas dinâmicas. - App/dashboard com personalização → SSR-first (node ou edge), prerenderize apenas o shell estático (marketing, login).
- Público global, crítico para TTFB → um adapter de edge para as rotas dinâmicas, aceitando as restrições de Node-API e a realidade do cold-start.
«(The Decision Tree tab walks this as a branching flow.) » (Tradução) (Síntese localizada do trecho quarenta e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Prerendering strategy for mixed sites » (Tradução) (Síntese localizada do trecho quarenta e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### What true / false / 'auto' actually do
» (Tradução) (Síntese localizada do trecho quarenta e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«export const prerender is a per-route (or per-layout) page option, and the three
values aren’t just on/off:
» (Tradução) (Síntese localizada do trecho quarenta e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
true— construa esta rota como HTML estático no momento da build. Criticamente, é “excluído dos manifests usados para SSR dinâmico, tornando seu servidor (ou funções serverless/edge) menor.” Uma vez prerenderizada, a rota não pode cair de volta para renderização dinâmica — é estática, ponto final.false— sempre renderize sob demanda. Sem arquivo estático.'auto'— a ferramenta para sites mistos. Ela prerenderiza a rota e a mantém no manifest do servidor dinâmico, para que a mesma rota possa ser servida estaticamente para caminhos conhecidos e renderizada no servidor para o restante. Isso é construído exatamente para o caso que a documentação descreve: uma rota como/blog/[slug]“onde você quer prerenderizar seu conteúdo mais recente/popular, mas renderizar no servidor a cauda longa.”
«Because prerendered routes shrink the server bundle, a mostly-prerendered site
with a few 'auto'/false routes deploys a smaller, cheaper, faster function —
an efficiency win independent of SEO.
» (Tradução) (Síntese localizada do trecho cinquenta e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### Dynamic routes need an entries function
» (Tradução) (Síntese localizada do trecho cinquenta e dois, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The prerender crawler discovers pages by following <a> links from your entry
points. That works for static routes, but a dynamic route like /blog/[slug] has
no fixed URL for the crawler to find. If nothing links to a given slug, SvelteKit
won’t know it exists — and you’ll hit the classic build error that routes “were
marked as prerenderable, but were not prerendered.”
» (Tradução) (Síntese localizada do trecho cinquenta e três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The fix is an explicit entries function (or config.kit.prerender.entries) that
enumerates the parameter values:
» (Tradução) (Síntese localizada do trecho cinquenta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
// src/routes/blog/[slug]/+page.server.js
export const prerender = true;
export function entries() {
return [
{ slug: 'hello-world' },
{ slug: 'sveltekit-deployment-seo' },
];
}«In practice you generate that list from your CMS or content directory. Without it, prerendering only covers the slugs the link crawler happens to find. » (Tradução) (Síntese localizada do trecho cinquenta e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### The /blog/[slug] pattern in the wild
» (Tradução) (Síntese localizada do trecho cinquenta e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Put the two together and you have the canonical mixed-site setup: prerender = 'auto' plus an entries function that returns your recent and popular posts.
Those get static HTML at build time; anything not in the list falls through to SSR
on demand. New posts render dynamically until the next build prerenders them. It’s
the pragmatic middle ground between “prerender all 40,000 posts every build” and
“render every post on every request.”
» (Tradução) (Síntese localizada do trecho cinquenta e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Edge runtime constraints that affect SEO » (Tradução) (Síntese localizada do trecho cinquenta e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### config.runtime = 'edge' is per-route (on Vercel)
» (Tradução) (Síntese localizada do trecho sessenta, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Edge isn’t an all-or-nothing switch. On Vercel it’s a per-route page option: » (Tradução) (Síntese localizada do trecho sessenta e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
// +page.server.js or +server.js
export const config = { runtime: 'edge' };«That means you can push high-traffic, cacheable routes to the edge for low TTFB while keeping Node-dependent routes on the standard serverless (Node) runtime in the same deployment. Mix deliberately. » (Tradução) (Síntese localizada do trecho sessenta e três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### No fs, no arbitrary Node APIs
» (Tradução) (Síntese localizada do trecho sessenta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The edge runtimes — Cloudflare Workers, Vercel Edge Functions, Netlify’s Deno Edge
Functions — don’t provide Node’s fs. Cloudflare’s docs: “You can’t use fs in
Cloudflare Workers.” Vercel’s: “You can’t use fs in edge functions.” Both point
to the same two escape hatches: use the read helper from $app/server to access
bundled assets, or “prerender the routes in question” so the file access happens
at build time instead of at request time.
» (Tradução) (Síntese localizada do trecho sessenta e cinco, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The SEO-adjacent cases where this bites: dynamic OG-image generation that reads a
font or template file, file-based redirect maps, or a sitemap endpoint that reads
content off disk. Any of those either moves to $app/server’s read() or moves to
prerender/build time. It’s not a blocker — it’s a “know before you pick edge”
constraint.
» (Tradução) (Síntese localizada do trecho sessenta e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### Cold starts and TTFB — when edge helps and when it doesn’t » (Tradução) (Síntese localizada do trecho sessenta e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Edge functions still cold-start. A cold edge function on its first request can be slower than a warm Node server, and dramatically slower than a prerendered file served from cache. Edge wins when the function stays warm or when it’s paired with aggressive caching so most requests never hit the function at all. It is not automatically the fastest option — “deploy to the edge” is not a synonym for “faster.” For a content site, prerendered static output beats edge SSR on TTFB every time, because there’s no function to start. » (Tradução) (Síntese localizada do trecho sessenta e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Generating sitemap.xml and robots.txt (SvelteKit won’t) » (Tradução) (Síntese localizada do trecho sessenta e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«This is the gap most SvelteKit tutorials skip and most audits catch. SvelteKit generates no sitemap.xml and no robots.txt automatically — regardless of adapter, regardless of how many pages you prerender. A fully static site with thousands of prerendered pages still ships with no sitemap unless you build one. » (Tradução) (Síntese localizada do trecho setenta, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### The +server.js endpoint pattern
» (Tradução) (Síntese localizada do trecho setenta e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The idiomatic sitemap is a route endpoint that returns XML with the right
Content-Type:
» (Tradução) (Síntese localizada do trecho setenta e dois, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
// src/routes/sitemap.xml/+server.js
export const prerender = true; // needed on adapter-static
export async function GET() {
const urls = await getAllUrls(); // from your CMS/content
const body = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
${urls.map((u) => ` <url><loc>${u}</loc></url>`).join('\n')}
</urlset>`;
return new Response(body, {
headers: { 'Content-Type': 'application/xml' },
});
}«### The strategy depends on your adapter » (Tradução) (Síntese localizada do trecho setenta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Here’s the part that ties this whole article together: your sitemap strategy is downstream of your adapter choice. » (Tradução) (Síntese localizada do trecho setenta e cinco, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«- On adapter-static, the sitemap endpoint needs export const prerender = true so it’s included in the static output — there’s no server at runtime to
generate it on request. It’s baked at build time, which means it’s only as fresh
as your last build.
- On a Node/serverless/edge adapter, the same endpoint can generate the sitemap
dynamically per request from your CMS or database — always current, no rebuild
needed. (On an edge adapter, remember the
fsconstraint: pull URLs from an API or binding, not a disk read.) » (Tradução) (Síntese localizada do trecho setenta e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«So the “should my sitemap be static or dynamic?” question isn’t a separate decision — it falls out of the adapter you already chose. » (Tradução) (Síntese localizada do trecho setenta e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### robots.txt: static file vs. endpoint » (Tradução) (Síntese localizada do trecho setenta e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Two options. Drop a plain robots.txt in your static/ folder (served at
/robots.txt automatically), which is the simplest choice and fine for most sites.
Or generate it from a src/routes/robots.txt/+server.js endpoint when you need it
to differ by environment (blocking crawlers on staging, allowing them in
production, for instance). Either way, don’t block your /_app/ bundle or CSS —
that breaks rendering for engines that do render.
» (Tradução) (Síntese localizada do trecho setenta e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«If you’re coming at this from the broader framework or JavaScript-SEO angle, the “where and when does rendering happen” logic here is the same logic that governs JavaScript SEO generally, and the SvelteKit fundamentals piece in this section covers the rendering modes and metadata patterns this article builds on top of. » (Tradução) (Síntese localizada do trecho oitenta, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## AI summary » (Tradução) (Síntese localizada do trecho oitenta e três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«A condensed take on the Advanced version: » (Tradução) (Síntese localizada do trecho oitenta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
- O adaptador muda onde e quando, não o quê. Adaptadores “pegam o aplicativo compilado como entrada e geram saída para implantação” — mesmo conteúdo, diferente tempo (build vs. tempo de requisição) e localização (origem vs. edge).
- Por que é uma decisão de SEO: TTFB → LCP → capacidade de rastreamento. Google: se um site “responde rapidamente… o limite aumenta… Se o site fica lento… o Google rastreia menos.” Nenhuma orientação do Google menciona SvelteKit especificamente — esta é uma orientação geral aplicada à mecânica do SvelteKit.
- Adaptadores:
adapter-auto(zero configuração, sem opções);adapter-static(SSG, sites de conteúdo, menor TTFB);adapter-node(servidor que você controla, APIs completas do Node);adapter-vercel(serverless + edge + ISR);adapter-cloudflare(Workers de edge global, semfs;adapter-cloudflare-workersestá obsoleto);adapter-netlify(functions ou Deno Edge Functions). - Prerender:
truegera HTML estático e remove a rota do manifesto dinâmico;falsesempre faz SSR;'auto'faz prerender e mantém dinâmico — a ferramenta para sites mistos em/blog/[slug](prerender dos populares, SSR da cauda longa). - Rotas dinâmicas precisam de uma função
entriesou você encontra o erro “marcadas como pré-renderizáveis, mas não foram pré-renderizadas”. - Restrições de edge:
runtime: 'edge'é por rota (Vercel); semfs(“Você não pode usar fs em Cloudflare Workers” / edge functions) — useread()de$app/serverou prerender; cold starts podem tornar o edge mais lento que um servidor aquecido ou arquivo estático. - Sem sitemap/robots.txt integrado. Crie um endpoint
sitemap.xml/+server.js(prerender = trueemadapter-static; dinâmico em adaptadores de servidor/edge). robots.txt viastatic/ou um endpoint. - ISR ≠ prerender-plus: “Usar ISR em uma rota com
export const prerender = truenão terá efeito.” São alternativas.
«## Official documentation » (Tradução) (Síntese localizada do trecho oitenta e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Primary-source documentation from SvelteKit and the search engines. » (Tradução) (Síntese localizada do trecho oitenta e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
SvelteKit
- Adapters • Documentação do SvelteKit — a visão geral: adaptadores pegam o aplicativo compilado e geram a saída de implantação.
- Zero-config deployments (adapter-auto) • Documentação do SvelteKit — detecção por plataforma e a limitação de “não aceita opções”.
- Node servers (adapter-node) • Documentação do SvelteKit — o servidor Node autônomo, variáveis de ambiente, desligamento gracioso.
- Static site generation (adapter-static) • Documentação do SvelteKit — SSG de site inteiro, o requisito de SSR e o aviso de SEO do fallback SPA.
- Vercel (adapter-vercel) • Documentação do SvelteKit —
runtimepor rota,regions,splite Regeneração Estática Incremental. - Cloudflare (adapter-cloudflare) • Documentação do SvelteKit — Workers/Pages, bindings
platform.env,nodejs_compate a limitação defs. - Cloudflare Workers (adapter-cloudflare-workers, obsoleto) • Documentação do SvelteKit — o adaptador legado obsoleto e o caminho de migração.
- Netlify (adapter-netlify) • Documentação do SvelteKit — Node Functions vs. Edge Functions baseadas em Deno (
edge: true) e o requisito de prerender para Forms. - Page options (prerender, ssr, csr, config) • Documentação do SvelteKit —
prerender = true/false/'auto', a funçãoentrieseconfigpor rota, incluindoruntime: 'edge'.
- Understand JavaScript SEO Basics — a fila de renderização e “nem todos os bots conseguem executar JavaScript.”
- Optimize your crawl budget — capacidade de rastreamento ligada à velocidade de resposta; “torne suas páginas eficientes para carregar.”
Bing / Microsoft
- Série bingbot: JavaScript, renderização dinâmica e cloaking. Oh, meu Deus! — A recomendação de pré-renderização/renderização dinâmica do Bing e o esclarecimento sobre cloaking.
- Desempenho rápido de front-end para o Microsoft Bing — A própria arquitetura de SSR + CDN/nós de borda do Bing como um ponto de prova no mundo real.
«## Quotes from the source » (Tradução) (Síntese localizada do trecho noventa e cinco, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«On-the-record statements from the SvelteKit docs, Google, and Bing. Each link is a deep link that jumps to the quoted passage on the source page. » (Tradução) (Síntese localizada do trecho noventa e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«SvelteKit docs — adapters & page options » (Tradução) (Síntese localizada do trecho noventa e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
- «adapter-auto não aceita nenhuma opção.» — sobre o adaptador padrão de configuração zero. Ir para a citação
- Em
prerender = true— rotas pré-renderizadas são «excluídas dos manifestos usados para SSR dinâmico, tornando seu servidor (ou funções serverless/edge) menor.» Ir para a citação - Em
'auto'— o caso/blog/[slug]em que você quer «pré-renderizar seu conteúdo mais recente/popular, mas renderizar no servidor a cauda longa.» Ir para a citação - Sobre a limitação de
fsna borda — «Você não pode usar fs em Cloudflare Workers.» Ir para a citação - Sobre Vercel ISR vs. pré-renderização — «Usar ISR em uma rota com export const prerender = true não terá efeito, pois a rota é pré-renderizada no momento da compilação.» Ir para a citação
«Google — rendering & crawl budget » (Tradução) (Síntese localizada do trecho noventa e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
- «Tenha em mente que a renderização no servidor ou a pré-renderização ainda é uma ótima ideia, pois torna seu site mais rápido para usuários e rastreadores, e nem todos os bots conseguem executar JavaScript.» Ir para a citação
- «Se o site responder rapidamente por um tempo, o limite aumenta, o que significa que mais conexões podem ser usadas para rastrear. Se o site ficar lento ou responder com erros de servidor, o limite diminui e o Google rastreia menos.» Ir para a citação
- «Torne suas páginas eficientes para carregar. Se o Google conseguir carregar e renderizar suas páginas mais rápido, talvez possamos ler mais conteúdo do seu site.» Ir para a citação
«Bing — prerendering & its own edge architecture » (Tradução) (Síntese localizada do trecho cento e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«- “We encourage detecting our bingbot user agent, prerendering the content on the server side and outputting static HTML for such sites…” — Fabrice Canel & Frédéric Dubut, Microsoft Bing. Jump to quote
- “User traffic routes first to the closest CDN node (called an ‘edge node’).” — Bing Search Quality Insights, on Bing’s own SSR + edge architecture. Jump to quote » (Tradução) (Síntese localizada do trecho cento e dois, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Note: the SvelteKit docs and Google’s/Bing’s pages are JavaScript-rendered and can resist automated text-fragment checking; these quotes were verified against the brief’s 2026-07-03 research pass, and the Bing quotes are relayed via that research — confirm them against the live pages before treating any deep link as final. No Google or Bing rep has commented on SvelteKit adapters specifically; the search-engine quotes are framework-agnostic guidance applied here to SvelteKit. » (Tradução) (Síntese localizada do trecho cento e três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## SvelteKit deployment SEO checklist » (Tradução) (Síntese localizada do trecho cento e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«A pass to confirm your adapter, prerender, and sitemap setup won’t hurt crawlers: » (Tradução) (Síntese localizada do trecho cento e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
- Você migrou do
adapter-autopara um adaptador explícito se precisar de qualquer configuração (edge, ISR, bindings). - O adaptador corresponde ao tipo de site —
adapter-staticpara conteúdo puro, um adaptador de servidor/edge para qualquer coisa com lógica por solicitação. - As rotas de conteúdo estão com
prerender = true(ou'auto'); apenas rotas genuinamente dinâmicas ficam para SSR. - Rotas dinâmicas mistas (
/blog/[slug]) usamprerender = 'auto'com uma funçãoentriesenumerando caminhos conhecidos. - Nenhum erro de build “marcado como pré-renderizável, mas não foi pré-renderizado” sem resolução.
- Se qualquer rota usar
runtime: 'edge', ela não chama ofsdo Node — o acesso a arquivos usaread()de$app/serverou é pré-renderizado. - Você considerou cold starts em edge/serverless — armazenável em cache, estático, ou aquecido onde TTFB importa.
- Um endpoint de sitemap.xml existe (
prerender = trueemadapter-static; dinâmico em adaptadores de servidor/edge). - Um robots.txt existe (em
static/ou como endpoint+server.js) e não bloqueia/_app/ou CSS. - Você não está tentando empilhar ISR em uma rota
prerender = true(não tem efeito). - Você verificou o HTML renderizado e a velocidade de resposta na Inspeção de URLs do GSC e no PageSpeed Insights.
«## The mental models » (Tradução) (Síntese localizada do trecho cento e onze, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«1. Where and when, not what. The adapter never changes your content — it changes when the HTML is made (build time vs. request time) and where (origin vs. edge). Every deployment SEO question reduces to those two axes. Ask them before you touch config. » (Tradução) (Síntese localizada do trecho cento e doze, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«2. Prerender removes a route from the server.
prerender = true isn’t just “make it static” — it takes the route out of the
dynamic manifest. That shrinks your function and rules out a dynamic fallback.
'auto' is the exception: prerendered and still in the manifest.
» (Tradução) (Síntese localizada do trecho cento e treze, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«3. The /blog/[slug] split.
The default pattern for real content sites: prerender the entries you can name
(entries function returns recent/popular), SSR the long tail. 'auto' is the
switch that makes both true at once.
» (Tradução) (Síntese localizada do trecho cento e catorze, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«4. Edge is a trade, not an upgrade.
Edge buys you geographic proximity (low TTFB when warm) and costs you Node APIs
(no fs) and cold-start risk. It beats a warm Node server only sometimes, and
loses to prerendered static output on TTFB always. Choose it for a reason, not by
default.
» (Tradução) (Síntese localizada do trecho cento e quinze, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«5. The sitemap follows the adapter.
“Static or dynamic sitemap?” isn’t a separate decision. adapter-static →
prerendered sitemap, fresh only at build. Server/edge adapter → per-request
sitemap, always current. The adapter already answered the question.
» (Tradução) (Síntese localizada do trecho cento e dezesseis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«6. Nothing generates the two files. SvelteKit makes no sitemap.xml and no robots.txt, for any adapter. If you didn’t write them, they don’t exist. Bake this into your launch checklist. » (Tradução) (Síntese localizada do trecho cento e dezessete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Which adapter + prerender combo should I pick? » (Tradução) (Síntese localizada do trecho cento e vinte, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The core “which path do I take?” question in SvelteKit deployment is how should this site ship? Walk your site through this: » (Tradução) (Síntese localizada do trecho cento e vinte e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«1. Does any page need per-request server logic — auth, personalization, live search, form handling, per-user data? → No (every page is the same for every visitor): go to 2. → Yes: skip to 3. » (Tradução) (Síntese localizada do trecho cento e vinte e dois, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«2. Pure content site (blog, docs, marketing).
→ Use adapter-static, set prerender = true site-wide (or in the root
layout). Add a prerendered sitemap.xml/+server.js (prerender = true) and a
static/robots.txt. Lowest TTFB, no cold starts, nothing to run. Stop here.
» (Tradução) (Síntese localizada do trecho cento e vinte e três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«3. Is the whole site dynamic, or just some routes? → Just some routes (mostly content, a few dynamic bits): go to 4. → Mostly/entirely dynamic (app, dashboard, ecommerce with per-user data): go to 5. » (Tradução) (Síntese localizada do trecho cento e vinte e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«4. Content site with dynamic pockets.
→ Use a server/edge adapter (adapter-node, -vercel, or
-cloudflare). Mark content routes prerender = true, dynamic routes
false. For /blog/[slug]-style routes with known-popular content, use
prerender = 'auto' + an entries function. Generate the sitemap dynamically
from your CMS. Done.
» (Tradução) (Síntese localizada do trecho cento e vinte e cinco, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«5. App / dashboard / ecommerce (SSR-first). Now pick where SSR runs:
→ Predictable latency, Node libraries, you have infra: adapter-node
(warm server, full Node APIs, no cold-start surprises).
→ Global audience, TTFB matters most, no heavy Node deps: an edge adapter
(adapter-cloudflare, or adapter-vercel with runtime: 'edge' per route) —
accept no fs (use $app/server’s read() or prerender) and cold starts.
Prerender only the truly static shell (marketing, login).
» (Tradução) (Síntese localizada do trecho cento e vinte e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Fourth path (Vercel only): if a route is “mostly static but occasionally
changes,” consider ISR (isr: { expiration }) instead of prerender = true
— never both, since “ISR on a route with export const prerender = true will have
no effect.”
» (Tradução) (Síntese localizada do trecho cento e vinte e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Should my sitemap be static or dynamic? » (Tradução) (Síntese localizada do trecho cento e vinte e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«On adapter-static? → Static/prerendered sitemap endpoint
(prerender = true). It’s baked at build; fine for sites that rebuild on publish.
» (Tradução) (Síntese localizada do trecho cento e vinte e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«On a Node/serverless/edge adapter? → Dynamic sitemap generated per request
from your CMS/DB — always current, no rebuild. (On edge, pull URLs from an API or
binding, not a disk fs read.)
» (Tradução) (Síntese localizada do trecho cento e trinta, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Never: ship no sitemap because “the pages are all static.” Static output and sitemap discoverability are unrelated — SvelteKit generates neither file for any adapter. » (Tradução) (Síntese localizada do trecho cento e trinta e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## SvelteKit deployment SEO — cheat sheet » (Tradução) (Síntese localizada do trecho cento e trinta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Adapters at a glance » (Tradução) (Síntese localizada do trecho cento e trinta e cinco, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«| Adapter | Renders | Runtime | SEO note |
| --- | --- | --- | --- |
| adapter-static | Build time (SSG) | none | Lowest TTFB, no cold starts; content sites |
| adapter-node | Request time (SSR) | Node | Full Node APIs (fs ✅); you run the server |
| adapter-vercel | Request time | serverless / edge | Per-route runtime, regions, ISR |
| adapter-cloudflare | Request time | V8 edge | Global edge; no fs; nodejs_compat |
| adapter-netlify | Request time | Node / Deno edge | edge: true for Deno Edge Functions |
| adapter-auto | (detects above) | — | Takes no options — scaffold only |
» (Tradução) (Síntese localizada do trecho cento e trinta e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Prerender values » (Tradução) (Síntese localizada do trecho cento e trinta e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«| Value | Static HTML? | In dynamic manifest? | Use for |
| --- | --- | --- | --- |
| true | ✅ | ❌ (removed) | Known static content routes |
| false | ❌ | ✅ | Genuinely dynamic routes |
| 'auto' | ✅ | ✅ | /blog/[slug] — prerender popular, SSR long tail |
» (Tradução) (Síntese localizada do trecho cento e trinta e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
Regras rápidas
- Rotas dinâmicas pré-renderizadas → adicione uma função
entries(ou enfrente o erro “not prerendered”). runtime: 'edge'é por rota (Vercel) — misture rotas edge e Node.- Edge = sem
fs→ useread()de$app/serverou pré-renderize. - Cold starts tornam o edge mais lento que um servidor aquecido / arquivo estático no primeiro acesso.
- ISR ≠ prerender —
isrem uma rota comprerender = truenão faz nada. - Sem sitemap/robots.txt automáticos — crie ambos.
prerender = trueno endpoint do sitemap paraadapter-static; dinâmico em servidor/edge. - Nunca bloqueie
/_app/ou CSS no robots.txt.
«## A prerendered route is missing from the deployment » (Tradução) (Síntese localizada do trecho cento e quarenta e dois, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Likely cause: the crawler could not discover the path, an entries value is absent, or prerendering failed. Fix: add crawlable links or explicit entries and treat build warnings as release failures. Confirm: the output manifest contains the route and production returns complete HTML.
» (Tradução) (Síntese localizada do trecho cento e quarenta e três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## adapter-static fails on a dynamic route
» (Tradução) (Síntese localizada do trecho cento e quarenta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Likely cause: the route cannot be fully enumerated at build time. Fix: supply finite entries, redesign the route, or use a server-capable adapter for that path. Confirm: the selected adapter builds and every representative route returns the intended response. » (Tradução) (Síntese localizada do trecho cento e quarenta e cinco, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Edge deployment throws filesystem or Node API errors » (Tradução) (Síntese localizada do trecho cento e quarenta e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Likely cause: route code or a dependency assumes Node features unavailable in the edge runtime. Fix: replace the dependency, move the work to a compatible service, or choose a Node adapter. Confirm: production SSR succeeds without runtime exceptions. » (Tradução) (Síntese localizada do trecho cento e quarenta e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Sitemap or robots.txt returns HTML » (Tradução) (Síntese localizada do trecho cento e quarenta e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Likely cause: a fallback route catches the endpoint or the +server handler sets the wrong body/headers. Fix: create explicit endpoint handlers with correct content types. Confirm: direct requests return the expected text/XML response and 200 status.
» (Tradução) (Síntese localizada do trecho cento e quarenta e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Metadata differs between prerendered and SSR routes » (Tradução) (Síntese localizada do trecho cento e cinquenta, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Likely cause: head data is loaded in different code paths or depends on browser state. Fix: centralize metadata generation from server/build-safe page data. Confirm: raw HTML for both route types contains equivalent title, canonical, and robots logic. » (Tradução) (Síntese localizada do trecho cento e cinquenta e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Confirm what your adapter actually shipped » (Tradução) (Síntese localizada do trecho cento e cinquenta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«The point of picking an adapter and prerendering is that a crawler gets fast, complete HTML. These checks confirm that’s what actually happened — from the raw response, not the browser. » (Tradução) (Síntese localizada do trecho cento e cinquenta e cinco, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### Is the page prerendered/SSR’d (content in raw HTML)? » (Tradução) (Síntese localizada do trecho cento e cinquenta e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«A plain curl runs no JavaScript, so it sees exactly what a non-rendering crawler
sees.
» (Tradução) (Síntese localizada do trecho cento e cinquenta e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«macOS / Linux » (Tradução) (Síntese localizada do trecho cento e cinquenta e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
# Raw HTML as the host sends it (no JS executed)
curl -sL "https://example.com/your-page/" -o raw.html
grep -o "Your unique headline text" raw.html # empty = CSR shell, not prerendered«Windows (PowerShell) » (Tradução) (Síntese localizada do trecho cento e cinquenta e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
Invoke-WebRequest -Uri "https://example.com/your-page/" -OutFile raw.html
Select-String -Path raw.html -Pattern "Your unique headline text"«### Is TTFB fast (or is a function cold-starting)? » (Tradução) (Síntese localizada do trecho cento e sessenta, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«TTFB feeds LCP and crawl capacity, so measure it. Hit the URL cold, then warm: » (Tradução) (Síntese localizada do trecho cento e sessenta e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
# Time to first byte, twice — a big first number then a small one = cold start
for i in 1 2; do
curl -s -o /dev/null -w "TTFB: %{time_starttransfer}s\n" "https://example.com/your-page/"
done«A prerendered/static page should be consistently low. A large first value that drops on the second hit is a classic serverless/edge cold start. » (Tradução) (Síntese localizada do trecho cento e sessenta e três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### Was this route prerendered or served dynamically? » (Tradução) (Síntese localizada do trecho cento e sessenta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Static hosts and CDNs usually reveal it in headers (cache status, age,
x-vercel-cache, cf-cache-status):
» (Tradução) (Síntese localizada do trecho cento e sessenta e cinco, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
curl -sI "https://example.com/your-page/" | grep -iE "cache|age|x-vercel|cf-"«A HIT (or a nonzero age) means you’re being served cached/prerendered content;
a MISS/DYNAMIC on every request means it’s rendering per request.
» (Tradução) (Síntese localizada do trecho cento e sessenta e sete, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«### Does the sitemap actually exist and return XML? » (Tradução) (Síntese localizada do trecho cento e sessenta e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Since SvelteKit doesn’t generate one, verify yours is really there with the right content type: » (Tradução) (Síntese localizada do trecho cento e sessenta e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
curl -sI "https://example.com/sitemap.xml" | grep -iE "HTTP/|content-type"
# Want: 200 + content-type: application/xml (not text/html or a 404)«### DevTools console one-liner » (Tradução) (Síntese localizada do trecho cento e setenta e um, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Paste in the browser console to compare rendered DOM against what a crawler needs —
if your headline is here but missing from the curl output above, it’s
client-rendered:
» (Tradução) (Síntese localizada do trecho cento e setenta e dois, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
// Is the content in the DOM, and does the sitemap resolve?
console.log('headline in DOM:', document.body.innerText.includes('Your unique headline text'));
fetch('/sitemap.xml').then(r => console.log('sitemap status:', r.status, r.headers.get('content-type')));«### Check robots.txt isn’t blocking the bundle » (Tradução) (Síntese localizada do trecho cento e setenta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
curl -sL "https://example.com/robots.txt" | grep -iE "disallow.*(/_app|\.js|\.css)"«A Disallow matching /_app/ (SvelteKit’s bundled output) or your CSS means
engines can’t render the page — almost always a mistake.
» (Tradução) (Síntese localizada do trecho cento e setenta e seis, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Tools for debugging SvelteKit deployment SEO » (Tradução) (Síntese localizada do trecho cento e setenta e nove, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
- URL Inspection (Google Search Console) — a fonte da verdade. Teste uma URL ao vivo e verifique o HTML renderizado, a captura de tela e os recursos da página para confirmar que o conteúdo e os metadados estão presentes e que nada está bloqueado.
- PageSpeed Insights — a ferramenta recomendada pela própria documentação do SvelteKit; revela o TTFB e os Core Web Vitals (LCP/INP/CLS) que a sua escolha de adapter mais afeta.
- WebPageTest — waterfall + filmstrip para diagnosticar o TTFB e o tempo de cold start em deploys de edge/serverless.
curl -w "%{time_starttransfer}"— a verificação bruta mais rápida de TTFB e cold start (veja a aba Scripts).- Dashboards do host (Vercel / Cloudflare / Netlify Analytics) — contagens de invocação de funções, taxas de cold start e índices de cache hit por rota — a verdade absoluta para saber se edge/serverless é realmente rápido para você.
- Screaming Frog SEO Spider — rastreie com renderização de JS ligada/desligada para comparar o HTML bruto vs. renderizado em todo o site e confirmar que as rotas pré-renderizadas estão completas.
- Ahrefs Site Audit — revela sitemaps ausentes/bloqueados, cadeias de redirecionamento, canônicos quebrados e problemas de indexabilidade em escala.
«## Test yourself: SvelteKit Deployment SEO » (Tradução) (Síntese localizada do trecho cento e oitenta e três, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«Five quick questions on adapters, prerendering, and edge rendering in SvelteKit. Pick an answer for each, then check. » (Tradução) (Síntese localizada do trecho cento e oitenta e quatro, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
«## Resources worth your time » (Tradução) (Síntese localizada do trecho cento e oitenta e oito, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
Meus escritos relacionados
- JavaScript SEO: A Definitive Guide — minha referência completa sobre modos de renderização (SSR, renderização estática, pré-renderização e as armadilhas de CSR) que sustentam cada decisão de adapter aqui. Como eu disse lá, qualquer tipo de configuração de SSR, renderização estática ou pré-renderização vai funcionar bem para os mecanismos de busca — que é exatamente a rede de segurança por trás dessas escolhas de adapter.
- The Beginner’s Guide to Technical SEO — onde renderização, rastreamento e Core Web Vitals se encaixam no panorama geral.
«My speaking
- How Search Works (SlideShare) — my walkthrough of crawling, rendering, indexing, and ranking, which is the backdrop for why TTFB and rendering timing matter. (My standing disclaimer applies: “This is my understanding of systems… not going to be 100% complete or accurate.”) » (Tradução) (Síntese localizada do trecho cento e noventa, parte um: o texto-fonte foi preservado para conferência na revisão nativa.)
Da indústria
- Adapters • SvelteKit Docs — a visão geral autoritativa de cada adapter oficial e como eles são especificados no
svelte.config.js. - Page options (prerender, ssr, csr, config) • SvelteKit Docs — os valores de
prerenderpor rota, a funçãoentriese oconfigpor rota, incluindoruntime: 'edge', nas próprias palavras da equipe. - Vercel (adapter-vercel) • SvelteKit Docs — o runtime de edge, as regiões e a ressalva sobre ISR vs. pré-renderização.
- Cloudflare (adapter-cloudflare) • SvelteKit Docs — deploy em Workers/Pages, bindings e a limitação do
fs. - SvelteKit • Cloudflare Pages docs — a mecânica de deploy e os bindings de
platformdo lado da Cloudflare. - SvelteKit SEO: Your Secret Weapon (Okupter) — um guia prático sobre pré-renderização, meta tags e o padrão de sitemap/RSS com
+server.js. - A Deep Dive into SvelteKit’s Rendering Techniques (This Dot Labs) — mecânicas de SSR/SSG/CSR e configuração por rota/layout, com a ressalva de que “SSR pode ser caro” no server load.
- Understand JavaScript SEO Basics (Google Search Central) — a fila de renderização e “nem todos os bots conseguem executar JavaScript”, a orientação geral sob a qual cada escolha de adapter se encaixa.
Registro de alterações
Atualizado em 3 de set. de 2026.
Resumo editorial e detalhes registrados da alteração.Detalhes da alteração
-
As notas detalhadas sobre as alterações estão disponíveis atualmente em inglês.
-
As notas detalhadas sobre as alterações estão disponíveis atualmente em inglês.
Não é possível fazer a comparação completa — nenhum instantâneo anterior foi arquivado para esta revisão.