SvelteKit Deployment SEO: Adapters, Prerendering, và Edge Kết xuất

SvelteKit adapter và theo-route prerender settings decide nơi và khi của bạn các trang render — và đó drives TTFB, LCP, và ngân sách crawl. MỘT deployment-focused deep dive: chọn adapter-static/node/vercel/cloudflare/netlify, prerender = đúng/sai/'auto', edge-runtime constraints, và building sitemap.xml và robots.txt.

Xuất bản lần đầu: 3 thg 7, 2026 · Cập nhật lần cuối: 8 thg 8, 2026 · Advanced
Ngôn ngữ

SvelteKit adapter và theo-route prerender setting decide nơi và khi một trang renders — static HTML tại xây dựng time, SSR on một máy chủ, hoặc SSR tại đó edge — và đó decision drives TTFB, mà feeds LCP và crawl capacity. Pick adapter-static cho pure nội dung các trang, một node/vercel/cloudflare adapter với theo-route prerender cho mixed nội dung-plus-app các trang, và an edge adapter khi global TTFB matters (accepting cold bắt đầu và không Node fs). prerender = 'auto' là đó mixed-site tool. Edge runtimes không thể đọc đó filesystem. Và SvelteKit generates không sitemap.xml hoặc robots.txt — bạn xây dựng những as +máy chủ.js endpoints, với đó strategy depending on của bạn adapter.

Tóm tắt — adapter không thay đổi Điều gì SvelteKit renders — nó thay đổi nơiKhi: xây dựng-time static (adapter-static), yêu cầu-time on máy chủ bạn chạy (adapter-node), hoặc yêu cầu-time on serverless/edge functions (adapter-vercel/-netlify/-cloudflare). Theo-route prerender = true xây dựng static HTML và drops route từ dynamic manifest; prerender = 'auto' prerenders giữ nó trong manifest — tool cho mixed /blog/[slug] các trang. Edge runtimes chạy on V8 isolates: không Node fs, và cold bắt đầu hurt TTFB, mà feeds LCP và (theo Google crawl-budget doc) crawl capacity. SvelteKit generates không sitemap.xml hoặc robots.txt — xây dựng them as +server.js endpoints, và note strategy phụ thuộc vào adapter. Đây là hẹp hơn, deployment-focused companion để SvelteKit SEO fundamentals bài viết trong điều này section; I assume bạn đã know SvelteKit là SSR-by-default và sẽ không re-litigate đó ở đây.

một ý tưởng đó làm tất cả điều này nhấp

Đó adapter làm không thay đổi điều gì renders. Điều này thay đổi nơikhi. đó là đó toàn bộ điều. Đó SvelteKit tài liệu put điều này precisely: adapters “take the built app as input and generate output for deployment.” (bản dịch) «take đó được xây dựng app as input và generate output cho deployment.» Evidence for this claim SvelteKit adapters take the built application as input and generate deployment-specific output. Scope: Deployment output; adapter choice can still constrain supported runtime features. Confidence: high · Verified: SvelteKit: Adapters Của bạn components, của bạn load functions, của bạn <svelte:head> metadata — giống hệt trên mỗi adapter. Điều gì differs là:

  • Khi HTML là produced: tại xây dựng time (static/prerendered) hoặc tại yêu cầu time (SSR on máy chủ, serverless function, hoặc edge function).
  • nơi nó produced: on single origin máy chủ, on regional serverless function, hoặc on edge network close để khách truy cập.

Mọi thứ dưới là consequence của những điều đó hai axes.

Vì sao deployment choices là SEO choices

chain là ngắn và well-được ghi lại: TTFB → LCP → crawl capacity.

Time để đầu tiên byte là Cách dài host takes để bắt đầu sending phản hồi. prerendered file phân phối từ CDN bộ nhớ đệm có near-zero TTFB. máy chủ đó có để render trang có cao hơn một. cold-starting serverless hoặc edge function có thể có nhiều cao hơn một on đầu tiên hit. TTFB là trực tiếp input để Largest Contentful Paint — Bạn có thể’t paint Điều gì bạn haven’t đã nhận — và LCP là Cốt lõi Web Chỉ số quan trọng tín hiệu.

Đó crawl side là nơi Google là hầu hết rõ ràng. Từ đó crawl-budget tài liệu: “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.” (bản dịch) «Nếu đó site responds quickly cho một trong khi, đó limit goes lên, meaning hơn connections có thể là được dùng để crawl. Nếu đó site làm chậm xuống hoặc responds với máy chủ các lỗi, đó limit goes xuống và Google crawl ít hơn.» Và đó 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.” (bản dịch) «Làm của bạn các trang efficient để load. Nếu Google có thể load và render của bạn các trang nhanh hơn, we có thể là able để đọc hơn nội dung từ trang web của bạn.» MỘT cold-starting edge function đó là chậm để respond là subject để đó giống nhau dynamic as một chậm origin máy chủ.

Một honesty note lên front: Google publishes không SvelteKit-cụ thể hướng dẫn. có không doc hoặc Tìm kiếm Off đó Record episode naming SvelteKit adapters, prerender = 'auto', hoặc edge cold bắt đầu. Điều gì I’m đang làm ở đây là applying Google chung kết xuất và crawl-budget hướng dẫn để SvelteKit cụ thể mechanics — không quoting một rep ai commented on SvelteKit, vì none có. Đó Google cách diễn đạt đó “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” (bản dịch) «máy chủ-side hoặc pre-kết xuất là vẫn một great ý tưởng vì điều này làm của bạn website nhanh hơn cho người dùng và các crawler, và không all bots có thể chạy JavaScript» là đó closest chính thức anchor, và đây là framework-agnostic.

Chọn adapter Đối với SEO outcomes

adapter-auto — zero-config default, và của nó ceiling

New SvelteKit projects ship với adapter-auto. nó detects nền tảng — Vercel, Netlify, Cloudflare các trang, Azure, AWS — và installs matching adapter tại xây dựng time. nó fine starting point, nhưng có hard ceiling worth knowing: adapter-auto không take bất kỳ options. moment bạn cần { edge: true }, Cloudflare bindings, Vercel ISR, hoặc bất kỳ nền tảng-cụ thể configuration, bạn install underlying adapter (adapter-vercel, adapter-cloudflare, etc.) trực tiếp. Treat auto as scaffold, không production decision.

adapter-static — đầy đủ SSG, cho nội dung-đầu tiên các trang

adapter-static prerenders của bạn toàn bộ trang web để static files tại xây dựng time. Không máy chủ chạy; host phục vụ flat HTML. Evidence for this claim adapter-static prerenders a SvelteKit site as static files. Scope: Routes must be prerenderable; performance outcomes depend on hosting and page design. Confidence: high · Verified: SvelteKit: Static site generation cho nội dung-đầu tiên trang web Đây là strongest SEO profile Bạn có thể có — lowest TTFB, không cold bắt đầu, không có gì để fall over. một requirement là trap covered tại length trong fundamentals bài viết: SSR phải stay on during xây dựng, hoặc bạn nhận rỗng shells thay vì được kết xuất HTML. I sẽ không re-giải thích đó ở đây beyond flagging nó.

catch là rigidity. Bất cứ điều gì đó genuinely cần máy chủ logic theo yêu cầu (đúng tìm kiếm, theo-người dùng nội dung, form xử lý không có thứ ba-party điểm cuối) có thể’t trực tiếp on purely static xây dựng — mà là chính xác Điều gì tiếp theo adapters là cho.

adapter-node — máy chủ bạn control

adapter-node produces standalone Node.js máy chủ. bạn chạy nó, bạn quy mô nó, bạn own TTFB. Đây là phần lớn flexible option và một với fewest runtime surprises — đầy đủ Node APIs, including fs. nó good fit Khi bạn có infrastructure đã, cần Node libraries đó edge runtimes có thể’t chạy, hoặc muốn dễ dự đoán (non-cold-starting) phản hồi times từ warm máy chủ. tradeoff là operational: bạn’re đang chạy máy chủ, và của nó speed và uptime là hiện tại của bạn crawl capacity.

adapter-vercel — serverless, edge, và ISR

adapter-vercel deploys để Vercel serverless functions theo mặc định, với several SEO-relevant levers đặt theo route qua export const config:

  • runtime: 'edge' moves đó route để Vercel edge runtime (hơn dưới).
  • regions controls nơi serverless functions chạy — closer để người dùng của bạn (hoặc của bạn database) có nghĩa là thấp hơn latency.
  • isr enables Incremental Static Regeneration: isr: { expiration: 60 } serves một được lưu đệm static asset và regenerates điều này sau đó window, giving “the performance and cost advantages of prerendered content with the flexibility of dynamically rendered content.” (bản dịch) «đó performance và cost advantages of prerendered nội dung với đó flexibility of dynamically được kết xuất nội dung.» ISR là một genuine fourth path giữa pure-static và pure-SSR — nhưng note đó tài liệu’ own caveat: “Using ISR on a route with export const prerender = true will have no effect, since the route is prerendered at build time.” (bản dịch) «Dùng ISR on một route với sẽ có không effect, since đó route là prerendered tại xây dựng time.» ISR và prerender là alternatives, không stackable.

adapter-cloudflare — Workers/các trang, global edge

adapter-cloudflare targets Cloudflare Workers và Các trang — SSR on một global edge network, thường đó lowest TTFB cho một geographically spread audience. Đó quan trọng constraint là đó runtime: Workers chạy on V8 isolates, không Node. Từ đó tài liệu: “You can’t use fs in Cloudflare Workers.” (bản dịch) «Bạn không thể dùng fs trong Cloudflare Workers.» Some Node APIs hoạt động chỉ behind đó nodejs_compat compatibility flag, và ngay cả thì hỗ trợ không một-để-một. Nếu bạn đã là reading files tại yêu cầu time (một chuyển hướng map, một dữ liệu file, custom OG-image inputs), đó code cần một rethink — covered trong đó edge section dưới.

( older adapter-cloudflare-workersdeprecated; new projects sử dụng adapter-cloudflare, mà xử lý cả hai Workers và các trang. nếu bạn’re on old một, migrating là được khuyến nghị path.)

adapter-netlify — functions hoặc Edge Functions (Deno)

adapter-netlify deploys để Netlify Node-based functions theo mặc định, hoặc để Deno-based Edge Functions với edge: true. Giống nhau shape as Vercel: default serverless với an edge opt-trong. Một SvelteKit-cụ thể footnote — Netlify Forms require đó form trang để là prerendered so Netlify có thể detect đó form markup tại deploy time, mà là một nhỏ “prerender this route” (bản dịch) «prerender này route» requirement layered on top of đó adapter lựa chọn.

decision, trong một line mỗi

  • Pure nội dung trang webadapter-static, prerender mọi thứ.
  • nội dung trang web với dynamic pocketsadapter-node/-vercel/-cloudflare, prerender = true on nội dung, false/'auto' on dynamic routes.
  • App/dashboard với personalization → SSR-đầu tiên (node hoặc edge), prerender chỉ static shell (marketing, login).
  • Global, TTFB-cốt yếu audience → edge adapter cho dynamic routes, accepting Node-API constraints và cold-bắt đầu reality.

( Cây quyết định tab walks điều này as branching flow.)

Prerendering strategy cho mixed các trang

Điều gì true / false / 'auto' thực ra làm

export const prerender là theo-route (hoặc theo-layout) trang option, và three các giá trị không phải chỉ on/off:

  • true — xây dựng này route để static HTML tại xây dựng time. Critically, đây là “excluded from manifests used for dynamic SSR, making your server (or serverless/edge functions) smaller.” (bản dịch) «excluded từ manifests dùng cho dynamic SSR, đang làm máy chủ của bạn (hoặc serverless/edge functions) nhỏ hơn.» Khi prerendered, đó route không thể fall lại để dynamic kết xuất — đây là static, đầy đủ dừng.
  • false — luôn render on yêu cầu. Không static file.
  • 'auto' — đó mixed-site tool. Điều này prerenders đó route giữ điều này trong đó dynamic máy chủ manifest, so đó giống nhau route có thể là phân phối statically cho known paths và máy chủ-được kết xuất cho đó rest. Này là được xây dựng cho chính xác đó case đó tài liệu mô tả: một route như /blog/[slug] “where you want to prerender your most recent/popular content but server-render the long tail.” (bản dịch) «nơi bạn muốn để prerender của bạn hầu hết gần đây/popular nội dung nhưng máy chủ-render đó dài tail.»

vì prerendered routes shrink máy chủ bundle, mostly-prerendered trang web với một vài 'auto'/false routes deploys nhỏ hơn, cheaper, nhanh hơn function — efficiency win independent của SEO.

Dynamic routes cần entries function

Đó prerender crawler discovers các trang by sau <a> links từ của bạn entry points. Đó hoạt động cho static routes, nhưng một dynamic route như /blog/[slug] có không fixed URL cho đó crawler để tìm. Nếu không có gì links để một được cho slug, SvelteKit sẽ không know điều này tồn tại — và bạn’ll hit đó classic xây dựng lỗi đó routes “were marked as prerenderable, but were not prerendered.” (bản dịch) «đã là marked as prerenderable, nhưng đã là không prerendered.»

khắc phục là rõ ràng entries function (hoặc config.kit.prerender.entries) đó enumerates parameter các giá trị:

// src/routes/blog/[slug]/+page.server.js
export const prerender = true;

export function entries() {
  return [
    { slug: 'hello-world' },
    { slug: 'sveltekit-deployment-seo' },
  ];
}

trên thực tế bạn generate đó list từ của bạn CMS hoặc nội dung directory. không có nó, prerendering chỉ covers slugs link crawler happens để tìm.

/blog/[slug] pattern trong wild

Put đó hai together và bạn có đó canonical mixed-site setup: prerender = 'auto' plus an entries function đó trả về của bạn gần đây và popular posts. Những nhận static HTML tại xây dựng time; bất cứ điều gì không trong đó list falls qua để SSR on demand. New posts render dynamically until đó tiếp theo xây dựng prerenders them. đây là đó thực dụng middle ground giữa “prerender all 40,000 posts every build” (bản dịch) «prerender all 40 000 posts mỗi xây dựng» và “render every post on every request.” (bản dịch) «render mỗi post on mỗi yêu cầu.»

Edge runtime constraints đó ảnh hưởng SEO

config.runtime = 'edge' là theo-route (on Vercel)

Edge không phải all-hoặc-không có gì chuyển. On Vercel nó theo-route trang option:

// +page.server.js or +server.js
export const config = { runtime: 'edge' };

đó có nghĩ là Bạn có thể push cao-traffic, có thể lưu vào bộ nhớ đệm routes để edge cho thấp TTFB trong khi giữ Node-phụ thuộc routes on tiêu chuẩn serverless (Node) runtime trong giống nhau deployment. Mix có chủ ý.

Không fs, không arbitrary Node APIs

Đó edge runtimes — Cloudflare Workers, Vercel Edge Functions, Netlify Deno Edge Functions — không cung cấp Node fs. Cloudflare’s tài liệu: “You can’t use fs in Cloudflare Workers.” (bản dịch) «Bạn không thể dùng fs trong Cloudflare Workers.» Vercel: “You can’t use fs in edge functions.” (bản dịch) «Bạn không thể dùng fs trong edge functions.» Cả hai point để đó giống nhau hai escape hatches: dùng đó read helper từ $app/server để access bundled assets, hoặc “prerender the routes in question” (bản dịch) «prerender đó routes trong câu hỏi» so đó file access happens tại xây dựng time thay vì tại yêu cầu time.

Đó SEO-liền kề cases nơi này bites: dynamic OG-image generation đó đọc một font hoặc template file, file-based chuyển hướng maps, hoặc một sitemap endpoint đó đọc nội dung off disk. Bất kỳ of những either moves để $app/server’s read() hoặc moves để prerender/xây dựng time. đây là không một blocker — đây là một “know before you pick edge” (bản dịch) «know trước khi bạn pick edge» constraint.

Cold bắt đầu và TTFB — Khi edge helps và Khi nó không

Edge functions vẫn cold-bắt đầu. MỘT cold edge function on của nó đầu tiên yêu cầu có thể là chậm hơn hơn một warm Node máy chủ, và dramatically chậm hơn một prerendered file phân phối từ bộ nhớ đệm. Edge wins khi đó function vẫn giữ warm hoặc khi đây là paired với aggressive bộ nhớ đệm so hầu hết các yêu cầu không bao giờ hit đó function tại all. Điều này là không tự động đó fastest option — “deploy to the edge” (bản dịch) «deploy để đó edge» không phải một synonym cho “nhanh hơn.” Cho một nội dung site, prerendered static output beats edge SSR on TTFB mỗi khi, vì có không function để bắt đầu.

Generating sitemap.xml và robots.txt (SvelteKit sẽ không)

Đây là khoảng trống phần lớn SvelteKit tutorials skip và phần lớn audits catch. SvelteKit generates không sitemap.xml và không robots.txt tự động — regardless của adapter, regardless của Cách nhiều các trang bạn prerender. fully static trang web với thousands của prerendered các trang vẫn ships với không sitemap trừ khi bạn xây dựng một.

+server.js điểm cuối pattern

idiomatic sitemap là route điểm cuối đó trả về XML với right Content-Type:

// 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' },
  });
}

strategy phụ thuộc vào của bạn adapter

Ở đây part đó ties điều này toàn bộ bài viết together: của bạn sitemap strategy là downstream của bạn adapter lựa chọn.

  • On adapter-static, đó sitemap endpoint cần export const prerender = true so đây là được bao gồm trong đó static output — có không máy chủ tại runtime để generate điều này on yêu cầu. đây là baked tại xây dựng time, mà có nghĩa là đây là chỉ as fresh as của bạn cuối cùng xây dựng.
  • On một Node/serverless/edge adapter, đó giống nhau endpoint có thể generate đó sitemap dynamically theo yêu cầu từ của bạn CMS hoặc database — luôn hiện tại, không rebuild needed. (On an edge adapter, remember đó fs constraint: pull URLs từ an API hoặc binding, không một disk đọc.)

So đó “should my sitemap be static or dynamic?” (bản dịch) «nên my sitemap là static hoặc dynamic?» câu hỏi không một tách biệt decision — điều này falls out of đó adapter bạn đã chose.

robots.txt: static file so với. điểm cuối

Hai options. Drop đơn giản robots.txt trong của bạn static/ folder (phân phối tại /robots.txt tự động), mà là simplest lựa chọn và fine cho phần lớn các trang. hoặc generate nó từ src/routes/robots.txt/+server.js điểm cuối Khi bạn cần nó để differ by environment (blocking các crawler on staging, allowing them trong production, chẳng hạn). Either way, không block của bạn /_app/ bundle hoặc CSS — đó breaks kết xuất cho engines đó làm render.

Nếu bạn là coming tại này từ đó rộng hơn framework hoặc JavaScript-SEO angle, đó “where and when does rendering happen” (bản dịch) «nơi và khi làm kết xuất happen» logic ở đây là đó giống nhau logic đó governs JavaScript SEO generally, và đó SvelteKit fundamentals piece trong này section covers đó kết xuất modes và metadata patterns này bài viết xây dựng on top of.

Add an expert note

Pin an expert quote

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