Panduan Vue SEO
Vue 3 defaults untuk rendering sisi klien, so konten tidak di mentah HTML. ini adalah cara membuat Vue apps dapat di-crawl dan dapat diindeks — router mode, @unhead/vue, prerendering dengan vite-ssg, SSR/SSG dengan Nuxt, hydration, dan Core Web Vitals.
Vue 3 defaults untuk rendering sisi klien, so sebuah plain Vite + Vue app ships sebuah empty HTML shell dan membangun halaman di browser. Google dapat render ini — tetapi rendering adalah delayed dan async data dapat menjadi missed, dan Bing dan social scrapers sering dapat't jalankan JS di semua. memperbaiki: gunakan Vue Router history mode (tidak hash mode), manage <head> dengan @unhead/vue, dan put konten di HTML dengan prerendering (vite-ssg), SSR, atau SSG melalui Nuxt. Dynamic rendering adalah deprecated — jangan bangun pada ini.
TL;DR — Vue membangun Anda halaman di browser oleh default. itu berarti mentah HTML sebuah mesin pencari pertama downloads adalah nearly empty — nyata konten hanya menampilkan up setelah JavaScript berjalan. Google dapat biasanya tangani ini, tetapi Bing dan bot itu membuat social-share previews sering dapat’t. memperbaiki: gunakan Vue Router’s “history” (terjemahan) “history” mode untuk bersih URLs, tambahkan sebuah kecil library called
@unhead/vueuntuk Anda judul dan deskripsi, dan untuk halaman itu perlu untuk peringkat, bangun HTML ahead dari time (prerendering atau Nuxt) alih-alih hanya di browser.
Mengapa Vue perlu special SEO attention
Ketika Anda bangun situs dengan Vue 3 wajar cara (Vite + Vue), server mengirim sebuah tiny HTML file — basically sebuah empty container — dan sebuah big JavaScript bundle. browser berjalan itu JavaScript untuk draw sebenarnya halaman. ini adalah called client-side rendering (CSR). Bukti untuk klaim ini A Vue application can render its interface in the browser with client-side JavaScript. Cakupan: Vue client-side rendering architecture. Tingkat keyakinan: tinggi · Diverifikasi: Vue: SSR guide
sebuah human tidak pernah notices. sebuah mesin pencari mungkin. pertama hal sebuah crawler downloads adalah itu nearly-empty container. ini memiliki untuk jalankan Anda JavaScript untuk see apa pun — dan tidak setiap crawler melakukan itu well.
- Google berjalan sebuah up-untuk-date versi dari Chrome dan dapat render Anda Vue app. tetapi ini melakukan rendering kemudian, di sebuah queue, dan jika Anda konten menunggu pada sebuah slow data permintaan, Google dapat move pada sebelum ini memuat.
- Bing, DuckDuckGo, dan social-preview bot ( ones itu membuat little card ketika Anda paste sebuah tautan ke X, Slack, atau iMessage) adalah banyak lebih sedikit reliable di berjalan JavaScript. pada sebuah plain Vue app, Anda social previews dapat come up blank.
three hal untuk mendapatkan right
-
gunakan “history” (terjemahan) “history” mode di Vue Router, tidak “hash” (terjemahan) “hash” mode. Hash-mode URLs look like
example.com/#/about. Vue Router’s own docs say hash mode “memiliki a bad impact di SEO.” (terjemahan) “memiliki sebuah buruk impact di SEO.” gunakancreateWebHistory()so Anda URLs look likeexample.com/about. Bukti untuk klaim ini Vue Router recommends HTML5 history mode for normal-looking URLs and warns that hash mode has a negative SEO effect. Cakupan: Vue Router history modes. Tingkat keyakinan: tinggi · Diverifikasi: Vue Router: History modes -
Manage Anda judul dan meta tags dengan
@unhead/vue. Out dari box, setiap Vue halaman shares yang sama judul dan deskripsi.@unhead/vuelets setiap halaman set -nya own — including Open Graph dan Twitter tags itu drive social previews. -
Put Anda konten di HTML untuk halaman itu perlu untuk peringkat. alih-alih membangun semuanya di browser, bangun ini ahead dari time so konten adalah sudah di sana ketika sebuah crawler arrives. easy pada-ramp adalah prerendering dengan sebuah alat called
vite-ssg. untuk bigger atau lebih dynamic situs, Nuxt ( official Vue kerangka kerja untuk ini) melakukan ini untuk Anda.
seharusnya Anda hanya gunakan Nuxt?
untuk sebagian besar situs di mana SEO sebenarnya penting, Ya — dan Vue’s own documentation poin
Anda di sana. Nuxt menangani rendering, meta tags, sitemaps, dan robots.txt untuk
Anda. jika Anda situs adalah fairly static (sebuah marketing situs, docs, sebuah blog), vite-ssg adalah
sebuah lebih ringan option itu tidak memerlukan switching kerangka kerja.
ingin deeper versi — bagaimana Google’s render queue berfungsi, @unhead/vue code,
prerendering vs. SSR, hydration mismatches, dan Core Web Vitals? Switch untuk
Advanced tab.
TL;DR — Vue 3 adalah CSR oleh default, so konten tidak di mentah HTML — Google renders ini kemudian melalui -nya evergreen Chromium WRS, tetapi render adalah queued dan async data fetched di
onMounteddapat menjadi missed, dan Bing/social scrapers sering jangan jalankan JS di semua. Non-negotiables: Vue RoutercreateWebHistory()(hash mode memiliki “a bad impact di SEO” (terjemahan) “sebuah buruk impact di SEO”),<head>melalui@unhead/vue/useSeoMeta(), dan sebuah rendering strategy itu mendapatkan konten ke HTML —vite-ssgprerendering untuk konten-stable situs, Nuxt untuk penuh SSR/SSG. Dynamic rendering adalah deprecated;prerender-spa-pluginadalah legacy. Watch hydration mismatches (sebuah server/client konten delta adalah sebuah SEO masalah, tidak hanya sebuah perf satu) dan CSR bundle’s hit pada LCP. untuk kerangka kerja-agnostic versi dari semua dari ini, see JavaScript SEO.
default Vite + Vue scaffold adalah client-side dirender
sebuah plain npm create vue@latest app (Vite + Vue) ships sebuah near-empty HTML shell dan
sebuah JavaScript bundle. browser executes itu bundle untuk bangun DOM. ini adalah
fine untuk pengguna dan sebuah masalah untuk crawler: mentah HTML berisi hampir Tidak
konten, dan semuanya bergantung pada rendering.
itu’s sebuah property dari default scaffold, tidak sebuah ceiling pada Vue itself — Vue core
juga mendukung server rendering (createSSRApp) dan static generation sebagai
pertama-class paths, dan Vue’s own SSR guide steers sebagian besar production SSR/SSG berfungsi
toward Nuxt alih-alih sebuah hand-rolled setup. So sebelum reaching untuk sebuah perbaiki, periksa
apa Anda app adalah sebenarnya shipping: sebuah bare Vite SPA dengan Tidak rendering config adalah
CSR; yang sama app behind Nuxt atau vite-ssg tidak.
Vue’s own SSR guide adalah direct tentang upside dari tidak melakukan ini: dengan rendering sisi server, “itu penelusuran engine crawlers akan secara langsung see itu fully dirender halaman.” (terjemahan) “ mesin pencari crawler akan secara langsung see fully dirender halaman.” flip side adalah apa Anda ship oleh default — konten itu hanya ada setelah JavaScript berjalan. Bukti untuk klaim ini Vue server-side rendering sends rendered HTML so crawlers can directly see page content. Cakupan: Vue SSR benefits; does not guarantee indexing. Tingkat keyakinan: tinggi · Diverifikasi: Vue: SSR guide
(Vue 2 reached end dari life di December 2023; semuanya di sini adalah Vue 3.)
Bagaimana Googlebot menangani sebuah Vue app
Google memproses JavaScript di phases — crawl mentah HTML, lalu render ini di sebuah evergreen, headless Chromium instance ( Web rendering Service), lalu indeks dirender hasil. Dua hal ikuti dari itu:
- rendering adalah queued dan delayed. sebuah halaman sits di render queue — biasanya seconds untuk minutes, tetapi ini dapat spike. konten itu ada hanya setelah JS berjalan adalah tidak immediately dapat diindeks; konten di mentah HTML adalah.
- Async data adalah nyata risk. Synchronous JavaScript renders reliably. data
fetched dari sebuah API setelah mount adalah tidak guaranteed untuk menjadi caught. Vue’s SSR guide
says ini plainly: “Jika Anda app dimulai dengan a loading spinner, lalu fetches konten
melalui Ajax, itu crawler akan tidak tunggu untuk Anda untuk finish. Ini berarti jika Anda memiliki
konten fetched asynchronously pada halaman di mana SEO adalah important, SSR mungkin menjadi
necessary.” (terjemahan) “jika Anda app dimulai dengan sebuah memuat spinner, lalu fetches konten
melalui Ajax, crawler akan tidak tunggu untuk Anda untuk finish. ini berarti jika Anda memiliki
konten fetched asynchronously pada halaman di mana SEO adalah penting, SSR mungkin menjadi
necessary.” Practically: data fetched di
onMountedadalah client-hanya dan invisible untuk crawler itu jangan render — dan di risk bahkan dengan ones itu melakukan.
John Mueller memiliki described failure mode untuk SPA-style setups di mana static HTML adalah mostly identical dan semua unique konten bergantung pada JavaScript: jika itu JS dapat’t menjadi executed properly, halaman end up looking yang sama untuk Google, dan focus tetap pada boilerplate HTML alih-alih JS-dimuat konten. lesson adalah yang sama sebagai lebih luas JavaScript SEO halaman: mendapatkan konten ke DOM, fast dan reliably.
Bing dan social bot adalah worse di ini daripada Google. Bing memiliki Tidak rendering pipeline comparable untuk Google’s, dan social preview scrapers (X, Slack, iMessage) umumnya jangan jalankan JavaScript di semua — so sebuah bare CSR Vue app produces empty share previews. jika Bing traffic atau social sharing penting, prerendering atau SSR tidak opsional.
Vue Router: gunakan createWebHistory(), tidak hash mode
Vue Router memiliki dua history modes. Hash mode (createWebHashHistory()) produces
URLs like example.com/#/about; Vue Router’s docs say ini “melakukan namun memiliki a bad
impact di SEO” (terjemahan) “melakukan namun memiliki sebuah buruk
impact di SEO” karena semuanya setelah # adalah sebuah fragment server ignores. Bukti untuk klaim ini Vue Router hash history uses a URL fragment that is not sent to the server and is discouraged for SEO. Cakupan: Vue Router hash history. Tingkat keyakinan: tinggi · Diverifikasi: Vue Router: History modes
gunakan HTML5 history mode:
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(),
routes: [/* ... */],
})History mode memberikan bersih URLs (example.com/about) tetapi memerlukan sebuah server
fallback — apa pun direct permintaan untuk sebuah route memiliki untuk sajikan index.html so Vue dapat
take di atas, jika tidak direct hits 404. Configure itu catch-semua pada Anda host (Nginx
try_files, sebuah SPA rewrite pada Netlify/Vercel/Cloudflare, dan seterusnya.).
«Scope that rewrite carefully — a catch-all that’s too broad also serves
index.html for missing static assets, real API routes, or pages you actually
want to 404. That silently undoes the soft-404 guidance below and can hide a
broken link behind a page that looks like it “worked.”
» (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tiga puluh dua, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
untuk genuine tidak-ditemukan status, hindari soft-404s — sebuah client-side “tidak ditemukan” (terjemahan) “tidak ditemukan” view itu
masih mengembalikan 200 dapat mendapatkan terindeks sebagai sebuah empty shell. Google’s guidance adalah untuk
either redirect untuk sebuah URL itu mengembalikan sebuah nyata 404 status atau tambahkan sebuah
<meta name="robots" content="noindex"> untuk halaman error, dan untuk gunakan History API
untuk routing antara views.
Head dan meta management: @unhead/vue
oleh default setiap Vue route shares satu <title> dan satu deskripsi meta. tag
history di sini penting karena old jawaban adalah dead ends:
vue-meta— Nuxt 2-era library. Legacy.@vueuse/head— -nya successor, now sunset.@unhead/vue— saat ini community standard, dan apa Anda harus gunakan untuk sebuah non-Nuxt Vue 3 app.
ergonomic entry poin adalah useSeoMeta() composable — jenis-safe, XSS-safe,
dan aware dari 100+ meta tags including Open Graph dan Twitter Card:
import { useSeoMeta } from '@unhead/vue'
useSeoMeta({
title: 'Vue SEO Guide',
description: 'How to make a Vue 3 app crawlable and indexable.',
ogTitle: 'Vue SEO Guide',
ogDescription: 'How to make a Vue 3 app crawlable and indexable.',
twitterCard: 'summary_large_image',
})«Meta can be reactive — pass a getter or computed value and the tags update when your data does. For canonical tags, the safest pattern is still HTML, not JS: Google’s guidance is that “the best way to set the canonical URL is to use HTML,” and if you must inject it with JavaScript, always set it to the same value the HTML would. (I tested JS canonicals at Ahrefs and found Google does respect them — it even led Google to add an exception to its docs — but HTML is still the lower-risk path.) » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tiga puluh sembilan, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
Pick sebuah rendering strategy
ini adalah decision itu sebenarnya moves needle. sama menu sebagai kerangka kerja- agnostic JavaScript SEO halaman, applied untuk Vue.
rendering sisi klien (CSR) — default, dan risky satu. Acceptable untuk app-like halaman behind sebuah login, dashboards, dan apa pun Anda tidak perlu terindeks. Tidak acceptable untuk konten itu harus peringkat atau menjadi shared.
Prerendering dengan vite-ssg. untuk konten-stable Vue 3 SPAs, vite-ssg
generates static HTML di bangun time — tukar Anda bangun script dari vite build untuk
vite-ssg build. ini ships @unhead/vue dibangun di. Great untuk marketing situs, docs,
dan blogs; tidak sebuah substitute untuk SSR pada highly dynamic, per-permintaan halaman. Note itu
old webpack-era prerender-spa-plugin adalah legacy dan effectively
unmaintained — vite-ssg (atau Nuxt) adalah modern replacement.
rendering sisi server. Vue’s official guide covers sebuah manual SSR setup dengan
@vue/server-renderer, tetapi ini explicitly steers sebagian besar projects untuk sebuah meta-kerangka kerja
alih-alih rolling Anda own — dan untuk sederhana cases ini bahkan says “jika Anda hanya
investigating SSR untuk improve itu SEO dari a handful dari marketing halaman … lalu Anda
probably ingin SSG alih-alih dari SSR.” (terjemahan) “jika Anda’re hanya
investigating SSR untuk meningkatkan SEO dari sebuah handful dari marketing halaman … lalu Anda
probably ingin SSG alih-alih SSR.” jika Anda melakukan roll manual SSR, buat app,
router, dan store fresh per permintaan: pada sebuah panjang-berjalan Node server, module-tingkat
singletons mendapatkan reused di seluruh permintaan, dan mutating shared state dengan satu pengguna’s
data dapat leak ini ke lainnya pengguna’s respons. itu’s satu lebih alasan Vue’s docs
poin sebagian besar projects di Nuxt, yang menangani per-permintaan isolation untuk Anda.
Nuxt — recommended penuh solusi. Nuxt memberikan Anda SSR dan SSG out dari
box, dibangun-di useSeoMeta() dan head management, dan @nuxtjs/seo module untuk
sitemaps, robots.txt, dan data terstruktur. untuk sebagian besar Vue projects di mana SEO penting,
ini adalah path Vue’s own docs poin untuk. (Nuxt memiliki -nya own depth — covered
secara terpisah; treat ini sebagai cross-tautan, tidak deep dive.)
Dynamic rendering — jangan. Serving prerendered HTML untuk bot dan SPA untuk pengguna adalah selalu sebuah workaround, dan Google deprecated ini di 2024, menghapus implementation docs. bangun pada SSR atau SSG alih-alih.
untuk documentation secara khusus, VitePress adalah Vue-native static situs
generator. setiap halaman ships sebagai plain HTML — Tidak JS rendering barrier — dan SEO adalah
configured melalui frontmatter (title, description, head) atau transformHead
bangun hook untuk canonical/dynamic tags.
Hydration mismatches adalah sebuah SEO masalah, tidak hanya sebuah perf satu
Ketika Anda melakukan SSR/SSG, client mounts dengan createSSRApp() — tidak plain
createApp() — dan hydrates server-dirender HTML alih-alih rebuilding ini
dari scratch. jika server HTML dan client render diverge, Vue discards dan
re-renders mismatched nodes. di SEO istilah, itu berarti konten Google terindeks
dari server render dapat differ dari apa pengguna sees setelah hydration — sebuah
quality-sinyal inconsistency, tidak hanya sebuah flicker. umum penyebab: tidak valid HTML
nesting, random nilai di templates, dan date/time discrepancies antara server dan
client. Vue 3.5+ menambahkan data-allow-mismatch untuk suppress mismatch warning
selectively di mana sebuah perbedaan adalah intentional — ini quiets console, ini tidak
membuat server dan client output equivalent, so jangan reach untuk ini hanya untuk silence
sebuah mismatch Anda haven’t sebenarnya diagnosed.
Core Web Vitals adalah sebuah Vue-spesifik concern
Default CSR Vue ships sebuah besar JS bundle itu memiliki untuk download, parse, dan execute sebelum largest konten paints — so LCP suffers jika Anda melakukan tidak ada apa pun. Levers:
- Code splitting (Vite’s default) dan lazy-dimuat routes so Anda tidak ship seluruh app up front.
fetchpriority="high"pada LCP hero image.- Vapor Mode — sebuah opt-di compiler mode itu bypasses virtual DOM untuk eligible components, yang dapat cut hydration cost pada SSR halaman. ini adalah Vue 3,6, tidak 3,5 — masih experimental (beta/rilis-candidate sebagai dari pertengahan 2026, belum di stable 3,5.x line) — worth watching, tidak sesuatu untuk bergantung pada di production hari ini.
data terstruktur di Vue
Google executes JavaScript sebelum reading data terstruktur, so injecting JSON-LD
berfungsi — @unhead/vue’s useHead() dengan sebuah script dari jenis
application/ld+json adalah reliable pattern. Karena ini bergantung pada rendering,
konfirmasi ini dengan pemeriksaan URL alih-alih assuming Google saw ini.
Di mana ini fits
Vue SEO adalah satu instance dari umum JavaScript SEO masalah — parity, interaction, state, timing — dan ini shares hampir semuanya dengan CMS headless situation, di mana rendering mode dari frontend decides outcome.
Satu caveat itu applies untuk setiap option di atas: SSR dan SSG mendapatkan Anda konten ke HTML, tetapi neither jaminan pengindeksan, rankings, Core Web Vitals, atau itu hydration akan match server output persis. mereka hapus JavaScript-rendering barrier — rest dari SEO (dan correctness) adalah masih pada Anda.
jika Anda remember satu hal: mendapatkan Anda konten ke HTML. Semuanya else adalah detail.
AI summary
sebuah condensed take pada Advanced versi:
«- The default Vite + Vue scaffold is CSR — a plain npm create vue@latest app
ships a near-empty HTML shell and builds the DOM in the browser. That’s a property
of the bare scaffold, not a ceiling on Vue itself — Vue core also supports SSR
(createSSRApp) and SSG as first-class paths.
- Google renders Vue, but with caveats — its evergreen Chromium WRS runs the JS,
but rendering is queued/delayed and async data (e.g. fetched in
onMounted) can be missed. Vue’s SSR docs: a crawler “will not wait for you to finish” an Ajax fetch behind a spinner. - Bing and social scrapers are worse — they often don’t run JS at all, so a bare CSR Vue app produces empty share previews.
- Router: use
createWebHistory(), not hash mode (hash has “a bad impact in SEO”). History mode needs a serverindex.htmlfallback — scoped so it doesn’t also swallow real static assets, API routes, or intended 404s. Avoid soft-404s. - Head/meta:
@unhead/vuewithuseSeoMeta()is the current standard;vue-metais legacy,@vueuse/headis sunset. Prefer HTML canonicals. - Rendering strategy decides it: CSR (risky, OK for app pages) →
vite-ssgprerendering (content-stable sites) → SSR / SSG via Nuxt (the recommended full solution).prerender-spa-pluginis legacy; dynamic rendering is deprecated. If you roll manual SSR, build the app/router/store fresh per request to avoid cross-request state leaks. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian enam puluh tiga, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.) «- VitePress for docs sites (plain static HTML). - Hydration uses
createSSRApp(); mismatches create a server/client content delta — an SEO quality issue, not just a flicker. Vue 3.5+‘sdata-allow-mismatchsuppresses the warning for intentional cases — it doesn’t make the two renders equivalent. - Core Web Vitals: big CSR bundle hurts LCP — code-split, lazy routes,
fetchpriority="high", and (experimental, Vue 3.6 beta/RC — not stable yet) Vapor Mode. - Structured data via
@unhead/vueuseHead()JSON-LD; verify with URL Inspection. - No option here guarantees indexing, rankings, CWV, or hydration parity — SSR/SSG remove the JS-rendering barrier; the rest of SEO is still on you. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian enam puluh tiga, bagian kecil dua: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
Dokumentasi resmi
Utama-sumber documentation dari Vue dan mesin pencari.
Vue
- rendering sisi server (SSR) | Vue.js — SEO benefit dari SSR, async/spinner caveat, dan SSG-untuk-marketing-halaman recommendation.
- berbeda History modes | Vue Router —
createWebHistory()vs. hash mode, SEO note, dan server fallback requirement. - useSeoMeta() · Unhead — saat ini
@unhead/vuecomposable untuk jenis-safe meta management. - situs Config | VitePress dan Frontmatter Config | VitePress — SEO configuration untuk Vue-powered docs situs.
- antfu-collective/vite-ssg | GitHub — bangun-time prerendering untuk Vue 3 SPAs.
- memahami JavaScript SEO basics — dua-phase processing, History API recommendation, soft-404 menangani, dan HTML canonicals.
- Dynamic rendering sebagai sebuah workaround — now flagged sebagai deprecated; SSR/static rendering/hydration recommended alih-alih.
- Introducing sebuah baru JavaScript SEO video series — Google’s official JS SEO series (mencakup Vue.js episode).
Quotes dari sumber
pada—record statements dari Vue dan Google. setiap tautan adalah sebuah deep tautan itu jumps untuk quoted passage pada sumber halaman.
Vue — SSR & SEO
«- “Better SEO: the search engine crawlers will directly see the fully rendered page.” — Vue.js SSR guide. Jump to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tujuh puluh lima, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.) «- “As of now, Google and Bing can index synchronous JavaScript applications just fine. Synchronous being the key word there. If your app starts with a loading spinner, then fetches content via Ajax, the crawler will not wait for you to finish.” Jump to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tujuh puluh lima, bagian kecil dua: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.) «- “If you’re only investigating SSR to improve the SEO of a handful of marketing pages … then you probably want SSG instead of SSR.” Jump to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tujuh puluh lima, bagian kecil tiga: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
Vue Router — history mode
- pada hash mode: “It does however have a bad impact in SEO.” (terjemahan) “ini melakukan namun memiliki sebuah buruk impact di SEO.” Jump untuk quote
Google — JavaScript SEO basics
«- On canonicals: “The best way to set the canonical URL is to use HTML, but if you have to use JavaScript, make sure that you always set the canonical URL to the same value as the original HTML.” Jump to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tujuh puluh sembilan, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
Google — dynamic rendering (deprecated)
«- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” Jump to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian delapan puluh satu, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
Note: wording attributed untuk John Mueller pada SPA rendering failures, dan Martin Splitt calling SSR sebuah “lifesaver,” (terjemahan) “lifesaver,” adalah relayed melalui sekunder coverage (mesin pencari Land / mesin pencari Journal) alih-alih sebuah verified verbatim sumber, so mereka’re paraphrased di atas alih-alih quoted. Konfirmasi terhadap original talk/transcript sebelum treating either sebagai sebuah direct quote.Vue SEO checklist
sebuah lulus untuk konfirmasi sebuah Vue 3 app adalah dapat di-crawl dan dapat diindeks:
- Vue Router menggunakan
createWebHistory()(HTML5 history mode), tidakcreateWebHashHistory(). - server memiliki sebuah
index.htmlfallback so direct route hits jangan 404. -
@unhead/vueadalah wired up; setiap halaman sets -nya own judul, deskripsi, dan canonical (tidak semua sharing default). - Open Graph / Twitter Card tags adalah present (dan sebenarnya render untuk social scrapers — i.e. mereka’re di disajikan HTML, tidak CSR-hanya).
- Canonical adalah set di HTML di mana mungkin; jika injected melalui JS, ini matches.
- SEO-critical konten adalah di HTML melalui SSR/SSG/prerender — tidak fetched di
onMountedpada sebuah CSR halaman. - Client-side tidak-ditemukan status mengembalikan nyata
404atau sebuahnoindex(Tidak soft-404 shells). - JavaScript dan CSS adalah tidak blocked di
robots.txt. - Tidak dynamic-rendering dependency di baru membangun (deprecated oleh Google).
- Core Web Vitals lulus — code splitting, lazy routes,
fetchpriority="high"pada LCP image. - jika SSR/SSG: Tidak hydration mismatches (periksa console; gunakan
data-allow-mismatchhanya untuk intentional ones). - data terstruktur (JSON-LD) confirmed di dirender HTML melalui pemeriksaan URL.
mental models
1. default adalah trap. Vue 3 out dari box adalah CSR — konten tidak di mentah HTML. Semuanya di Vue SEO adalah tentang overriding itu default untuk halaman itu perlu untuk menjadi ditemukan.
2. rendering decides outcome.
single highest-leverage pilihan adalah bagaimana HTML adalah produced: CSR (risky) →
prerender/vite-ssg (konten-stable) → SSR/SSG melalui Nuxt (dynamic, SEO-critical).
Pick lightest option itu puts Anda konten di HTML.
3. Synchronous di HTML, tidak async setelah mount. konten itu’s di sana synchronously renders reliably; data fetched setelah mount dapat menjadi missed — oleh crawler itu render late, dan entirely oleh ones itu jangan.
4. Dua audiences dari bot. Google renders (eventually). Bing dan social scrapers largely jangan. Design untuk worse satu jika Bing traffic atau share previews penting — itu berarti HTML, tidak CSR.
5. decision tree untuk sebuah baru Vue project.
Pure app behind sebuah login? CSR adalah fine. konten-stable marketing/docs/blog? vite-ssg
atau VitePress. Dynamic, per-permintaan, SEO-critical konten? Nuxt. tidak pernah reach untuk
dynamic rendering atau prerender-spa-plugin — keduanya adalah dead ends di 2026.
6. server dan client harus agree. Hydration mismatch tidak hanya sebuah perf nit — ini adalah sebuah konten delta antara apa Google terindeks dan apa pengguna mendapatkan. pertahankan dua renders identical.
Vue SEO — cheat sheet
Router mode
| Mode | URL | SEO |
|---|---|---|
createWebHistory() | example.com/about | gunakan ini (perlu server fallback) |
createWebHashHistory() | example.com/#/about | ”Bad impact in SEO” (terjemahan) “buruk impact di SEO” — hindari |
Head / meta libraries
| Library | Status |
|---|---|
vue-meta | Legacy (Nuxt 2 era) |
@vueuse/head | Sunset |
@unhead/vue (useSeoMeta()) | saat ini standard |
rendering strategies
| Strategy | Ketika | SEO risk |
|---|---|---|
| CSR (default) | App halaman, behind login | Highest |
vite-ssg prerender | konten-stable SPAs (marketing/docs/blog) | rendah |
| SSR (Nuxt) | Dynamic, per-permintaan halaman | rendah |
| SSG (Nuxt / VitePress) | konten known di bangun time | Lowest |
prerender-spa-plugin | — | Legacy/unmaintained — jangan |
| Dynamic rendering | — | Deprecated oleh Google — jangan |
Fast facts
- Google renders Vue (evergreen Chromium WRS) — tetapi delayed, dan async data dapat menjadi missed.
- Bing + social scrapers sering jangan jalankan JS — bare CSR = empty share previews.
- Canonicals: HTML pertama; JS canonicals berfungsi tetapi adalah riskier.
- Vue 2 adalah EOL (Dec 2023) — Vue 3 hanya.
Bagaimana seharusnya sebuah Vue route render?
Choose sebuah Vue SEO rendering path
Vue SEO mistakes
- Shipping penelusuran landing halaman sebagai sebuah Vite SPA shell. gunakan Nuxt SSR/SSG atau prerendering so essential konten adalah di sumber HTML.
- menggunakan hash mode untuk publik konten routes. Fragments melakukan tidak buat wajar server URLs. gunakan history routing dengan host fallback configured correctly.
- Setting head tags hanya setelah client fetches. Generate metadata dari server/bangun data melalui head integration.
- menggunakan dynamic rendering sebagai panjang-istilah perbaiki. Maintain satu consistent pengguna/crawler rendering path alih-alih bot-spesifik output.
- Testing hanya dengan Google. Mentah HTML penting untuk lainnya mesin pencari, social scrapers, dan alat itu melakukan tidak execute application fully.
Mentah HTML berisi hanya Vue mount element
mungkin penyebab: route adalah CSR-hanya. Perbaiki: move ini untuk Nuxt SSR/SSG atau prerender finite route set. Konfirmasi: curl mengembalikan utama konten dan tautan.
Direct route permintaan kembalikan 404
mungkin penyebab: Vue Router history mode lacks server fallback atau deployment omitted generated routes. Perbaiki: configure host rewrites untuk SPA-hanya routes atau deploy sebenarnya SSR/static route output. Konfirmasi: refresh dan direct permintaan mengembalikan yang dimaksud status dan halaman.
judul perbarui di browser tetapi tidak di sumber
mungkin penyebab: metadata bergantung pada client lifecycle atau sebuah asynchronous browser fetch. Perbaiki: resolve data selama SSR/SSG dan render head tags dengan @unhead/vue atau Nuxt’s head APIs. Konfirmasi: mentah dan dirender judul, canonicals, dan robots directives agree.
Hydration replaces correct server konten
mungkin penyebab: server/client data atau environment branches disagree. Perbaiki: membuat awal data deterministic dan hapus browser-hanya conditions dari essential markup. Konfirmasi: hydration menyelesaikan tanpa mismatch warnings atau mengubah dapat diindeks konten.
Bandingkan Vue mentah dan dirender output
curl -fsSL https://example.com/page/ > raw.html
grep -Eio '<title>[^<]+|<h1[^>]*>[^<]+|<link[^>]+rel="canonical"[^>]*' raw.htmlJalankan ini di DevTools Console setelah hydration:
({title: document.title, h1: document.querySelector('h1')?.textContent.trim(), canonical: document.querySelector('link[rel="canonical"]')?.href, links: [...document.querySelectorAll('a[href]')].length});jika penting nilai exist hanya di Console hasil, SSR/prerendering adalah incomplete.
temukan hash-based konten tautan
[...document.querySelectorAll('a[href^="#"]')].map(a => ({text: a.textContent.trim(), href: a.getAttribute('href')}));Review list manually: di-halaman navigation adalah fine; menggunakan fragments sebagai terpisah konten routes adalah masalah.
alat untuk Vue SEO
- pemeriksaan URL (Google Search Console) — sumber kebenaran. Jalankan sebuah langsung test dan periksa dirender HTML, screenshot, halaman resources (adalah apa pun JS/CSS blocked?), dan console messages. ini adalah bagaimana Anda konfirmasi Anda Vue konten, meta, dan JSON-LD sebenarnya dirender.
- Rich hasil Test — sebuah fast dirender-HTML + structured-data periksa untuk sebuah single URL tanpa verifying situs.
- Chrome DevTools — diff View Sumber (mentah HTML, apa sebuah non-rendering bot sees) terhadap Elements panel ( hydrated DOM). Console surfaces hydration mismatch warnings.
- Vue Devtools — inspect component state dan router mode sementara Anda debug apa client-hanya vs. server-dirender.
vite-ssg— bangun-time prerendering untuk konten-stable Vue 3 SPAs (tukarvite build→vite-ssg build).- JavaScript-rendering crawler — Ahrefs situs Audit dan Screaming Frog (JS-rendering mode) execute JS so Anda dapat diff mentah vs. dirender di seluruh seluruh Vue situs.
- Lighthouse / PageSpeed Insights — catch CSR bundle’s hit pada LCP dan Core Web Vitals levers (code splitting, lazy routes, image priority).
Uji pemahaman Anda: Vue SEO
Five quick pertanyaan pada membuat Vue apps dapat di-crawl dan dapat diindeks. Pick sebuah jawaban untuk setiap, lalu periksa.
Resources worth Anda time
My writing
- JavaScript SEO: sebuah Definitive Guide — my penuh guide untuk rendering, DOM parity, dan kerangka kerja-tingkat decisions; mencakup Vue Router history-vs-hash guidance dan my JS-canonical test.
- Beginner’s Guide untuk SEO teknis — di mana rendering dan JavaScript SEO fit di bigger picture.
My speaking
- Bagaimana Penelusuran berfungsi (SlideShare) — my walkthrough dari crawling, rendering, pengindeksan, dan peringkat. (My standing disclaimer applies: “Ini adalah my understanding dari sistem… tidak going untuk menjadi 100% menyelesaikan atau accurate.” (terjemahan) “ini adalah my understanding dari sistem… tidak going untuk menjadi 100% menyelesaikan atau accurate.”)
dari sekitar industry
- rendering sisi server (SSR) | Vue.js — official guide: SSR’s SEO benefit, async caveat, dan ketika untuk pick SSG alih-alih.
- berbeda History modes | Vue Router — mengapa hash mode hurts SEO dan cara configure history mode.
- useSeoMeta() · Unhead — saat ini
@unhead/vuemeta API. - antfu-collective/vite-ssg | GitHub — bangun-time prerendering untuk Vue 3 SPAs.
- situs Config | VitePress — SEO untuk Vue-powered documentation situs.
- Bagaimana Nuxt.js solves SEO masalah di Vue.js | LogRocket — case untuk Nuxt sebagai SSR/SSG path.
- Google Tidak lebih lama recommends menggunakan dynamic rendering | mesin pencari Land — coverage dari dynamic-rendering deprecation.
- Vue.js dan SEO: cara mengoptimalkan Reactive situs web | Smashing Magazine — sebuah widely-cited 2019 piece; berguna untuk async-timing experiments, tetapi dated pada tooling (pre-evergreen Chromium).
Videos
- SEO teknis tips untuk Vue.js oleh Martin Splitt (Google Search Central, 2019) — Google’s own Vue-spesifik JavaScript SEO episode: membuat judul, deskripsi, dan URLs discoverable ketika Anda bangun dengan Vue. Watch
- Google Search Central (YouTube) — Martin Splitt’s lebih luas JavaScript SEO series covers rendering, render queue, dan failure modes itu apply untuk apa pun Vue app. Channel
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.
-
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.