Hướng dẫn về Svelte SEO

Svelte alone là client-side được kết xuất — nội dung không trong đó thô HTML. SvelteKit các cách sửa đó với SSR theo mặc định. Kết xuất modes, svelte:head, load functions, adapters, sitemaps, và đó SPA-chế độ trap.

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

Svelte SEO hinges on một phân biệt: đơn giản Svelte là client-side được kết xuất (một blank HTML shell), trong khi SvelteKit renders on đó máy chủ theo mặc định và ships đầy đủ HTML. Dùng SvelteKit cho bất cứ điều gì đó cần để xếp hạng. Manage metadata với svelte:head, fetch SEO dữ liệu trong +trang.máy chủ.js load functions, pick đó right adapter, và không bao giờ ship SPA fallback chế độ (ssr: sai) — đó SvelteKit tài liệu themselves warn điều này có lớn negative SEO impacts.

TL;DR — Svelte SEO là thực sự một SvelteKit conversation. Bare Svelte là CSR-chỉ — nội dung không trong đó thô HTML. SvelteKit defaults để SSR, hỗ trợ prerendering (SSG) theo route, và cho phép bạn mix modes. Manage metadata với <svelte:head> và feed điều này từ +page.server.js load functions so điều này lands trong đó ban đầu HTML. Đó sharpest trap: adapter-static với ssr: false làm không prerender — điều này produces empty shells; SSR phải stay on during đó xây dựng. SvelteKit own tài liệu warn SPA fallback có “large negative performance and SEO impacts.” (bản dịch) «lớn negative performance và SEO impacts.» Dùng History API routing (đó default), configure trailingSlash, và pick an adapter để match — static cho nội dung, node/vercel/cloudflare cho SSR.

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 Guide

Svelte không phải SvelteKit — và Đối với SEO đó mọi thứ

Svelte là compiler. nó turns của bạn .svelte components vào lean vanilla JavaScript với không virtual DOM và không runtime library shipped để trình duyệt. đó cho Svelte thực performance edge — nhưng nó bundle-size optimization, không kết xuất một. đơn giản Svelte app (Vite-bundled, không meta-framework) là vẫn client-side-được kết xuất SPA: máy chủ trả về blank HTML shell và trình duyệt constructs trang. View nguồn on một và của bạn nội dung không phải ở đó.

Đây là #1 nguồn của confusion Khi mọi người tìm kiếm “Svelte SEO.” compile step không put nội dung trong HTML. SvelteKit làm. SvelteKit là Svelte chính thức meta-framework — tương đương của tiếp theo.js cho React hoặc Nuxt cho Vue — và nó renders các trang on máy chủ theo mặc định, shipping fully populated HTML trước khi bất kỳ JavaScript chạy. nó adds SSR, static prerendering, file-based routing, load functions, và deployment adapters. headline: bare Svelte = CSR-chỉ; SvelteKit = SSR-đầu tiên. Mọi thứ khác trong điều này hướng dẫn assumes SvelteKit.

Hai scoping notes worth stating precisely, vì họ là nơi generic “Svelte SEO” advice dẫn đến sai lầm: SvelteKit kết xuất options (ssr, csr, prerender, trailingSlash) là set theo route và inherit hierarchically — một +layout.js hoặc +layout.server.js có thể set một default cho mọi thứ beneath điều này, và một child route có thể override điều này. So “is this SvelteKit site SEO-friendly” (bản dịch) «là này SvelteKit site SEO-friendly» không một project-cấp độ câu hỏi; kiểm tra đó cụ thể route. Và of SvelteKit kết xuất options, đây là cụ thể ssr: false — không SSR đang merely absent, và không “using SvelteKit” (bản dịch) «dùng SvelteKit» nhìn chung — đó tài liệu tie để an empty output: “If you set ssr to false, it renders an empty ‘shell’ page instead.” (bản dịch) «Nếu bạn set để , điều này renders an empty ‘shell’ trang thay vì.» Này hướng dẫn là hiện tại cho Svelte 5.x và SvelteKit 2.x (đó hiện tại majors as of này cập nhật); Svelte 5 đã làm runes đó default reactivity model, nhưng runes là một component-authoring concern, không một kết xuất chế độ — they không thay đổi bất kỳ of đó SEO hướng dẫn dưới.

Vì sao đó kết xuất chế độ matters xuất hiện straight từ cách các công cụ tìm kiếm hoạt động. Google xử lý JavaScript trong three phases — crawling, kết xuất, và lập chỉ mục — và “all pages with a 200 HTTP status code are sent to the rendering queue, no matter whether JavaScript is present on the page.” (bản dịch) «all các trang với một HTTP mã trạng thái là đã gửi để đó kết xuất queue, không quan trọng liệu JavaScript là present on đó trang.» Đó render queue adds một delay, và as Google own hướng dẫn diễn đạt điều này, “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.» Đó cuối cùng clause là đang làm một lot of hoạt động trong 2026 — see đó AI-crawler section.

four kết xuất modes trong SvelteKit

SvelteKit strength là đó kết xuất là theo-route decision qua trang options. những điều này options là hierarchical: đặt default trong +layout.js/+layout.server.js và mỗi nested route inherits nó, trừ khi child route exports của nó own giá trị để override nó. kiểm tra option đó thực ra áp dụng để cụ thể route bạn care về — không chỉ giá trị đặt tại top của project.

  • SSR (đó default). Các trang là được kết xuất máy chủ-side và đó đầy đủ HTML là trong đó ban đầu phản hồi. Best cho dynamic, personalized, hoặc frequently thay đổi nội dung. Này là on trừ khi bạn turn điều này off.
  • Prerender (export const prerender = true). Các trang là generated as static HTML tại xây dựng time. Maximum speed và maximum crawlability — ideal cho blog posts, tài liệu, và marketing các trang. Crucially, prerendering là SSR chạy tại xây dựng time, so SSR phải vẫn enabled cho điều này để hoạt động.
  • SPA fallback (ssr: false). MỘT single-trang-app shell với không máy chủ kết xuất. Đó SvelteKit tài liệu là blunt đó này chế độ “has large negative performance and SEO impacts” (bản dịch) «có lớn negative performance và SEO impacts» và là thực sự meant cho điều như wrapping trong một mobile app — không cho nội dung bạn muốn được lập chỉ mục.
  • Hybrid. Mix modes theo route: prerender của bạn marketing các trang, SSR của bạn sản phẩm các trang, chạy an SPA-style admin behind một login. Này là SvelteKit killer feature — bạn không pick một kết xuất chế độ cho đó toàn bộ site.

ssr: false trap ( mistake để tránh)

Này là đó hầu hết expensive misunderstanding trong SvelteKit SEO, so điều này nhận của nó own section. Mọi người reach cho adapter-static để “make a static site,” (bản dịch) «làm một static site,» và thì set ssr: false thinking họ là getting prerendered HTML. They không.

Prerendering máy chủ-side kết xuất executed tại xây dựng time. Nếu bạn disable SSR, có không có gì để render — đó tài liệu là rõ ràng đó ssr: false “renders an empty ‘shell’ page instead,” (bản dịch) «renders an empty ‘shell’ trang thay vì,» và đó là chính xác điều gì adapter-static thì ships as của bạn prerendered output. Đó nội dung chỉ xuất hiện khi đó client-side JavaScript chạy, mà diễn đạt bạn right lại trong CSR territory (với all của nó crawler các vấn đề) despite có một “static” xây dựng. Đó rule: với adapter-static, leave ssr on (của nó default) so prerendering outputs real HTML. Dùng ssr: false chỉ khi bạn genuinely muốn an SPA shell và accept đó SEO cost.

Managing metadata với <svelte:head>

SvelteKit có special element, <svelte:head>, đó injects nội dung vào document <head> — và bạn không cần thứ ba-party library để manage của bạn tiêu đề và meta tags. mỗi trang nên có unique <title><meta name="description">, plus canonical, Open Graph, Twitter Card, hreflang, robots directives, và JSON-LD as needed.

pattern tài liệu chính thức khuyến nghị cho dynamic metadata:

  1. trả về SEO metadata từ +page.server.js load() function.
  2. Access nó qua page.data trong của bạn layout.
  3. Render nó trong <svelte:head> trong root +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>

nếu bạn’d rather sử dụng component wrapper, thứ ba-party svelte-seo package wraps <svelte:head> với props cho phổ biến tags — nhưng nó convenience, không requirement.

<svelte:head> nhận của bạn tags vào head; nó không verify bạn đã nhận them right. đó vẫn của bạn job: xác nhận mỗi route renders unique tiêu đề và mô tả (không một inherited từ layout by accident), đó canonical bạn emit là consistent giữa trực tiếp-yêu cầu HTML và Điều gì client-side navigation renders, và đó robots directives và JSON-LD là present trong thô phản hồi — không chỉ visible sau khi hydration.

Load functions: nơi bạn fetch SEO dữ liệu matters

Đây là metadata bug đó bites mọi người. +page.server.js load() chạy on máy chủ, so của nó dữ liệu là trong ban đầu HTML phản hồi. +page.js load() chạy on máy chủ cho đầu tiên render và on client during client-side navigation. mistake là fetching của bạn tiêu đề/mô tả/canonical trong <script> block với onMount() — đó chạy client-side chỉ, so ban đầu HTML ships với không metadata và crawler sees không có gì on đầu tiên fetch. Fetch SEO-cốt yếu dữ liệu trong load function (máy chủ load cho bất cứ điều gì đó phải là trong đầu tiên phản hồi), không trong onMount.

không assume file name alone proves boundary, though — +page.js load() cũng chạy on máy chủ cho đầu tiên yêu cầu, sau đó re-chạy client-side on navigation, và của nó trả về giá trị có để survive serialization để là reused safely on client. nếu SEO-cốt yếu dữ liệu bao giờ phụ thuộc vào giá trị đó không phải safely serializable, verify cả hai trực tiếp-yêu cầu HTML và client-navigated view của giống nhau route, không chỉ một hoặc khác.

Routing và URL structure

  • File-based routing với [param] cho dynamic segments cho bạn sạch, dễ dự đoán các URL.
  • History API routing là default — SvelteKit không sử dụng hash/fragment routing, và đó chính xác Điều gì bạn muốn. Google có thể’t reliably resolve hash-based (#/page) các URL, so History API routing là SEO-safe lựa chọn và SvelteKit làm nó default.
  • trailingSlash trong svelte.config.js accepts 'always', 'never', hoặc 'ignore'. SvelteKit xử lý canonical chuyển hướng cho bạn, nhưng leaving nó misconfigured (especially 'ignore') có thể tạo duplicate-nội dung variants. Pick một và là consistent.
  • Dynamic routes bạn muốn prerendered cần entries function để enumerate paths tại xây dựng time, hoặc SvelteKit sẽ không know mà các URL để generate.

Chọn adapter Đối với SEO

adapter decides Cách và nơi của bạn SvelteKit app là deployed, và đó có SEO consequences (mostly qua TTFB, mà feeds LCP):

AdapterKết xuấtSEO implication
adapter-staticđầy đủ SSGĐúng static HTML cho mỗi trang; không máy chủ needed; ideal cho nội dung-nặng các trang (giữ ssr on!)
adapter-nodeSSR on Node máy chủDynamic SSR, đầy đủ flexibility; bạn chạy máy chủ
adapter-vercelSSR + edgeSSR với tùy chọn edge functions; edge TTFB helps LCP
adapter-cloudflareSSR on WorkersEdge SSR globally — potentially fastest TTFB/LCP
adapter-netlifySSR + CDNSimilar profile để Vercel

cho blog hoặc tài liệu trang web, adapter-static với prerendering cho bạn maximum speed và crawlability. cho dynamic các trang, adapter-cloudflare hoặc adapter-vercel put SSR tại edge, mà có thể shrink TTFB và help Largest Contentful Paint — nhưng adapter chỉ picks deployment shape. Thực tế TTFB phụ thuộc vào của bạn dữ liệu fetching, bộ nhớ đệm, và runtime cold-bắt đầu behavior, so đo lường deployed trang rather hơn assuming adapter alone delivers win.

adapter là boundary, không chỉ deploy đích: streaming, filesystem, bộ nhớ đệm, edge/runtime APIs, các chuyển hướng, và lỗi xử lý có thể all behave differently giữa adapters. route đó looks đúng với local dev máy chủ hoặc adapter-node không phải guaranteed để behave identically sau khi deployed qua adapter-cloudflare hoặc adapter-vercel — kiểm thử production xây dựng on thực tế đích, không chỉ npm run preview.

Sitemaps và robots.txt

SvelteKit có không được xây dựng-trong sitemap hoặc robots.txt — như headless setup, bạn xây dựng them explicitly.

  • Sitemap, manual: tạo src/routes/sitemap.xml/+server.js đó trả về XML. Thêm export const prerender = true nếu bạn’re on adapter-static.
  • Sitemap, dynamic: máy chủ-được kết xuất điểm cuối đó các truy vấn của bạn CMS/database và trả về fresh XML on mỗi yêu cầu — best cho lớn hoặc fast-thay đổi các trang.
  • Sitemap, packages: svelte-sitemap scans routes post-xây dựng (cho SSG), và sveltekit-static-sitemap generates từ prerendered routes.
  • robots.txt: drop static file trong static/ (phân phối tại /robots.txt tự động) hoặc generate nó từ src/routes/robots.txt/+server.js điểm cuối. Whichever bạn chọn, không block của bạn .js/.css — Google sẽ không render từ blocked files.

Performance và Core Web Vitals

SvelteKit compiler và framework mechanics cho bạn một structural head bắt đầu on performance, và Core Web Vitals là một xếp hạng input — nhưng đó mechanics themselves không bảo đảm một score. Đó compiler outputs vanilla JS với không virtual DOM và không runtime library, so một typical SvelteKit trang ships ít hơn JavaScript hơn an tương đương React-based app; tự động theo-route code splitting, được xây dựng-trong asset và link preloading, file-hashing cho dài-lived bộ nhớ đệm, và edge deployment qua several adapters là all khả dụng. Điều gì bạn xây dựng với những mechanics — trang weight, image xử lý, bên thứ ba scripts, hydration cost, và đó deployment đích bạn thực ra chọn — vẫn decides của bạn measured CWV và của bạn thứ hạng. Treat đó framework as removing obstacles, không as delivering đó kết quả. Đó SvelteKit tài liệu point bạn tại đó right việc đo lường tools: “Google’s PageSpeed Insights and WebPageTest are excellent ways to understand the performance characteristics of a site.” (bản dịch) «Google PageSpeed Insights và WebPageTest là excellent ways để understand đó performance characteristics of một site.» Image optimization là khả dụng qua @sveltejs/enhanced-img.

AI các crawler và SSR imperative

Ở đây đó 2026 wrinkle đó older SvelteKit SEO các hướng dẫn miss. Kết xuất behavior cho GPTBot (OpenAI), ClaudeBot (Anthropic), PerplexityBot, và đó Bingbot fetch behind Copilot là provider- và version-cụ thể, và hiện tại provider tài liệu không establish một shared render step bạn có thể rely on. Treat “generally fetches static HTML without executing JavaScript” (bản dịch) «generally fetches static HTML không có executing JavaScript» as đó safe planning assumption, không một bảo đảm về mỗi provider forever. MỘT CSR route (bare Svelte, hoặc SvelteKit với ssr: false) ships mỗi một of những các crawler đó giống nhau empty shell một đầu tiên-fetch Googlebot yêu cầu sees; SvelteKit default SSR diễn đạt nội dung của bạn trong đó thô HTML so không crawler có để phụ thuộc on một render step tại all. đó là đó argument cho giữ SSR on cho bất cứ điều gì bạn muốn AI các hệ thống để see — không một promise đó SSR bảo đảm inclusion trong an AI câu trả lời, mà phụ thuộc vào factors well beyond kết xuất.

phổ biến SvelteKit SEO mistakes

  • Fetching SEO dữ liệu trong onMount() thay vì máy chủ load function — metadata không phải trong ban đầu HTML.
  • Shipping SPA fallback chế độ (ssr: false) cho nội dung bạn muốn được xếp hạng.
  • adapter-static với ssr: false — rỗng shells, không prerendered các trang.
  • Blocking JS/CSS trong robots.txt — breaks kết xuất.
  • Skipping trailingSlash configuration — duplicate-nội dung variants.
  • sử dụng hash/fragment routing — Googlebot có thể’t resolve những điều đó các URL (SvelteKit History API default đã bảo vệ bạn ở đây).

nếu bạn’re coming tại điều này từ rộng hơn framework angle, Svelte/SvelteKit là một của decoupled frontends headless CMS pairs với, và kết xuất-chế độ logic ở đây là giống nhau logic đó governs JavaScript SEO generally — những điều đó topics trực tiếp alongside điều này một trong cluster.

Add an expert note

Pin an expert quote

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