Panduan Astro SEO

Astro adalah satu dari strongest kerangka kerja untuk SEO — halaman prerender untuk static HTML oleh default dan ship JS hanya di mana Anda tanyakan untuk ini, dengan strong Core Web Vitals. tetapi defaults tidak jaminan, dan ini tidak tulis Anda meta tags, sitemap, atau canonicals untuk Anda. Di sini's bagaimana I jalankan my own Astro situs, dan cara mendapatkan architecture right.

Pertama kali diterbitkan: 26 Jun 2026 · Terakhir diperbarui: 8 Agu 2026 · Advanced
Bahasa

Astro adalah satu dari strongest kerangka kerja choices untuk SEO karena ini prerenders untuk static HTML oleh default — Anda konten adalah di mentah HTML pada pertama crawl, dengan Tidak rendering queue untuk tunggu pada untuk itu route. Islands hydrate hanya components Anda mark dengan sebuah client directive, so sebagian besar dari halaman ships tanpa -nya own hydration JS (Astro dapat masih tambahkan halaman scripts dan router JS elsewhere) — none dari ini jaminan crawlability, pengindeksan, atau rankings pada -nya own, so verify deployed routes. Astro situs juga post strong Core Web Vitals angka. catch: Astro generates bersih HTML tetapi tidak tulis Anda meta tags, canonicals, sitemap, atau data terstruktur — itu adalah deliberate bangun langkah, dan sitemap penemuan targets statically generated routes, so runtime-hanya URLs perlu jelas menangani. server Islands (yang memerlukan sebuah adapter) dan View Transitions adalah SEO-safe ketika Anda memahami apa crawler sebenarnya fetch. I jalankan patrickstox.com pada Astro, so ini adalah stack I sebenarnya langsung di.

TL;DR — Astro adalah architecturally well siapkan untuk SEO: halaman dan endpoints adalah prerendered untuk static HTML oleh default, so ada Tidak render-queue wave untuk tunggu pada untuk itu konten — tetapi itu’s sebuah default, tidak sebuah universal jaminan, dan static/server HTML tidak oleh itself prove crawlability, pengindeksan, rankings, atau Core Web Vitals untuk Anda production URLs. Islands architecture hydrates hanya components Anda mark dengan sebuah client:* directive — semuanya else ships HTML tanpa -nya own hydration JS, though halaman scripts, lainnya islands, dan router enhancements dapat masih tambahkan JavaScript elsewhere pada halaman. Astro tidak auto-generate meta tags, canonicals, sitemaps, atau data terstruktur — wire itu up explicitly, ideally validated oleh konten Collections + Zod. server Islands (yang memerlukan sebuah adapter) sajikan static shell dengan fallback konten di awal document dan fetch deferred konten independently afterward — verify apa sebuah diberikan crawler sebenarnya retrieves alih-alih assuming. View Transitions gunakan history.pushState dan adalah SEO-safe; Google melakukan crawl underlying MPA halaman biasanya. I jalankan patrickstox.com pada Astro, dan fitur di bawah adalah ones I sebenarnya gunakan — validated terhadap deployed situs, tidak hanya local dev.

Evidence for this claim Astro prerenders pages as static HTML by default and only sends client JavaScript for explicitly hydrated components. Scope: Astro default static output and islands architecture. Confidence: high · Verified: Astro: Why Astro

Mengapa Astro sidesteps JavaScript rendering masalah entirely

Seluruh alasan JavaScript SEO sulit adalah gelombang kedua. Google mengambil HTML mentah Anda terlebih dahulu, lalu mengantrekan halaman untuk dirender di Chromium tanpa kepala — dan antrean itulah risikonya. Dokumentasi Google menjelaskannya: “Googlebot queues all pages with a 200 HTTP status code for rendering unless a robots meta tag tells Google not to index the page. The page may stay on this queue for a few seconds, but it can take longer than that.” (terjemahan) “Googlebot mengantrekan semua halaman dengan kode status HTTP 200 untuk dirender, kecuali tag meta robots meminta Google untuk tidak mengindeks halaman. Halaman itu mungkin berada dalam antrean selama beberapa detik, tetapi bisa lebih lama.” Pada SPA yang dirender di sisi klien, konten Anda belum ada sampai gelombang rendering itu selesai.

Astro’s default output mode adalah static: halaman dan endpoints adalah prerendered untuk sebuah menyelesaikan HTML file di bangun time. So untuk sebuah route berjalan di itu default, mentah HTML adalah dirender halaman. Evidence for this claim Astro uses static output and prerenders routes at build time by default. Scope: Astro default output mode; routes can opt out of prerendering. Confidence: high · Verified: Astro: On-demand rendering ada Tidak kedua wave untuk tunggu pada untuk itu route, karena ada tidak ada apa pun left untuk execute. Googlebot sees penuh konten pada pertama fetch. sebagai Joost de Valk (Yoast’s founder) puts ini, “Dari an SEO perspective, static HTML pada a CDN adalah a better starting point daripada paling CMSes akan ever memberikan Anda.” (terjemahan) “dari sebuah SEO perspective, static HTML pada sebuah CDN adalah sebuah better starting poin daripada sebagian besar CMSes akan ever memberikan Anda.”

itu’s default, though — tidak sebuah universal property dari setiap route. Set output: 'server' dan default flips untuk pada-demand rendering (lebih pada itu di bawah); bahkan di sebuah static-default project, sebuah adapter lets sebuah individual route opt out dengan export const prerender = false. None dari ini adalah guaranteed oleh architecture alone: static atau server HTML, islands, dan adapters jangan oleh themselves jaminan crawlability, pengindeksan, rankings, atau Core Web Vitals — itu bergantung pada deployed route dan spesifik crawler, so verify them alih-alih assuming kerangka kerja menangani ini.

Ini juga membantu crawler yang tidak dapat menjalankan rendering sama sekali. Google menyatakan bahwa “not all bots can run JavaScript” (terjemahan) “tidak semua bot dapat menjalankan JavaScript” — dan itulah kenyataan pada 2026 bagi sebagian besar crawler AI dan banyak alat pihak ketiga. Keluaran Astro yang mengutamakan HTML dapat dibaca oleh semuanya ketika benar-benar diprerender, bukan hanya oleh Googlebot. (Ini adalah poin yang sama poin yang saya sampaikan di SEO untuk sebuah CMS headless: rendering mode adalah product.)

Islands architecture: JS hanya di mana Anda tanyakan untuk ini

Astro renders Anda components untuk HTML dan, di -nya kata, ships “sekadar HTML & CSS, stripping out all client-side JavaScript secara otomatis.” (terjemahan) “hanya HTML & CSS, stripping out semua client-side JavaScript secara otomatis.” Interactivity adalah opt-di. Anda mark sebuah component dengan sebuah client:* directive — client:load, client:idle, atau client:visible — dan hanya itu island hydrates dengan JavaScript. Semuanya else tetap static HTML. Evidence for this claim Astro client directives selectively hydrate interactive islands while other components remain static HTML. Scope: Astro islands and client directives. Confidence: high · Verified: Astro: Islands

untuk SEO ini adalah close untuk ideal. konten Googlebot perlu untuk indeks adalah plain HTML, dan Anda interactive widgets jangan drag ini down. client:visible adalah terutama berguna: sebuah di bawah—fold component tidak bahkan begin hydrating until ini scrolls ke view, so ini tidak pernah blocks Anda LCP. concept muncul dari Jason Miller (creator dari Preact), siapa described “rendering HTML halaman pada itu server, dan inject[ing] placeholders atau slots sekitar highly dynamic regions” (terjemahan) “rendering HTML halaman pada server, dan inject[ing] placeholders atau slots sekitar highly dynamic regions” untuk selective hydration.

Dua nuances worth menjadi precise tentang, karena pesaing coverage tends untuk blur them:

  • client:only adalah sebuah berbeda animal. Unlike client:load/client:idle/client:visible, sebuah client:only component skips server rendering entirely — ini produces Tidak HTML pada server di semua. Apa pun dapat diindeks placed hanya di dalam sebuah client:only component tidak di document Googlebot fetches; ini hanya ada setelah browser hydrates ini. jangan put utama konten di sana.
  • ini adalah selective hydration, tidak resumability. Astro re-berjalan setiap island’s client code dari scratch di browser; ini tidak resume execution state itu adalah serialized pada server cara sebuah resumability model (Qwik’s, misalnya) melakukan. dua mendapatkan conflated di writeups — mereka’re tidak yang sama mechanism.
Evidence for this claim A client:only component skips server rendering, so indexable content placed only inside it cannot be assumed to exist in the initial page HTML. Scope: client and server islands Confidence: high · Verified: Template directives reference

dan sebuah non-hydrated component tidak seluruh JavaScript picture pada sebuah halaman. “Zero JS” (terjemahan) “Zero JS” mendeskripsikan satu component tanpa sebuah client:* directive — Astro dapat masih ship halaman-tingkat <script> tags, View Transitions router, dan lainnya islands elsewhere pada yang sama halaman. Deskripsikan apa ships per component/route, tidak sebagai sebuah blanket claim tentang halaman.

Apa Astro melakukan Tidak melakukan secara otomatis

Astro generates bersih semantic HTML — dan tidak ada apa pun else, SEO-wise. tidak ada metadata, Tidak canonical, Tidak sitemap, Tidak data terstruktur out dari box. myth itu “Astro adalah secara otomatis SEO-optimized” (terjemahan) “Astro adalah secara otomatis SEO-dioptimalkan” adalah persis itu. Anda own:

  • Meta tags (judul, deskripsi, Open Graph, Twitter)
  • Canonical URLs
  • ** sitemap** (melalui official integration)
  • data terstruktur / JSON-LD
  • robots.txt

Astro adalah best foundation I’ve digunakan, tetapi ini adalah sebuah foundation, tidak sebuah finished house.

sitemap: @astrojs/sitemap

Install ini dengan npx astro add sitemap. ini melakukan crawl Anda statically-generated routes dan emits sebuah sitemap-index.xml plus chunked sitemap-0.xml files di bangun time. Dua hal bite orang:

Evidence for this claim Astro's official sitemap integration generates sitemap files from statically generated routes. Scope: Astro @astrojs/sitemap integration. Confidence: high · Verified: Astro: Sitemap integration
  • Anda harus set site: di astro.config.mjs. Tanpa ini, integration silently generates tidak ada apa pun. ini adalah single sebagian besar umum “di mana’s my sitemap?” (terjemahan) “di mana’s my sitemap?” penyebab.
  • Anda harus tambahkan sitemap line untuk robots.txt yourself. Astro tidak melakukan ini.

untuk control, filter() excludes routes (preview/draft halaman — persis apa I gunakan ini untuk pada ini situs), serialize() lets Anda set lastmod/changefreq/priority, dan i18n option emits hreflang entries di sitemap. ini adalah apa saat ini @astrojs/sitemap docs specify — konfirmasi terhadap Anda installed versi jika Anda’re pada sebuah older rilis, integration perilaku memiliki changed di seluruh major versi sebelum.

** cakupan itu trips orang up:** integration’s penemuan targets statically generated routes. jika apa pun dari Anda URLs hanya exist di runtime — server-dirender (output: 'server') routes, atau routes generated pada demand alih-alih di bangun time — jangan assume mereka’re di sitemap. tambahkan them explicitly dengan customPages, lalu sebenarnya open sitemap-index.xml setelah sebuah bangun untuk konfirmasi mereka’re di sana. jangan take “itu integration menangani it” (terjemahan) “ integration menangani ini” pada faith untuk apa pun itu tidak sebuah bangun-time static route.

Meta tags dan canonicals: BaseLayout pattern

Astro memiliki Tidak special <Head> component — Anda control <head> secara langsung di .astro files. standard pattern (dan apa I melakukan) adalah sebuah single BaseLayout.astro itu takes title, description, dan canonicalURL sebagai props dan menulis head. atur canonical explicitly pada setiap halaman dan pertahankan ini consistent dengan og:url. Anda tidak perlu sebuah library, tetapi community astro-seo package (npm) adalah sebuah convenient satu-component wrapper untuk judul/deskripsi/OG/Twitter/canonical jika Anda ingin ini.

konten Collections sebagai sebuah SEO safety net

ini adalah Astro’s underrated SEO fitur. konten Collections adalah sebuah jenis-safe konten layer untuk Anda Markdown/MDX/JSON, dengan Zod schema validation. itu berarti Anda dapat membuat title dan description diperlukan fields — dan jika sebuah halaman adalah missing satu, bangun fails. Anda dapat’t accidentally ship sebuah halaman dengan Tidak judul. kueri functions (getCollection(), getEntry()) generate static halaman di bangun time, so output adalah plain HTML ketika deployed. dan karena MDX mempertahankan mentah markdown sebagai sumber kebenaran, itu files adalah juga bersih sumber konten untuk AI crawler dan llms.txt-style patterns. ini very situs adalah dibangun pada konten Collections dengan Zod-validated frontmatter.

astro:assets: images selesai right (dengan satu trap)

<Image /> component secara otomatis converts untuk WebP, infers dimensions untuk “avoid Cumulative Layout Shift (CLS),” (terjemahan) “hindari Cumulative Layout Shift (CLS),” sets loading="lazy" oleh default, dan memerlukan alt — sebuah missing alt adalah sebuah compile error. <Picture /> extends ini dengan AVIF/WebP/fallback <source> elements.

trap: automatic loading="lazy" adalah wrong untuk Anda LCP image (biasanya hero). Lazy-memuat Anda sebagian besar penting image delays ini. untuk di atas—fold images, override dengan loading="eager" dan fetchpriority="high". Remote images perlu jelas width dan height.

server Islands: apa crawler sebenarnya see

server Islands (Astro 4.12+) adalah fitur sebagian besar pesaing guides mendapatkan wrong. dengan server:defer, sebuah component renders pada server independently dari main halaman. static shell adalah disajikan immediately; per Astro’s docs, “Anda halaman akan menjadi dirender immediately dengan any specified fallback konten sebagai a placeholder. Lalu, itu component’s own contents adalah fetched pada itu client dan displayed ketika tersedia.” (terjemahan) “Anda halaman akan menjadi dirender immediately dengan apa pun specified fallback konten sebagai sebuah placeholder. lalu, component’s own contents adalah fetched pada client dan displayed ketika tersedia.”

Dua hal untuk menjadi tepat tentang. pertama, server Islands memerlukan sebuah adapter — mereka’re sebuah pada-demand fitur, tidak sesuatu sebuah purely static bangun produces pada -nya own. kedua, sequence adalah: awal document ships dengan whatever Anda configured sebagai fallback konten, dan island’s nyata konten adalah sebuah terpisah, independent permintaan fetched setelah halaman memuat, di atas -nya own endpoint. itu’s sebuah hard floor pada apa pertama document berisi — I tidak akan generalize past itu tentang apa setiap spesifik crawler melakukan berikutnya tanpa testing Anda own deployed URLs secara langsung.

SEO consequence adalah concrete: ** static HTML sebuah crawler membaca pada itu pertama fetch berisi Anda fallback konten, tidak deferred island konten.** itu’s perfect untuk apa server Islands adalah untuk — personalized, session-spesifik stuff (login state, cart count, recommendations) itu tidak seharusnya menjadi cached atau terindeks anyway. ini adalah wrong untuk utama dapat diindeks konten. Put apa pun itu perlu untuk peringkat di main Astro template, dan let server Islands tangani dynamic bits sekitar ini.

Output modes: static vs server, dan per-route override

Astro’s default output mode adalah static — halaman dan endpoints prerender untuk HTML di bangun time. Set output: 'server' di astro.config.mjs dan default flips untuk pada-demand rendering: halaman render per permintaan (dengan sebuah adapter), berguna untuk auth, nyata-time data, atau personalization beyond apa server Islands cover. Either cara, Anda dapat override default per route: di sebuah static-default project, export const prerender = false opts sebuah route ke pada-demand rendering; di sebuah server-default project, export const prerender = true opts sebuah route back ke bangun-time prerendering. So “my site adalah static” (terjemahan) “my situs adalah static” atau “my site is SSR” (terjemahan) “my situs adalah SSR” adalah rarely benar untuk setiap route — periksa per-route setting, tidak hanya top-tingkat config.

Evidence for this claim Astro uses static output and prerenders routes at build time by default. Scope: Astro default output mode; routes can opt out of prerendering. Confidence: high · Verified: Astro: On-demand rendering

dari sebuah pure SEO standpoint, prerendered dan pada-demand HTML adalah equivalent — keduanya deliver menyelesaikan HTML untuk sebuah crawler’s pertama permintaan, setelah Anda’ve sebenarnya confirmed route mengembalikan sebuah 200 dengan penuh markup. pada-demand routes dapat stream mereka HTML, dan slow data atau network conditions dapat delay kemudian chunks, so sebuah streamed respons tidak automatic proof itu setiap piece dari konten arrived — periksa ini, jangan assume ini. nyata perbedaan antara dua modes adalah operational: prerendered konten adalah fixed until berikutnya bangun (atau sebuah secara terpisah configured runtime refresh) dan menyajikan straight dari CDN edge; pada-demand konten adalah selalu saat ini tetapi bergantung pada Anda adapter dan runtime menjadi healthy di production. jangan treat ini sebagai sebuah SEO decision — choose pada data freshness dan ops, lalu validate deployed routes, statuses, redirects, dan respons headers alih-alih extrapolating dari apa worked di local dev.

View Transitions: SEO-safe, despite SPA feel

Astro’s <ClientRouter /> (formerly <ViewTransitions />) memberikan SPA-like soft navigation menggunakan browser’s View Transitions API dan History API. key fact: ini navigates dengan history.pushState, yang adalah persis apa Google recommends untuk client-side navigation — Google warns itu fragment-based (#hash) URLs adalah sesuatu ini “can’t reliably resolve.” (terjemahan) “dapat’t reliably resolve.” Crucially, View Transitions adalah sebuah browser-side enhancement. Ketika Googlebot melakukan crawl, ini permintaan setiap URL dan mendapatkan sebuah wajar, menyelesaikan HTML halaman — MPA underneath adalah untouched. transitions hanya memengaruhi apa sebuah human sees di browser.

So Tidak, View Transitions melakukan tidak turn Anda Astro situs ke sebuah SPA, dan mereka jangan break SEO. sebuah worth-noting kesenjangan: Astro’s View Transitions docs memiliki Tidak SEO bagian, yang adalah probably mengapa “it breaks SEO” (terjemahan) “ini breaks SEO” myth persists. untuk verify pada Anda own situs, fetch sebuah sedikit URLs secara langsung dan konfirmasi setiap mengembalikan penuh HTML — jangan take ini pada faith, periksa Anda own deployment.

umum Astro SEO mistakes

  1. Assuming Astro menangani SEO untuk Anda. ini menangani HTML. Meta, canonicals, sitemap, schema adalah yours.
  2. Forgetting site: di config — Anda sitemap silently tidak generate.
  3. Tidak menambahkan sitemap untuk robots.txt — Astro tidak akan melakukan ini.
  4. Lazy-memuat LCP image — override hero dengan eager + fetchpriority.
  5. Putting dapat diindeks konten di sebuah server Island — crawler see fallback, tidak konten, dan server Islands memerlukan sebuah adapter di pertama place.
  6. Chasing sebuah perfect Lighthouse score dan stopping di sana. Speed adalah sebuah sinyal peringkat, tidak ** sinyal peringkat. sebuah fast empty halaman tidak peringkat — konten, tautan, dan E-E-sebuah-T masih melakukan berat lifting.
  7. Putting dapat diindeks konten hanya di dalam sebuah client:only component. Unlike lainnya client:* directives, client:only skips server rendering entirely — ada Tidak HTML untuk itu component until browser hydrates ini.
  8. Treating “Astro is static/fast” (terjemahan) “Astro adalah static/fast” sebagai sebuah outcome jaminan. Static atau pada-demand HTML, islands, dan adapters adalah mechanisms — mereka jangan oleh themselves jaminan crawlability, pengindeksan, rankings, atau Core Web Vitals. Validate deployed route, tidak architecture diagram.

Di mana ini fits di cluster

Astro adalah satu spesifik, unusually SEO-friendly jawaban untuk pertanyaan JavaScript SEO raises tentang rendering, dan sebuah popular frontend untuk CMS headless setups. performa side connects secara langsung untuk Core Web Vitals di web-performa cluster, dan “is my content actually in the HTML?” (terjemahan) “adalah my konten sebenarnya di HTML?” testing discipline adalah yang sama satu dari crawling dan pengindeksan clusters.

Add an expert note

Pin an expert quote

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