Panduan Client-Side JavaScript Kerangka kerja

React, Vue, Angular, Svelte, dan SolidJS share satu SEO masalah — rendering sisi klien ships sebuah empty shell — dan satu perbaiki pattern: head management plus sebuah rendering strategy.

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

React, Vue, Angular, Svelte, dan SolidJS adalah UI libraries itu, oleh default, ship sebuah near-empty HTML shell dan bangun halaman di browser (rendering sisi klien). itu berarti crawler mendapatkan sebuah blank halaman until JavaScript berjalan — Google dapat render ini, tetapi pada sebuah delayed queue, dan lainnya crawler (Bing, AI bot) adalah far lebih sedikit reliable. perbaiki adalah yang sama di seluruh semua five: (1) sebuah head-management package so meta tags exist untuk setiap route, dan (2) sebuah rendering strategy — prerendering, SSR, atau moving untuk matching meta-kerangka kerja. ini hub menjelaskan shared masalah dan shared perbaiki, lalu poin Anda untuk per-kerangka kerja deep dives.

TL;DR — React, Vue, Angular, Svelte, dan SolidJS adalah semua UI libraries itu default untuk rendering sisi klien: mereka ship sebuah near-empty HTML shell dan bangun DOM di browser. SEO masalah adalah identical di seluruh semua five — crawler mendapatkan sebuah empty shell, dan konten hanya ada setelah JS executes. Google renders ini apps tetapi pada sebuah delayed, queued basis; Bing dan AI crawler adalah banyak lebih sedikit dependable. perbaiki adalah juga identical: (1) head management (sebuah per-route package untuk <title>/meta) dan (2) sebuah rendering strategy (prerendering, SSR, atau migrating untuk matching meta-kerangka kerja). differences antara kerangka kerja adalah mostly yang package dan yang strategy — covered di setiap deep dive di bawah.

mereka’re libraries, tidak penuh kerangka kerja — dan itu’s root dari ini

kerangka kerja architecture varies, so client rendering adalah tidak sebuah automatic pengindeksan failure. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: MDN: Client-side frameworks server rendering atau prerendering reduces dependence pada crawler-side JavaScript execution tanpa guaranteeing pengindeksan. Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: JavaScript SEO basics

React, Vue, Angular, Svelte, dan SolidJS adalah primarily UI rendering libraries. mereka job adalah untuk turn Anda data ke sebuah DOM dan pertahankan ini di sync sebagai state perubahan. Out dari box, itu DOM adalah dibangun di browser — yang adalah persis apa membuat them feel fast dan app-like, dan persis apa membuat SEO masalah.

sebuah default bangun ships sebuah HTML shell dengan sebuah empty mount node (<div id="root">, <div id="app">, <app-root>) dan sebuah JavaScript bundle. Semuanya sebuah penelusuran mesin cares tentang — heading, body copy, tautan internal, data terstruktur — adalah injected oleh itu bundle setelah ini downloads dan executes. sebelum JS berjalan, ada tidak ada apa pun di sana.

ini adalah rendering sisi klien — out-dari—box perilaku untuk bare libraries sebelum Anda tambahkan sebuah meta-kerangka kerja atau sebuah bangun-time prerender langkah. ini adalah tidak sebuah bug; ini adalah default Anda mulai dari. tetapi “default” (terjemahan) “default” tidak “permanent” (terjemahan) “permanent” atau “universal” (terjemahan) “universal”: default perubahan oleh versi dan oleh yang CLI atau starter Anda digunakan, dan dua routes di yang sama app dapat end up pada berbeda rendering modes depending pada bagaimana setiap satu adalah dibangun (sebuah marketing halaman prerendered, sebuah dashboard left sebagai pure CSR). jangan assume sebuah kerangka kerja’s perilaku dari -nya name — periksa apa sebuah diberikan route di sebuah diberikan bangun sebenarnya ships.

shared masalah: sebuah empty shell

Google adalah jelas itu ini memproses JS apps di phases — crawl, render, indeks — dan itu “without rendering Google might not see that content.” (terjemahan) “tanpa rendering Google mungkin tidak see itu konten.” untuk sebuah CSR app, semua konten lives behind itu render langkah. Three consequences fall out dari itu:

  • ** render adalah delayed, dan tunggu tidak fixed.** rendering adalah sebuah terpisah, queued langkah setelah crawling — Google documents crawl, render, dan indeks sebagai three distinct phases, tetapi ini tidak commit untuk satu universal tunggu time untuk setiap halaman. delay varies oleh URL dan oleh Google’s own resourcing di time; Anda konten tidak exist untuk pengindeksan until render sebenarnya menyelesaikan, namun panjang itu takes untuk itu halaman.
  • Non-Google crawler tidak sebuah diberikan. Bing renders JavaScript inconsistently, dan sebagian besar AI crawler ( bot fetching halaman untuk LLMs dan AI penelusuran) melakukan little atau Tidak JS execution. ini adalah terpisah companies dengan terpisah infrastructure, so none dari ini generalizes dari Google’s documentation — verify setiap provider’s saat ini perilaku alih-alih assuming ini matches Google’s atau terakhir tahun’s test. sebuah CSR-hanya situs risks menjadi near-invisible untuk whichever crawler jangan render, dan AI crawler adalah sebuah growing share dari traffic.
  • Per-halaman metadata adalah missing. Satu HTML file berarti satu <title> dan satu meta deskripsi untuk setiap route unless Anda actively manage head per route.

shared perbaiki, bagian 1: head management

Karena sebuah SPA memiliki sebuah single HTML document, Anda perlu code itu memperbarui document head sebagai pengguna (dan crawler’s renderer) moves antara routes. setiap kerangka kerja memiliki sebuah canonical package atau dibangun-di API untuk ini:

  • Reactreact-helmet-async (atau kerangka kerja’s metadata API jika Anda’ve moved untuk Berikutnya.js).
  • Vue@unhead/vue ( mesin behind Nuxt’s SEO utilities).
  • Angulardibangun-di Title dan Meta services dari @angular/platform-browser — Tidak extra dependency.
  • Svelte → dibangun-di <svelte:head> element.
  • SolidJS@solidjs/meta (dan SolidStart untuk SSR path).

Head management mendapatkan Anda correct, unique meta tags — tetapi ini melakukan tidak solve empty-shell masalah pada -nya own. tags masih hanya muncul setelah JS berjalan. itu’s mengapa Anda juga perlu bagian 2.

shared perbaiki, bagian 2: sebuah rendering strategy

untuk put nyata konten (dan head tags) ke HTML sebelum JavaScript executes, Anda choose satu dari three approaches. peringkat, oleh bagaimana banyak SEO risk mereka hapus:

  1. Prerendering / static generation (SSG). bangun static HTML untuk setiap route di bangun time. Lowest risk untuk konten itu tidak perubahan per permintaan. setiap library memiliki sebuah prerender path (e.g. SolidJS’s dibangun-di prerender, Vue prerender plugins, Angular’s prerendering).
  2. rendering sisi server (SSR). Render HTML pada server per permintaan, lalu hydrate di browser. ini adalah di mana meta-kerangka kerja come di — Berikutnya.js (React), Nuxt (Vue), Angular SSR (formerly Angular Universal), SvelteKit (Svelte), dan SolidStart (SolidJS). untuk sebagian besar konten situs itu harus peringkat, adopting matching meta-kerangka kerja adalah paling bersih perbaiki.
  3. Stay penuh CSR, tetapi membuat ini dapat di-crawl. Sometimes acceptable untuk app-like surfaces behind sebuah login itu jangan perlu untuk peringkat — tetapi sebuah poor default untuk apa pun Anda ingin di penelusuran.

membuat ini panggil per route, tidak per app. sebuah marketing halaman dan sebuah logged-di dashboard di yang sama codebase dapat reasonably land pada berbeda rows dari itu list. untuk setiap route, tanyakan:

  • Output — melakukan konten perlu untuk menjadi di awal respons, atau adalah ini fine untuk muncul setelah JS berjalan?
  • Freshness — adalah ini stable cukup untuk bangun setelah (prerender), atau melakukan ini perubahan per permintaan (SSR)?
  • Personalization — adalah ini berbeda per pengunjung? Prerendering dapat’t help di sana; Anda’re choosing antara SSR dan CSR.
  • server cost — SSR menambahkan compute pada setiap permintaan; prerendering front-memuat itu cost di bangun time alih-alih.
  • JS dependence — bagaimana banyak dari route’s usefulness bergantung pada client JavaScript berjalan di semua?
  • Failure perilaku — jika JS fails atau adalah blocked, melakukan route degrade untuk sesuatu usable, atau untuk tidak ada apa pun?

decision adalah yang sama conversation regardless dari kerangka kerja: melakukan ini konten perlu untuk peringkat atau menjadi cited? jika Ya, mendapatkan ini ke server-dirender atau prerendered HTML. jika ini adalah purely interactive app UI, CSR adalah fine.

Bagaimana Google menangani ini apps (dan mengapa others jangan)

Google dapat render setiap satu dari ini kerangka kerja — ini berjalan sebuah evergreen, headless Chrome dan executes Anda JS. tetapi ini melakukan so pada sebuah deferred queue, dan renderer adalah stateless (Tidak persisted cookies/localStorage, Tidak service workers, Tidak interaction — ini tidak akan scroll atau click). So yang sama JS-SEO aturan dari JavaScript SEO hub apply pada top dari kerangka kerja pilihan: nyata <a href> tautan, parity antara mentah dan dirender DOM, Tidak konten gated behind interaction, Tidak JS-injected noindex.

Di luar Google, picture adalah worse. Bing’s JS rendering adalah patchier, dan AI crawler largely jangan render di semua. untuk sebuah CSR app, itu dapat berarti Anda konten ada untuk Google (eventually) tetapi tidak untuk Bing atau untuk AI alat itu sebuah increasing angka dari orang penelusuran dengan. SSR atau prerendering closes itu kesenjangan untuk everyone, tidak hanya Google — yang adalah strongest argument untuk tidak shipping CSR-hanya konten.

five kerangka kerja di sebuah glance

kerangka kerjaDefaultHead managementSSR / meta-kerangka kerjaSEO note
ReactCSRreact-helmet-asyncBerikutnya.js (Metadata API)paling umum CSR-pertama SPA; Berikutnya.js adalah standard SEO perbaiki
VueCSR@unhead/vueNuxt (useSeoMeta())Nuxt adalah SSR-oleh-default; plain Vue perlu prerender atau Nuxt
AngularCSR (SPA)dibangun-di Title/Meta servicesAngular SSR (adalah Universal)Big SPAs; modern Angular menambahkan SSR + incremental hydration
SvelteCSR (Svelte) / SSR (SvelteKit)<svelte:head>SvelteKit (SSR default)SvelteKit adalah SSR oleh default — watch ssr:false static trap
SolidJSCSR@solidjs/metaSolidStartFine-grained reactivity; SolidStart menambahkan SSR + prerender

pattern adalah consistent: sebuah CSR default, sebuah head package, dan sebuah rendering strategy (biasanya matching meta-kerangka kerja). Apa differs adalah names dan sebuah sedikit sharp edges.

Di mana untuk go berikutnya: kerangka kerja deep dives

ini hub adalah map. setiap kerangka kerja memiliki -nya own guide dengan spesifik packages, config, dan gotchas:

  • React SEO — mengapa CSR-pertama React membuat pengindeksan risk, React Router dan History API, react-helmet-async, dan ketika untuk reach untuk Berikutnya.js.
  • Vue SEO — Vue 3’s CSR default, createWebHistory(), @unhead/vue, prerendering tanpa sebuah meta-kerangka kerja, dan ketika Nuxt adalah right panggil.
  • Angular SEO — Angular’s SPA defaults, @angular/ssr, dibangun-di Title dan Meta services, prerendering, dan incremental hydration.
  • Svelte SEO — Svelte vs SvelteKit, SSR oleh default di SvelteKit, <svelte:head>, adapter-static + ssr: false trap, dan AI-crawler implications.
  • SolidJS SEO — SolidJS’s CSR default, @solidjs/meta, SolidStart untuk SSR dan prerendering, dan bagaimana -nya fine-grained model memengaruhi dirender output.

untuk rendering modes themselves (CSR, SSR, SSG, ISR, hydration, dynamic rendering) dan lebih luas render/parity aturan, see parent JavaScript SEO hub.

Add an expert note

Pin an expert quote

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