Panduan Svelte SEO
Svelte alone adalah client-side rendered — konten isn't di raw HTML. SvelteKit fixes itu dengan SSR oleh default. rendering modes, svelte:head, muat functions, adapters, sitemaps, dan SPA-mode trap.
Bahasa
Svelte SEO hinges pada one distinction: plain Svelte adalah client-side rendered (sebuah blank HTML shell), while SvelteKit renders pada server oleh default dan ships full HTML. gunakan SvelteKit untuk anything itu perlu untuk peringkat. Manage metadata dengan svelte:head, fetch SEO data di +halaman.server.js muat functions, pick right adapter, dan tidak pernah ship SPA fallback mode (ssr: salah) — SvelteKit docs themselves warn ini memiliki besar negative SEO impacts.
Evidence for this claim The article's described svelte-seo capabilities must be evaluated against the platform's current documentation rather than assumed to be search-engine behavior. Scope: Platform-specific capability documentation. Confidence: high · Verified: SvelteKit page options Evidence for this claim Regardless of platform, Google needs crawlable URLs, accessible rendered content, descriptive metadata, and valid search directives. Scope: Google requirements independent of platform. Confidence: high · Verified: Google Search Central: SEO Starter GuideTL;DR — paling penting thing untuk know tentang Svelte SEO adalah itu Svelte dan SvelteKit adalah not yang sama thing. Plain Svelte membangun halaman di pengunjung’s browser, so mesin pencari pertama see sebuah blank shell. SvelteKit — Svelte’s official framework — membangun halaman pada server dan mengirim finished HTML. gunakan SvelteKit untuk anything Anda ingin peringkat.
Svelte vs. SvelteKit
Svelte adalah sebuah alat untuk membangun pengguna interfaces. ini adalah clever: alih-alih shipping sebuah big JavaScript library untuk browser, ini compiles Anda components down untuk kecil, plain JavaScript di bangun time. itu membuat Svelte halaman fast.
tetapi “fast” (terjemahan) “fast” dan “search-friendly” (terjemahan) “search-friendly” aren’t yang sama thing. sebuah plain Svelte app adalah client-side rendered — server mengirim sebuah nearly empty halaman, dan JavaScript fills di konten once ini memuat di browser. jika sebuah crawler looks di raw HTML, there’s almost nothing there.
SvelteKit adalah official framework dibangun pada top dari Svelte. ini melakukan thing itu penting sebagian besar untuk SEO: ini renders Anda halaman pada server pertama, so HTML itu arrives sudah memiliki Anda konten, Anda heading, dan Anda tautan di ini. ini adalah default perilaku. jika Anda’re membangun sebuah situs itu perlu untuk tampilkan up di Google, Anda ingin SvelteKit, not bare Svelte.
Why ini penting untuk search
- Google dapat run JavaScript, so ini akan eventually see sebuah client-rendered Svelte halaman — tetapi there’s sebuah delay, dan delay hurts fresh konten.
- Bing dan lainnya mesin pencari adalah less reliable di running JavaScript.
- AI crawler (GPTBot, ClaudeBot, PerplexityBot, dan similar) umumnya fetch static HTML, dan rendering perilaku varies oleh provider dan perubahan di atas time — saat ini provider documentation doesn’t establish one shared render langkah Anda dapat count pada filling di sebuah blank shell.
SvelteKit’s rendering sisi server sidesteps semua dari ini. konten adalah di HTML dari start, so setiap jenis dari crawler dapat read ini without depending pada sebuah render langkah ini dapat atau dapat not perform.
sederhana checklist
- bangun dengan SvelteKit, not plain Svelte, untuk konten itu perlu untuk peringkat.
- Give setiap halaman sebuah unique
<title>dan<meta name="description">menggunakan SvelteKit’s<svelte:head>element. - Don’t turn off rendering sisi server (don’t gunakan “SPA mode” (terjemahan) “SPA mode”) untuk halaman Anda ingin ditemukan.
- buat sitemap dan sebuah
robots.txt(SvelteKit doesn’t membuat ini untuk Anda). - Don’t block Anda JavaScript atau CSS files di
robots.txt.
ingin deeper versi — four rendering modes, adapter trade-offs,
ssr: false trap, dan muat-function pattern untuk metadata? Switch untuk
Advanced tab.
Evidence for this claim The article's described svelte-seo capabilities must be evaluated against the platform's current documentation rather than assumed to be search-engine behavior. Scope: Platform-specific capability documentation. Confidence: high · Verified: SvelteKit page options Evidence for this claim Regardless of platform, Google needs crawlable URLs, accessible rendered content, descriptive metadata, and valid search directives. Scope: Google requirements independent of platform. Confidence: high · Verified: Google Search Central: SEO Starter GuideTL;DR — Svelte SEO adalah really sebuah SvelteKit conversation. Bare Svelte adalah CSR-hanya — konten isn’t di raw HTML. SvelteKit defaults untuk SSR, mendukung prerendering (SSG) per route, dan lets Anda mix modes. Manage metadata dengan
<svelte:head>dan feed ini dari+page.server.jsmuat functions so ini lands di initial HTML. sharpest trap:adapter-staticdenganssr: falsemelakukan not prerender — ini produces empty shells; SSR harus stay pada selama bangun. SvelteKit’s own docs warn SPA fallback memiliki “large negative performance and SEO impacts.” (terjemahan) “besar negative performa dan SEO impacts.” gunakan History API routing ( default), configuretrailingSlash, dan pick sebuah adapter untuk match — static untuk konten, node/vercel/cloudflare untuk SSR.
Svelte adalah not SvelteKit — dan untuk SEO itu’s everything
Svelte adalah sebuah compiler. ini turns Anda .svelte components ke lean vanilla
JavaScript dengan no virtual DOM dan no runtime library shipped untuk browser. itu
gives Svelte sebuah nyata performa edge — tetapi ini adalah sebuah bundle-size optimization, not sebuah
rendering one. sebuah plain Svelte app (Vite-bundled, no meta-framework) adalah masih sebuah
client-side-rendered SPA: server mengembalikan sebuah blank HTML shell dan browser
constructs halaman. View source pada one dan Anda konten isn’t there.
ini adalah #1 source dari confusion when people search “Svelte SEO.” (terjemahan) “Svelte SEO.” compile langkah doesn’t put konten di HTML. SvelteKit melakukan. SvelteKit adalah Svelte’s official meta-framework — equivalent dari Next.js untuk React atau Nuxt untuk Vue — dan ini renders halaman pada server oleh default, shipping fully populated HTML sebelum apa pun JavaScript runs. ini menambahkan SSR, static prerendering, file-based routing, muat functions, dan deployment adapters. headline: bare Svelte = CSR-hanya; SvelteKit = SSR-pertama. Everything else di ini guide assumes SvelteKit.
Two scoping notes worth stating precisely, because mereka’re where generic “Svelte
SEO” (terjemahan) “Svelte
SEO” advice goes wrong: SvelteKit’s rendering options (ssr, csr, prerender,
trailingSlash) adalah set per route dan inherit hierarchically — sebuah +layout.js
atau +layout.server.js dapat set sebuah default untuk everything beneath ini, dan sebuah child
route dapat override ini. So “is this SvelteKit site SEO-friendly” (terjemahan) “adalah ini SvelteKit situs SEO-friendly” isn’t sebuah
project-tingkat pertanyaan; periksa spesifik route. dan dari SvelteKit’s rendering
options, ini adalah specifically ssr: false — not SSR menjadi merely absent, dan not
“using SvelteKit” (terjemahan) “menggunakan SvelteKit” di umum — itu docs tie untuk sebuah empty output: “If you set
ssr to false, it renders an empty ‘shell’ page instead.” (terjemahan) “jika Anda set
undefined untuk undefined, ini renders sebuah empty ‘shell’ halaman instead.” ini guide adalah saat ini
untuk Svelte 5.x dan SvelteKit 2.x ( saat ini majors sebagai dari ini update); Svelte 5
dibuat runes default reactivity model, tetapi runes adalah sebuah component-authoring
concern, not sebuah rendering mode — mereka don’t perubahan apa pun dari SEO guidance below.
Why rendering mode penting comes straight dari how mesin pencari berfungsi. Google
processes JavaScript di three phases — crawling, rendering, dan pengindeksan — dan
“all pages with a 200 HTTP status code are sent to the rendering queue, no matter
whether JavaScript is present on the page.” (terjemahan) “semua halaman dengan sebuah undefined HTTP kode status adalah dikirim untuk rendering queue, no penting
whether JavaScript adalah present pada halaman.” render queue menambahkan sebuah delay, dan sebagai
Google’s own guidance puts ini, “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.” (terjemahan) “server-side atau pre-rendering adalah masih sebuah great idea
because ini membuat Anda situs web faster untuk pengguna dan crawler, dan not semua bot dapat
run JavaScript.” itu last clause adalah doing sebuah lot dari berfungsi di 2026 — see
AI-crawler bagian.
four rendering modes di SvelteKit
SvelteKit’s strength adalah itu rendering adalah sebuah per-route decision via halaman options.
ini options adalah hierarchical: set sebuah default di sebuah +layout.js/+layout.server.js
dan setiap nested route inherits ini, unless sebuah child route exports -nya own nilai untuk
override ini. periksa option itu actually applies untuk spesifik route Anda care
tentang — not hanya nilai set di top dari project.
- SSR ( default). halaman adalah rendered server-side dan full HTML adalah di initial respons. Best untuk dynamic, personalized, atau frequently changing konten. ini adalah pada unless Anda turn ini off.
- Prerender (
export const prerender = true). halaman adalah generated sebagai static HTML di bangun time. Maximum speed dan maximum crawlability — ideal untuk blog posts, docs, dan marketing halaman. Crucially, prerendering adalah SSR run di bangun time, so SSR harus remain enabled untuk ini untuk berfungsi. - SPA fallback (
ssr: false). sebuah single-halaman-app shell dengan no server rendering. SvelteKit docs adalah blunt itu ini mode “has large negative performance and SEO impacts” (terjemahan) “memiliki besar negative performa dan SEO impacts” dan adalah really dimaksudkan untuk things like wrapping di sebuah mobile app — not untuk konten Anda ingin terindeks. - Hybrid. Mix modes per route: prerender Anda marketing halaman, SSR Anda product halaman, run sebuah SPA-style admin behind sebuah login. ini adalah SvelteKit’s killer fitur — Anda tidak pick one rendering mode untuk whole situs.
ssr: false trap ( mistake untuk hindari)
ini adalah paling expensive misunderstanding di SvelteKit SEO, so ini gets -nya own
bagian. People reach untuk adapter-static untuk “make a static site,” (terjemahan) “membuat sebuah static situs,” dan lalu set
ssr: false thinking mereka’re getting prerendered HTML. mereka aren’t.
Prerendering adalah rendering sisi server executed di bangun time. jika Anda disable SSR,
ada nothing untuk render — docs adalah explicit itu ssr: false “renders an
empty ‘shell’ page instead,” (terjemahan) “renders sebuah
empty ‘shell’ halaman instead,” dan itu’s exactly what adapter-static lalu ships sebagai
Anda prerendered output. konten hanya appears once client-side JavaScript runs,
which puts Anda right back di CSR territory (dengan semua -nya crawler masalah) despite
having sebuah “static” (terjemahan) “static” bangun. aturan: dengan adapter-static, leave ssr pada (-nya
default) so prerendering outputs nyata HTML. gunakan ssr: false hanya when Anda
genuinely ingin sebuah SPA shell dan accept SEO cost.
Managing metadata dengan <svelte:head>
SvelteKit memiliki sebuah special element, <svelte:head>, itu injects konten ke
document <head> — dan Anda tidak perlu sebuah ketiga-party library untuk manage Anda judul
dan meta tags. setiap halaman seharusnya memiliki sebuah unique <title> dan
<meta name="description">, plus canonical, Open Graph, Twitter Card, hreflang,
robots directives, dan JSON-LD sebagai needed.
pattern official docs recommend untuk dynamic metadata:
- kembalikan SEO metadata dari sebuah
+page.server.jsload()function. - Access ini via
page.datadi Anda layout. - Render ini di
<svelte:head>di 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>jika Anda’d rather gunakan component wrapper, ketiga-party
svelte-seo package wraps <svelte:head>
dengan props untuk umum tags — tetapi ini adalah sebuah convenience, not sebuah requirement.
<svelte:head> gets Anda tags ke head; ini doesn’t verify Anda got them right.
itu’s masih Anda job: confirm setiap route renders sebuah unique judul dan
deskripsi (not one inherited dari layout oleh accident), itu canonical
Anda emit adalah consistent antara direct-permintaan HTML dan what sebuah client-side
navigation renders, dan itu robots directives dan JSON-LD adalah present di raw
respons — not hanya terlihat setelah hydration.
muat functions: where Anda fetch SEO data penting
ini adalah metadata bug itu bites people. +page.server.js load() runs pada
server, so -nya data adalah di initial HTML respons. +page.js load() runs pada
server untuk pertama render dan pada client selama client-side navigation.
mistake adalah fetching Anda judul/deskripsi/canonical di sebuah <script> block dengan
onMount() — itu runs client-side hanya, so initial HTML ships dengan no
metadata dan crawler sees nothing pada pertama fetch. Fetch SEO-critical data di
sebuah load function (server muat untuk anything itu harus menjadi di pertama respons), not
di onMount.
Don’t assume file name alone proves boundary, though — +page.js load()
juga runs pada server untuk pertama permintaan, lalu re-runs client-side pada
navigation, dan -nya kembalikan nilai memiliki untuk survive serialization untuk menjadi reused safely
pada client. jika SEO-critical data ever depends pada sebuah nilai itu isn’t safely
serializable, verify both direct-permintaan HTML dan sebuah client-navigated view dari
yang sama route, not hanya one atau lainnya.
Routing dan struktur URL
- File-based routing dengan
[param]untuk dynamic segments gives Anda clean, predictable URLs. - History API routing adalah default — SvelteKit doesn’t gunakan hash/fragment
routing, dan itu’s exactly what Anda ingin. Google dapat’t reliably resolve
hash-based (
#/page) URLs, so History API routing adalah SEO-safe choice dan SvelteKit membuat ini default. trailingSlashdisvelte.config.jsaccepts'always','never', atau'ignore'. SvelteKit handles canonical redirect untuk Anda, tetapi leaving ini misconfigured (terutama'ignore') dapat buat duplicate-konten variants. Pick one dan menjadi consistent.- Dynamic routes Anda ingin prerendered perlu sebuah
entriesfunction untuk enumerate paths di bangun time, atau SvelteKit won’t know which URLs untuk generate.
Choosing sebuah adapter untuk SEO
adapter decides how dan where Anda SvelteKit app adalah deployed, dan itu memiliki SEO consequences (mostly via TTFB, which feeds LCP):
| Adapter | rendering | SEO implication |
|---|---|---|
adapter-static | Full SSG | benar static HTML untuk setiap halaman; no server needed; ideal untuk konten-heavy situs (pertahankan ssr pada!) |
adapter-node | SSR pada sebuah Node server | Dynamic SSR, full flexibility; Anda run sebuah server |
adapter-vercel | SSR + edge | SSR dengan optional edge functions; edge TTFB helps LCP |
adapter-cloudflare | SSR pada Workers | Edge SSR globally — potentially fastest TTFB/LCP |
adapter-netlify | SSR + CDN | Similar profile untuk Vercel |
untuk sebuah blog atau docs situs, adapter-static dengan prerendering gives Anda maximum speed
dan crawlability. untuk dynamic situs, adapter-cloudflare atau adapter-vercel put SSR
di edge, which dapat shrink TTFB dan help Largest Contentful Paint — tetapi
adapter hanya picks deployment shape. Actual TTFB depends pada Anda data fetching,
caching, dan runtime’s cold-start perilaku, so mengukur deployed halaman rather
daripada assuming adapter alone delivers win.
sebuah adapter adalah sebuah boundary, not hanya sebuah deploy target: streaming, filesystem,
caching, edge/runtime APIs, redirects, dan error handling dapat semua behave differently
antara adapters. sebuah route itu looks correct dengan local dev server atau
adapter-node isn’t guaranteed untuk behave identically once deployed melalui
adapter-cloudflare atau adapter-vercel — test production bangun pada actual
target, not hanya npm run preview.
Sitemaps dan robots.txt
SvelteKit memiliki no dibangun-di sitemap atau robots.txt — like sebuah headless setup, Anda bangun them explicitly.
- Sitemap, manual: buat
src/routes/sitemap.xml/+server.jsitu mengembalikan XML. tambahkanexport const prerender = truejika Anda’re padaadapter-static. - Sitemap, dynamic: sebuah server-rendered endpoint itu kueri Anda CMS/database dan mengembalikan fresh XML pada setiap permintaan — best untuk besar atau fast-changing situs.
- Sitemap, packages:
svelte-sitemapscans routes post-bangun (untuk SSG), dansveltekit-static-sitemapgenerates dari prerendered routes. - robots.txt: drop sebuah static file di
static/(disajikan di/robots.txtautomatically) atau generate ini dari sebuahsrc/routes/robots.txt/+server.jsendpoint. Whichever Anda choose, don’t block Anda.js/.css— Google won’t render dari blocked files.
performa dan Core Web Vitals
SvelteKit’s compiler dan framework mechanics give Anda sebuah structural head start pada
performa, dan Core Web Vitals adalah sebuah peringkat input — tetapi mechanics themselves
don’t guarantee sebuah score. compiler outputs vanilla JS dengan no virtual DOM dan no
runtime library, so sebuah typical SvelteKit halaman ships less JavaScript daripada sebuah
equivalent React-based app; automatic per-route code splitting, dibangun-di asset dan
tautan preloading, file-hashing untuk panjang-lived caching, dan edge deployment via
several adapters adalah semua available. What Anda bangun dengan itu mechanics — halaman
weight, image handling, ketiga-party scripts, hydration cost, dan deployment
target Anda actually choose — masih decides Anda diukur CWV dan Anda rankings.
Treat framework sebagai menghapus obstacles, not sebagai delivering hasil.
SvelteKit docs poin Anda di right pengukuran alat:
“Google’s PageSpeed Insights and WebPageTest are excellent ways to understand the
performance characteristics of a site.” (terjemahan) “Google’s PageSpeed Insights dan WebPageTest adalah excellent cara untuk memahami
performa characteristics dari sebuah situs.” Image optimization adalah available via
@sveltejs/enhanced-img.
AI crawler dan SSR imperative
Here’s 2026 wrinkle older SvelteKit SEO guides miss. rendering perilaku untuk
GPTBot (OpenAI), ClaudeBot (Anthropic), PerplexityBot, dan Bingbot fetch behind
Copilot adalah provider- dan versi-spesifik, dan saat ini provider documentation
doesn’t establish one shared render langkah Anda dapat rely pada. Treat “generally fetches
static HTML without executing JavaScript” (terjemahan) “umumnya fetches
static HTML without executing JavaScript” sebagai safe planning assumption, not sebuah
guarantee tentang setiap provider forever. sebuah CSR route (bare Svelte, atau SvelteKit dengan
ssr: false) ships setiap one dari ini crawler yang sama empty shell sebuah pertama-fetch
Googlebot permintaan sees; SvelteKit’s default SSR puts Anda konten di raw HTML
so no crawler memiliki untuk depend pada sebuah render langkah di semua. itu’s argument untuk keeping
SSR pada untuk anything Anda ingin AI sistem untuk see — not sebuah promise itu SSR guarantees
inclusion di sebuah AI jawaban, which depends pada factors well beyond rendering.
umum SvelteKit SEO mistakes
- Fetching SEO data di
onMount()alih-alih sebuah server muat function — metadata isn’t di initial HTML. - Shipping SPA fallback mode (
ssr: false) untuk konten Anda ingin diperingkatkan. adapter-staticdenganssr: false— empty shells, not prerendered halaman.- Blocking JS/CSS di
robots.txt— breaks rendering. - Skipping
trailingSlashconfiguration — duplicate-konten variants. - menggunakan hash/fragment routing — Googlebot dapat’t resolve itu URLs (SvelteKit’s History API default sudah protects Anda here).
jika Anda’re coming di ini dari broader framework angle, Svelte/SvelteKit adalah one dari decoupled frontends sebuah CMS headless pairs dengan, dan rendering-mode logic here adalah yang sama logic itu governs JavaScript SEO umumnya — itu topics live alongside ini one di cluster.
AI summary
sebuah condensed take pada Advanced versi:
- Svelte ≠ SvelteKit. Bare Svelte compiles untuk lean vanilla JS tetapi adalah CSR-hanya — konten isn’t di raw HTML. SvelteKit renders SSR oleh default dan ships full HTML. gunakan SvelteKit untuk anything itu harus peringkat.
- Why rendering mode penting: Google queues semua
200halaman untuk rendering (delay); Bing adalah less reliable di JS; AI-crawler rendering (GPTBot, ClaudeBot, PerplexityBot) adalah provider-spesifik dan umumnya treated sebagai fetch-hanya. SSR/prerender puts konten di pertama respons so no crawler depends pada sebuah render langkah. - Four modes: SSR (default), prerender/SSG (
prerender = true, bangun-time HTML), SPA fallback (ssr: false, docs warn “large negative performance and SEO impacts” (terjemahan) “besar negative performa dan SEO impacts”), dan hybrid (mix per route — SvelteKit’s killer fitur). - ** trap:**
adapter-static+ssr: falseproduces empty shells, not prerendered HTML. Prerendering adalah SSR di bangun time — pertahankan SSR pada. - Metadata: manage
<title>/meta dengan<svelte:head>(no library needed). Feed ini dari sebuah+page.server.jsmuat function, notonMount()(client-hanya). - Routing: History API oleh default (baik — hash routing adalah buruk untuk SEO);
configure
trailingSlash; prerendered dynamic routes perlu sebuahentriesfunction. - Adapters:
adapter-static(SSG, konten situs) vs.adapter-node/vercel/cloudflare(SSR; edge adapters dapat cut TTFB, which helps LCP — tetapi mengukur deployed route, since adapters differ di streaming, caching, dan runtime perilaku). - No dibangun-di sitemap/robots.txt — bangun them (manual
+server.jsroute, dynamic endpoint, atau sebuah package). tidak pernah block.js/.css. - CWV head start: compiler output ships less JS daripada React; code splitting, preloading, caching, edge deployment adalah semua available — tetapi halaman weight, images, ketiga-party scripts, dan Anda deployment choice masih decide diukur score.
Official documentation
Primary-source documentation dari SvelteKit dan mesin pencari.
SvelteKit
- SEO • SvelteKit Docs — SSR-oleh-default,
<svelte:head>untuk metadata, trailing-slash normalization, performa, dan sitemap endpoint pattern. - halaman options (prerender, ssr, csr) • SvelteKit Docs — cara set rendering mode per route, dan SPA-mode warning.
- Static situs generation (adapter-static) • SvelteKit Docs — prerendering untuk static files dan
ssrrequirement. - memuat data • SvelteKit Docs — server vs. universal muat functions (where Anda SEO data seharusnya menjadi fetched).
- performa • SvelteKit Docs — code splitting, preloading, caching, dan pengukuran alat.
- memahami JavaScript SEO Basics — three-phase process, render queue, History API routing, dan “not all bots can run JavaScript” (terjemahan) “not semua bot dapat run JavaScript” guidance.
- baru evergreen Googlebot — Googlebot’s move untuk evergreen Chromium dan what ini masih doesn’t mendukung.
- SEO Guide untuk Web Developers — SSR/prerendering recommendation untuk dapat diindeks konten.
Quotes dari source
pada—record statements dari SvelteKit docs dan Google. setiap tautan adalah sebuah deep tautan itu jumps untuk quoted passage pada source halaman.
SvelteKit docs — rendering & SEO
- “This option has large negative performance and SEO impacts” (terjemahan) “ini option memiliki besar negative performa dan SEO impacts” — pada running sebuah app
sebagai sebuah client-side-rendered SPA (
ssr: falsefallback). Jump untuk quote - “Google’s PageSpeed Insights and WebPageTest are excellent ways to understand the performance characteristics of a site.” (terjemahan) “Google’s PageSpeed Insights dan WebPageTest adalah excellent cara untuk memahami performa characteristics dari sebuah situs.” Jump untuk quote
Google — JavaScript & rendering
- “All pages with a 200 HTTP status code are sent to the rendering queue, no matter whether JavaScript is present on the page.” (terjemahan) “semua halaman dengan sebuah 200 HTTP kode status adalah dikirim untuk rendering queue, no penting whether JavaScript adalah present pada halaman.” Jump untuk quote
- “Server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript.” (terjemahan) “server-side atau pre-rendering adalah masih sebuah great idea because ini membuat Anda situs web faster untuk pengguna dan crawler, dan not semua bot dapat run JavaScript.” Jump untuk quote
- “Google Search won’t render JavaScript from blocked files or on blocked pages.” (terjemahan) “Google Search won’t render JavaScript dari blocked files atau pada blocked halaman.” Jump untuk quote
Patrick Stox (my own berfungsi — JavaScript SEO: sebuah Definitive Guide)
- “JavaScript is not bad for SEO, and it’s not evil. It’s just different from what many SEOs are used to, and there’s a bit of a learning curve.” (terjemahan) “JavaScript adalah not buruk untuk SEO, dan ini adalah not evil. ini adalah hanya berbeda dari what banyak SEOs adalah digunakan untuk, dan there’s sebuah bit dari sebuah learning curve.”
- pada rendering modes: “Any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines.” (terjemahan) “apa pun jenis dari SSR, static rendering, dan prerendering setup adalah going untuk menjadi fine untuk mesin pencari.”
- pada CSR: “The most problematic one is going to be full client-side rendering where all of the rendering happens in the browser. While Google will probably be OK client-side rendering, it’s best to choose a different rendering option to support other search engines.” (terjemahan) “paling problematic one adalah going untuk menjadi full rendering sisi klien where semua dari rendering happens di browser. While Google akan probably menjadi OK rendering sisi klien, ini adalah best untuk choose sebuah berbeda rendering option untuk mendukung lainnya mesin pencari.”
SvelteKit SEO checklist
sebuah quick pass untuk confirm mesin pencari dan AI crawler dapat see Anda SvelteKit konten:
- Anda’re menggunakan SvelteKit, not bare Svelte, untuk anything itu perlu untuk peringkat.
- SSR adalah pada ( default) untuk dapat diindeks routes — no accidental
ssr: false. - konten-heavy halaman gunakan prerender (
export const prerender = true) where mereka dapat. - dengan
adapter-static,ssradalah left pada so prerendering outputs nyata HTML (not empty shells). - setiap halaman memiliki sebuah unique
<title>dan<meta name="description">via<svelte:head>. - SEO metadata adalah fetched di sebuah
+page.server.jsmuat function, not dionMount(). - Canonical, Open Graph, dan JSON-LD adalah rendered server-side, not injected client-side.
-
trailingSlashadalah set explicitly disvelte.config.js. - Prerendered dynamic routes memiliki sebuah
entriesfunction enumerating paths. - sebuah sitemap exists (
+server.jsroute atau package) dan sebuah robots.txt adalah distatic/atau sebuah route. -
robots.txtmelakukan not block.jsatau.css. - Routing adalah History API (SvelteKit default) — no hash/fragment routes.
- Anda verified rendered HTML di GSC pemeriksaan URL (konten + metadata present pada pertama fetch).
mental models
1. Svelte-vs-SvelteKit fork. sebelum anything else, jawaban: bare Svelte atau SvelteKit? Bare Svelte adalah CSR-hanya — konten isn’t di HTML. SvelteKit adalah SSR-pertama. Nearly setiap “Svelte SEO problem” (terjemahan) “Svelte SEO masalah” traces back untuk someone menggunakan plain Svelte (atau disabling SvelteKit’s SSR) untuk konten itu perlu untuk peringkat.
2. Prerendering = SSR di bangun time.
“Static” (terjemahan) “Static” tidak berarti “no rendering.” (terjemahan) “no rendering.” Prerendering runs Anda server render di bangun
time dan saves HTML. itu’s why ssr: false dapat’t prerender — there’s nothing untuk
render. pertahankan SSR pada; choose when ini runs (permintaan time = SSR, bangun time =
prerender).
3. rendering-mode-per-route decision. SvelteKit lets Anda choose per route, so match mode untuk konten:
- Static-ish konten (blog, docs, marketing) → prerender (SSG).
- Fresh/dynamic konten (listings, personalized halaman) → SSR.
- Behind-sebuah-login, not-terindeks UI → SPA fallback adalah acceptable there hanya.
4. HTML-pertama metadata.
Anything sebuah crawler perlu — judul, deskripsi, canonical, JSON-LD — belongs di
server-rendered HTML via <svelte:head> fed oleh sebuah server muat function. onMount()
metadata adalah seen late oleh Google, dan providers itu treat AI crawler sebagai fetch-hanya
won’t see ini di semua.
5. adapter = deployment shape. adapter decides where SSR runs (atau whether ini adalah semua static). Static untuk konten situs; node/vercel/cloudflare untuk SSR. Edge adapters dapat shrink TTFB, which dapat help LCP — tetapi adapter adalah one input; Anda data fetching, caching, dan runtime’s cold-start perilaku decide what Anda actually mengukur. Adapters juga differ di streaming, filesystem access, dan error handling, so verify production perilaku per adapter alih-alih assuming fitur parity.
6. Plan untuk crawler itu don’t run Anda JavaScript. rendering perilaku untuk AI crawler adalah provider- dan versi-spesifik, dan saat ini provider documentation doesn’t guarantee sebuah shared render langkah. safe planning assumption adalah fetch-hanya: jika konten isn’t di initial HTML, treat ini sebagai invisible untuk itu class dari crawler. SSR/prerender menghapus dependency pada apa pun crawler’s rendering capability di semua — strongest lever Anda memiliki, not sebuah guarantee tentang what apa pun one AI sistem melakukan dengan hasil.
SvelteKit SEO — cheat sheet
rendering modes (set per route via halaman options)
| Mode | How | SEO | gunakan untuk |
|---|---|---|---|
| SSR | default | ✅ Full HTML pada pertama permintaan | Dynamic / fresh konten |
| Prerender (SSG) | export const prerender = true | ✅ Best — static HTML di bangun | Blog, docs, marketing |
| SPA fallback | export const ssr = false | ⚠️ “Large negative … SEO impacts” (terjemahan) “besar negative … SEO impacts” | App shells behind sebuah login hanya |
| Hybrid | mix per route | ✅ Best dari setiap | sebagian besar nyata situs |
** trap**
adapter-static+ssr: false→ empty shells, not prerendered HTML. pertahankanssrpada denganadapter-static.
Adapters
| Adapter | rendering | Note |
|---|---|---|
adapter-static | SSG | benar static; no server; pertahankan SSR pada |
adapter-node | SSR | Node server; full flexibility |
adapter-vercel | SSR + edge | Edge dapat cut TTFB → mengukur LCP impact |
adapter-cloudflare | SSR pada Workers | sering rendah TTFB; test deployed route |
adapter-netlify | SSR + CDN | Similar profile untuk Vercel |
Fast aturan
- Metadata →
<svelte:head>(no library needed); feed dari+page.server.jsmuat, tidak pernahonMount(). Confirm setiap route’s judul/deskripsi adalah unique. - Routing → History API (default). tidak pernah hash/fragment routes.
- Set
trailingSlashexplicitly. - Prerendered dynamic routes → tambahkan sebuah
entriesfunction. - No dibangun-di sitemap/robots.txt — bangun them (
+server.jsroute atau package). - tidak pernah block
.js/.cssdi robots.txt. - AI crawler → umumnya fetch-hanya, provider-spesifik → pertahankan SSR pada so konten doesn’t depend pada sebuah render langkah.
- Options (
ssr/csr/prerender/trailingSlash) adalah hierarchical — periksa nilai itu applies untuk spesifik route, not hanya project default.
Plain Svelte atau SvelteKit?
Choose the rendering path
Svelte SEO mistakes
- menggunakan plain client-hanya Svelte untuk search landing halaman. Move rankable routes untuk SvelteKit SSR atau prerendering.
- Setting
ssr = falseglobally. itu turns situs ke sebuah SPA dan menghapus complete initial HTML. Scope client-hanya perilaku untuk routes itu melakukan not perlu search visibilitas. - Updating
<svelte:head>hanya setelah browser fetches. muat metadata dengan yang sama server/bangun data itu renders halaman. - menggunakan hash-based URLs untuk konten routes. Hash fragments adalah not separate server routes. gunakan normal pathname routing.
- Testing hanya setelah hydration. Compare raw HTML dengan rendered DOM so client code cannot hide missing source konten.
Raw HTML adalah sebuah empty app shell
mungkin cause: plain Svelte SPA output atau ssr = false. Fix: gunakan SvelteKit SSR/prerendering untuk route dan move essential memuat untuk server-compatible load. Confirm: curl mengembalikan heading, konten, dan tautan internal.
judul dan canonicals appear hanya setelah JavaScript
mungkin cause: head nilai depend pada client lifecycle atau browser-hanya fetching. Fix: mengembalikan data selama SSR/prerender dan render ini melalui <svelte:head>. Confirm: raw dan rendered head nilai agree.
sebuah dynamic route adalah missing dari sebuah static bangun
mungkin cause: prerenderer cannot menemukan parameterized path. Fix: expose dapat di-crawl tautan atau configure entries, atau render itu route pada demand. Confirm: deployed route mengembalikan sebuah complete 200 halaman.
halaman berfungsi locally tetapi fails setelah deployment
mungkin cause: adapter mismatch, missing server mendukung, atau environment-dependent data fetching. Fix: test production adapter output dan -nya runtime variables. Confirm: production source HTML matches tested bangun.
Confirm SvelteKit adalah actually serving rendered HTML
whole poin dari SvelteKit’s SSR adalah itu konten adalah di raw HTML — sebelum apa pun
JavaScript runs. fastest cara untuk confirm Anda didn’t accidentally ship sebuah CSR shell
adalah untuk fetch raw respons dan cari Anda konten. sebuah plain curl doesn’t run
JavaScript, so ini sees exactly what sebuah non-rendering crawler sees.
macOS / Linux
# Raw HTML as the server sends it (no JS executed)
curl -sL "https://example.com/your-page/" -o raw.html
# Is your real content in the raw HTML? (empty result = you're shipping a CSR shell)
grep -o "Your unique headline text" raw.html
# Is your title/description in the initial response?
grep -iE "<title>|name=\"description\"" raw.htmlWindows (PowerShell)
Invoke-WebRequest -Uri "https://example.com/your-page/" -OutFile raw.html
Select-String -Path raw.html -Pattern "Your unique headline text"
Select-String -Path raw.html -Pattern "<title>","name=`"description`""jika Anda headline dan metadata adalah present di raw.html, SSR/prerendering adalah berfungsi.
jika mereka’re missing tetapi terlihat di browser, Anda konten depends pada client-side
rendering — periksa bahwa ssr isn’t atur ke false dan itu Anda’re not fetching konten
hanya di onMount().
periksa Anda’re not blocking JS/CSS
curl -sL "https://example.com/robots.txt" | grep -iE "disallow.*\.(js|css)|Disallow:\s*/(_app|assets)"sebuah Disallow matching /_app/ (SvelteKit’s bundled output) atau Anda CSS berarti Google
dapat’t render halaman — almost selalu sebuah mistake.
alat untuk debugging SvelteKit SEO
- pemeriksaan URL (Google Search Console) — sumber kebenaran. Run sebuah live test, lalu periksa rendered HTML, screenshot, dan halaman resources untuk confirm Anda konten dan metadata adalah present (dan itu nothing adalah blocked).
- PageSpeed Insights — SvelteKit docs explicitly recommend ini; memeriksa Core Web Vitals (LCP/INP/CLS) itu SvelteKit’s lean output adalah dibangun untuk win.
- WebPageTest — lainnya alat SvelteKit docs name; waterfall + filmstrip view untuk diagnosing TTFB dan render timing.
- Rich hasil Test — fast cara untuk confirm JSON-LD dibuat ini ke rendered output.
- Screaming Frog SEO Spider — crawl dengan JS rendering pada/off untuk diff raw vs. rendered HTML di seluruh whole SvelteKit situs.
- Ahrefs situs Audit — surfaces broken canonicals, missing metadata, redirect chains, dan indexability issues di scale.
- View source /
curl— quickest “is my content in the raw HTML?” (terjemahan) “adalah my konten di raw HTML?” periksa (see Scripts tab).
Test yourself: Svelte SEO
Five quick pertanyaan pada how Svelte dan SvelteKit affect search visibilitas. Pick sebuah jawaban untuk setiap, lalu periksa.
Resources worth Anda time
My related writing
- JavaScript SEO: sebuah Definitive Guide — my full reference pada rendering, DOM parity, dan rendering-mode trade-offs itu underpin everything here. ini mentions Svelte alongside React, Vue, dan Angular sebagai frameworks dengan head/meta modules untuk SEO.
- Beginner’s Guide untuk SEO teknis — where rendering dan crawling fit di bigger picture.
My speaking
- How Search berfungsi (SlideShare) — my walkthrough dari crawling, rendering, pengindeksan, dan peringkat. (My standing disclaimer applies: “This is my understanding of systems… not going to be 100% complete or accurate.” (terjemahan) “ini adalah my understanding dari sistem… not going untuk menjadi 100% complete atau accurate.”)
dari sekitar industry
- SEO • SvelteKit Docs — official, authoritative starting poin: SSR oleh default,
<svelte:head>, trailing slashes, dan sitemap pattern. - halaman options (prerender, ssr, csr) • SvelteKit Docs — per-route rendering controls dan SPA-mode SEO warning, di team’s own kata.
- memahami JavaScript SEO Basics (Google Search Central) — render queue, “not all bots can run JavaScript,” (terjemahan) “not semua bot dapat run JavaScript,” dan History API guidance.
- SvelteKit SEO: Anda Secret Weapon (Okupter) — sebuah practitioner guide covering meta tags, prerendering, rendering modes, data terstruktur, dan sitemaps.
- SvelteKit SEO: optimisasi mesin pencari Metadata (Rodney Lab) — essential meta tags, sebuah SEO component pattern, social cards, dan language declaration.
- cara tambahkan sebuah basic SEO component untuk SvelteKit (Thilo Maier) — sebuah code-focused walkthrough dari sebuah reusable SEO component.
- membuat sebuah Sitemap di SvelteKit (Bryan Anthonio) — sebuah jelas, saat ini guide untuk
+server.jssitemap-endpoint approach. - Rich Harris menjelaskan why SvelteKit pushes untuk SSR (DEV Community) — context pada why SvelteKit’s creator dibuat SSR default dan pushes terhadap SPA/CSR.
Log perubahan
Diperbarui 18 Jul 2026.
Ringkasan editorial dan detail perubahan yang tercatat.Detail perubahan
-
Catatan perubahan terperinci saat ini tersedia dalam bahasa Inggris.
-
Catatan perubahan terperinci saat ini tersedia dalam bahasa Inggris.
-
Catatan perubahan terperinci saat ini tersedia dalam bahasa Inggris.
-
Catatan perubahan terperinci saat ini tersedia dalam bahasa Inggris.
Perbandingan lengkap tidak tersedia — tidak ada cuplikan sebelumnya yang diarsipkan untuk revisi ini.