Panduan Vue SEO
Vue 3 defaults untuk rendering sisi klien, so konten isn't di raw 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.
Bahasa
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 run JS di semua. fixes: gunakan Vue Router history mode (not hash mode), manage <head> dengan @unhead/vue, dan put konten di HTML dengan prerendering (vite-ssg), SSR, atau SSG via Nuxt. Dynamic rendering adalah deprecated — don't bangun pada ini.
TL;DR — Vue membangun Anda halaman di browser oleh default. itu berarti raw HTML sebuah mesin pencari pertama downloads adalah nearly empty — nyata konten hanya menampilkan up setelah JavaScript runs. Google dapat biasanya handle ini, tetapi Bing dan bot itu membuat social-share previews sering dapat’t. fixes: gunakan Vue Router’s “history” (terjemahan) “history” mode untuk clean 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.
Why Vue perlu special SEO attention
When Anda bangun situs dengan Vue 3 normal cara (Vite + Vue), server mengirim sebuah tiny HTML file — basically sebuah empty container — dan sebuah big JavaScript bundle. browser runs itu JavaScript untuk draw actual halaman. ini adalah called client-side rendering (CSR). Evidence for this claim A Vue application can render its interface in the browser with client-side JavaScript. Scope: Vue client-side rendering architecture. Confidence: high · Verified: Vue: SSR guide
sebuah human tidak pernah notices. sebuah mesin pencari mungkin. pertama thing sebuah crawler downloads adalah itu nearly-empty container. ini memiliki untuk run Anda JavaScript untuk see anything — dan not setiap crawler melakukan itu well.
- Google runs sebuah up-untuk-date versi dari Chrome dan dapat render Anda Vue app. tetapi ini melakukan rendering later, di sebuah queue, dan jika Anda konten waits pada sebuah slow data permintaan, Google dapat move pada sebelum ini memuat.
- Bing, DuckDuckGo, dan social-preview bot ( ones itu membuat little card when Anda paste sebuah tautan ke X, Slack, atau iMessage) adalah much less reliable di running JavaScript. pada sebuah plain Vue app, Anda social previews dapat come up blank.
three things untuk get right
-
gunakan “history” (terjemahan) “history” mode di Vue Router, not “hash” (terjemahan) “hash” mode. Hash-mode URLs look like
example.com/#/about. Vue Router’s own docs say hash mode “has a bad impact in SEO.” (terjemahan) “memiliki sebuah buruk impact di SEO.” gunakancreateWebHistory()so Anda URLs look likeexample.com/about. Evidence for this claim Vue Router recommends HTML5 history mode for normal-looking URLs and warns that hash mode has a negative SEO effect. Scope: Vue Router history modes. Confidence: high · Verified: 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 everything di browser, bangun ini ahead dari time so konten adalah sudah there when sebuah crawler arrives. easy pada-ramp adalah prerendering dengan sebuah alat called
vite-ssg. untuk bigger atau more dynamic situs, Nuxt ( official Vue framework untuk ini) melakukan ini untuk Anda.
seharusnya Anda hanya gunakan Nuxt?
untuk sebagian besar situs where SEO actually penting, yes — dan Vue’s own documentation poin
Anda there. Nuxt handles 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 lighter option itu doesn’t memerlukan switching frameworks.
ingin deeper versi — how 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 isn’t di raw HTML — Google renders ini later via -nya evergreen Chromium WRS, tetapi render adalah queued dan async data fetched di
onMounteddapat menjadi missed, dan Bing/social scrapers sering don’t run JS di semua. Non-negotiables: Vue RoutercreateWebHistory()(hash mode memiliki “a bad impact in SEO” (terjemahan) “sebuah buruk impact di SEO”),<head>via@unhead/vue/useSeoMeta(), dan sebuah rendering strategy itu gets konten ke HTML —vite-ssgprerendering untuk konten-stable situs, Nuxt untuk full SSR/SSG. Dynamic rendering adalah deprecated;prerender-spa-pluginadalah legacy. Watch hydration mismatches (sebuah server/client konten delta adalah sebuah SEO masalah, not hanya sebuah perf one) dan CSR bundle’s hit pada LCP. untuk framework-agnostic versi dari semua dari ini, see JavaScript SEO.
default Vite + Vue scaffold adalah client-side rendered
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: raw HTML berisi almost no
konten, dan everything depends pada rendering.
itu’s sebuah property dari default scaffold, not 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 fix, periksa
what Anda app adalah actually shipping: sebuah bare Vite SPA dengan no rendering config adalah
CSR; yang sama app behind Nuxt atau vite-ssg isn’t.
Vue’s own SSR guide adalah direct tentang upside dari not doing ini: dengan rendering sisi server, “the search engine crawlers will directly see the fully rendered page.” (terjemahan) “ mesin pencari crawler akan directly see fully rendered halaman.” flip side adalah what Anda ship oleh default — konten itu hanya exists setelah JavaScript runs. Evidence for this claim Vue server-side rendering sends rendered HTML so crawlers can directly see page content. Scope: Vue SSR benefits; does not guarantee indexing. Confidence: high · Verified: Vue: SSR guide
(Vue 2 reached end dari life di December 2023; everything here adalah Vue 3.)
How Googlebot handles sebuah Vue app
Google processes JavaScript di phases — crawl raw HTML, lalu render ini di sebuah evergreen, headless Chromium instance ( Web rendering Service), lalu indeks rendered hasil. Two things ikuti dari itu:
- rendering adalah queued dan delayed. sebuah halaman sits di render queue — biasanya seconds untuk minutes, tetapi ini dapat spike. konten itu exists hanya setelah JS runs adalah not immediately dapat diindeks; konten di raw HTML adalah.
- Async data adalah nyata risk. Synchronous JavaScript renders reliably. data
fetched dari sebuah API setelah mount adalah not guaranteed untuk menjadi caught. Vue’s SSR guide
says ini plainly: “If your app starts with a loading spinner, then fetches content
via Ajax, the crawler will not wait for you to finish. This means if you have
content fetched asynchronously on pages where SEO is important, SSR might be
necessary.” (terjemahan) “jika Anda app starts dengan sebuah memuat spinner, lalu fetches konten
via Ajax, crawler akan not wait untuk Anda untuk finish. ini berarti jika Anda memiliki
konten fetched asynchronously pada halaman where SEO adalah penting, SSR mungkin menjadi
necessary.” Practically: data fetched di
onMountedadalah client-hanya dan invisible untuk crawler itu don’t render — dan di risk bahkan dengan ones itu melakukan.
John Mueller memiliki described failure mode untuk SPA-style setups where static HTML adalah mostly identical dan semua unique konten depends pada JavaScript: jika itu JS dapat’t menjadi executed properly, halaman end up looking yang sama untuk Google, dan focus stays pada boilerplate HTML alih-alih JS-dimuat konten. lesson adalah yang sama sebagai broader JavaScript SEO halaman: get konten ke DOM, fast dan reliably.
Bing dan social bot adalah worse di ini daripada Google. Bing memiliki no rendering pipeline comparable untuk Google’s, dan social preview scrapers (X, Slack, iMessage) umumnya don’t run JavaScript di semua — so sebuah bare CSR Vue app produces empty share previews. jika Bing traffic atau social sharing penting, prerendering atau SSR isn’t optional.
Vue Router: gunakan createWebHistory(), not hash mode
Vue Router memiliki two history modes. Hash mode (createWebHashHistory()) produces
URLs like example.com/#/about; Vue Router’s docs say ini “does however have a bad
impact in SEO” (terjemahan) “melakukan however memiliki sebuah buruk
impact di SEO” because everything setelah # adalah sebuah fragment server ignores. Evidence for this claim Vue Router hash history uses a URL fragment that is not sent to the server and is discouraged for SEO. Scope: Vue Router hash history. Confidence: high · Verified: Vue Router: History modes
gunakan HTML5 history mode:
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(),
routes: [/* ... */],
})History mode gives clean 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, otherwise direct hits 404. Configure itu catch-semua pada Anda host (Nginx
try_files, sebuah SPA rewrite pada Netlify/Vercel/Cloudflare, etc.).
Scope itu rewrite carefully — sebuah catch-semua itu’s too broad juga menyajikan
index.html untuk missing static assets, nyata API routes, atau halaman Anda actually
ingin untuk 404. itu silently undoes soft-404 guidance below dan dapat hide sebuah
broken tautan behind sebuah halaman itu looks like ini “worked.” (terjemahan) “worked.”
untuk genuine not-ditemukan states, hindari soft-404s — sebuah client-side “not found” (terjemahan) “tidak ditemukan” view itu
masih mengembalikan 200 dapat get 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 one <title> dan one deskripsi meta. tag
history here penting because 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 what 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 dapat menjadi reactive — pass sebuah getter atau computed nilai dan tags update when Anda data melakukan. untuk tag canonical, safest pattern adalah masih HTML, not JS: Google’s guidance adalah itu “the best way to set the canonical URL is to use HTML,” (terjemahan) “ best cara untuk atur canonical URL adalah untuk gunakan HTML,” dan jika Anda harus inject ini dengan JavaScript, selalu set ini untuk yang sama nilai HTML akan. (I tested JS canonicals di Ahrefs dan ditemukan Google melakukan respect them — ini bahkan led Google untuk tambahkan sebuah exception untuk -nya docs — tetapi HTML adalah masih lower-risk path.)
Pick sebuah rendering strategy
ini adalah decision itu actually moves needle. sama menu sebagai framework- agnostic JavaScript SEO halaman, applied untuk Vue.
rendering sisi klien (CSR) — default, dan risky one. Acceptable untuk app-like halaman behind sebuah login, dashboards, dan anything Anda tidak perlu terindeks. Not 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 — swap Anda bangun script dari vite build untuk
vite-ssg build. ini ships @unhead/vue dibangun di. Great untuk marketing situs, docs,
dan blogs; not 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-framework
alih-alih rolling Anda own — dan untuk sederhana cases ini bahkan says “if you’re only
investigating SSR to improve the SEO of a handful of marketing pages … then you
probably want SSG instead of 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-running Node server, module-tingkat
singletons get reused di seluruh permintaan, dan mutating shared state dengan one pengguna’s
data dapat leak ini ke lainnya pengguna’s respons. itu’s one more alasan Vue’s docs
poin sebagian besar projects di Nuxt, which handles per-permintaan isolation untuk Anda.
Nuxt — recommended full solusi. Nuxt gives 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 where SEO penting,
ini adalah path Vue’s own docs poin untuk. (Nuxt memiliki -nya own depth — covered
separately; treat ini sebagai cross-tautan, not deep dive.)
Dynamic rendering — don’t. 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 instead.
untuk documentation specifically, VitePress adalah Vue-native static situs
generator. setiap halaman ships sebagai plain HTML — no JS rendering barrier — dan SEO adalah
configured via frontmatter (title, description, head) atau transformHead
bangun hook untuk canonical/dynamic tags.
Hydration mismatches adalah sebuah SEO masalah, not hanya sebuah perf one
When Anda melakukan SSR/SSG, client mounts dengan createSSRApp() — not plain
createApp() — dan hydrates server-rendered 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 what pengguna sees setelah hydration — sebuah
quality-signal inconsistency, not hanya sebuah flicker. umum causes: invalid 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 where sebuah difference adalah intentional — ini quiets console, ini doesn’t
membuat server dan client output equivalent, so don’t reach untuk ini hanya untuk silence
sebuah mismatch Anda haven’t actually 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 nothing. Levers:
- Code splitting (Vite’s default) dan lazy-dimuat routes so Anda tidak ship whole app up front.
fetchpriority="high"pada LCP hero image.- Vapor Mode — sebuah opt-di compiler mode itu bypasses virtual DOM untuk eligible components, which dapat cut hydration cost pada SSR halaman. ini adalah Vue 3,6, not 3,5 — masih experimental (beta/release-candidate sebagai dari mid-2026, not yet di stable 3,5.x line) — worth watching, not something untuk depend pada di production today.
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. Because ini depends pada rendering,
confirm ini dengan pemeriksaan URL alih-alih assuming Google saw ini.
Where ini fits
Vue SEO adalah one instance dari umum JavaScript SEO masalah — parity, interaction, state, timing — dan ini shares almost everything dengan CMS headless situation, where rendering mode dari frontend decides outcome.
One caveat itu applies untuk setiap option above: SSR dan SSG get Anda konten ke HTML, tetapi neither guarantees pengindeksan, rankings, Core Web Vitals, atau itu hydration akan match server output exactly. mereka hapus JavaScript-rendering barrier — rest dari SEO (dan correctness) adalah masih pada Anda.
jika Anda remember one thing: get Anda konten ke HTML. Everything else adalah detail.
AI summary
sebuah condensed take pada Advanced versi:
- ** default Vite + Vue scaffold adalah CSR** — sebuah plain
npm create vue@latestapp ships sebuah near-empty HTML shell dan membangun DOM di browser. itu’s sebuah property dari bare scaffold, not sebuah ceiling pada Vue itself — Vue core juga mendukung SSR (createSSRApp) dan SSG sebagai pertama-class paths. - Google renders Vue, tetapi dengan caveats — -nya evergreen Chromium WRS runs JS,
tetapi rendering adalah queued/delayed dan async data (e.g. fetched di
onMounted) dapat menjadi missed. Vue’s SSR docs: sebuah crawler “will not wait for you to finish” (terjemahan) “akan not wait untuk Anda untuk finish” sebuah Ajax fetch behind sebuah spinner. - Bing dan social scrapers adalah worse — mereka sering don’t run JS di semua, so sebuah bare CSR Vue app produces empty share previews.
- Router: gunakan
createWebHistory(), not hash mode (hash memiliki “a bad impact in SEO” (terjemahan) “sebuah buruk impact di SEO”). History mode perlu sebuah serverindex.htmlfallback — scoped so ini doesn’t juga swallow nyata static assets, API routes, atau intended 404s. hindari soft-404s. - Head/meta:
@unhead/vuedenganuseSeoMeta()adalah saat ini standard;vue-metaadalah legacy,@vueuse/headadalah sunset. Prefer HTML canonicals. - rendering strategy decides ini: CSR (risky, OK untuk app halaman) →
vite-ssgprerendering (konten-stable situs) → SSR / SSG via Nuxt ( recommended full solusi).prerender-spa-pluginadalah legacy; dynamic rendering adalah deprecated. jika Anda roll manual SSR, bangun app/router/store fresh per permintaan untuk hindari cross-permintaan state leaks. - VitePress untuk docs situs (plain static HTML).
- Hydration menggunakan
createSSRApp(); mismatches buat server/client konten delta — sebuah SEO quality issue, not hanya sebuah flicker. Vue 3.5+‘sdata-allow-mismatchsuppresses warning untuk intentional cases — ini doesn’t membuat two renders equivalent. - Core Web Vitals: big CSR bundle hurts LCP — code-split, lazy routes,
fetchpriority="high", dan (experimental, Vue 3.6 beta/RC — not stable yet) Vapor Mode. - data terstruktur via
@unhead/vueuseHead()JSON-LD; verify dengan URL Inspection. - No option here guarantees pengindeksan, rankings, CWV, atau hydration parity — SSR/SSG hapus JS-rendering barrier; rest dari SEO adalah masih pada Anda.
Official documentation
Primary-source 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 — two-phase processing, History API recommendation, soft-404 handling, dan HTML canonicals.
- Dynamic rendering sebagai sebuah workaround — now flagged sebagai deprecated; SSR/static rendering/hydration recommended instead.
- Introducing sebuah baru JavaScript SEO video series — Google’s official JS SEO series (mencakup Vue.js episode).
Quotes dari source
pada—record statements dari Vue dan Google. setiap tautan adalah sebuah deep tautan itu jumps untuk quoted passage pada source halaman.
Vue — SSR & SEO
- “Better SEO: the search engine crawlers will directly see the fully rendered page.” (terjemahan) “Better SEO: mesin pencari crawler akan directly see fully rendered halaman.” — Vue.js SSR guide. Jump untuk quote
- “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.” (terjemahan) “sebagai dari now, Google dan Bing dapat indeks synchronous JavaScript applications hanya fine. Synchronous menjadi key kata there. jika Anda app starts dengan sebuah memuat spinner, lalu fetches konten via Ajax, crawler akan not wait untuk Anda untuk finish.” Jump untuk quote
- “If you’re only investigating SSR to improve the SEO of a handful of marketing pages … then you probably want SSG instead of 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.” Jump untuk quote
Vue Router — history mode
- pada hash mode: “It does however have a bad impact in SEO.” (terjemahan) “ini melakukan however memiliki sebuah buruk impact di SEO.” Jump untuk quote
Google — JavaScript SEO basics
- pada 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.” (terjemahan) “ best cara untuk atur canonical URL adalah untuk gunakan HTML, tetapi jika Anda memiliki untuk gunakan JavaScript, pastikan itu Anda selalu atur canonical URL untuk yang sama nilai sebagai original HTML.” Jump untuk quote
Google — dynamic rendering (deprecated)
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” (terjemahan) “Dynamic rendering adalah sebuah workaround dan not sebuah panjang-istilah solusi untuk masalah dengan JavaScript-generated konten di mesin pencari.” Jump untuk quote
Vue SEO checklist
sebuah pass untuk confirm sebuah Vue 3 app adalah dapat di-crawl dan dapat diindeks:
- Vue Router menggunakan
createWebHistory()(HTML5 history mode), notcreateWebHashHistory(). - server memiliki sebuah
index.htmlfallback so direct route hits don’t 404. -
@unhead/vueadalah wired up; setiap halaman sets -nya own judul, deskripsi, dan canonical (not semua sharing default). - Open Graph / Twitter Card tags adalah present (dan actually render untuk social scrapers — i.e. mereka’re di disajikan HTML, not CSR-hanya).
- Canonical adalah set di HTML where mungkin; jika injected via JS, ini matches.
- SEO-critical konten adalah di HTML via SSR/SSG/prerender — not fetched di
onMountedpada sebuah CSR halaman. - Client-side not-ditemukan states mengembalikan nyata
404atau sebuahnoindex(no soft-404 shells). - JavaScript dan CSS adalah not blocked di
robots.txt. - No dynamic-rendering dependency di baru membangun (deprecated oleh Google).
- Core Web Vitals pass — code splitting, lazy routes,
fetchpriority="high"pada LCP image. - jika SSR/SSG: no hydration mismatches (periksa console; gunakan
data-allow-mismatchhanya untuk intentional ones). - data terstruktur (JSON-LD) confirmed di rendered HTML via pemeriksaan URL.
mental models
1. default adalah trap. Vue 3 out dari box adalah CSR — konten isn’t di raw HTML. Everything di Vue SEO adalah tentang overriding itu default untuk halaman itu perlu untuk menjadi ditemukan.
2. rendering decides outcome.
single highest-leverage choice adalah how HTML adalah produced: CSR (risky) →
prerender/vite-ssg (konten-stable) → SSR/SSG via Nuxt (dynamic, SEO-critical).
Pick lightest option itu puts Anda konten di HTML.
3. Synchronous di HTML, not async setelah mount. konten itu’s there synchronously renders reliably; data fetched setelah mount dapat menjadi missed — oleh crawler itu render late, dan entirely oleh ones itu don’t.
4. Two audiences dari bot. Google renders (eventually). Bing dan social scrapers largely don’t. Design untuk worse one jika Bing traffic atau share previews penting — itu berarti HTML, not 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 — both adalah dead ends di 2026.
6. server dan client harus agree. Hydration mismatch isn’t hanya sebuah perf nit — ini adalah sebuah konten delta antara what Google terindeks dan what pengguna gets. pertahankan two 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 | When | 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 — don’t |
| Dynamic rendering | — | Deprecated oleh Google — don’t |
Fast facts
- Google renders Vue (evergreen Chromium WRS) — tetapi delayed, dan async data dapat menjadi missed.
- Bing + social scrapers sering don’t run JS — bare CSR = empty share previews.
- Canonicals: HTML pertama; JS canonicals berfungsi tetapi adalah riskier.
- Vue 2 adalah EOL (Dec 2023) — Vue 3 hanya.
How seharusnya sebuah Vue route render?
Choose a Vue SEO rendering path
Vue SEO mistakes
- Shipping search landing halaman sebagai sebuah Vite SPA shell. gunakan Nuxt SSR/SSG atau prerendering so essential konten adalah di source HTML.
- menggunakan hash mode untuk public konten routes. Fragments melakukan not buat normal 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 fix. Maintain one consistent pengguna/crawler rendering path alih-alih bot-spesifik output.
- Testing hanya dengan Google. Raw HTML penting untuk lainnya mesin pencari, social scrapers, dan alat itu melakukan not execute application fully.
Raw HTML berisi hanya Vue mount element
mungkin cause: route adalah CSR-hanya. Fix: move ini untuk Nuxt SSR/SSG atau prerender finite route set. Confirm: curl mengembalikan primary konten dan tautan.
Direct route permintaan kembalikan 404
mungkin cause: Vue Router history mode lacks server fallback atau deployment omitted generated routes. Fix: configure host rewrites untuk SPA-hanya routes atau deploy actual SSR/static route output. Confirm: refresh dan direct permintaan mengembalikan intended status dan halaman.
judul update di browser tetapi not di source
mungkin cause: metadata depends pada client lifecycle atau sebuah asynchronous browser fetch. Fix: resolve data selama SSR/SSG dan render head tags dengan @unhead/vue atau Nuxt’s head APIs. Confirm: raw dan rendered judul, canonicals, dan robots directives agree.
Hydration replaces correct server konten
mungkin cause: server/client data atau environment branches disagree. Fix: membuat initial data deterministic dan hapus browser-hanya conditions dari essential markup. Confirm: hydration completes without mismatch warnings atau changing dapat diindeks konten.
Compare Vue raw dan rendered output
curl -fsSL https://example.com/page/ > raw.html
grep -Eio '<title>[^<]+|<h1[^>]*>[^<]+|<link[^>]+rel="canonical"[^>]*' raw.htmlRun 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 separate konten routes adalah masalah.
alat untuk Vue SEO
- pemeriksaan URL (Google Search Console) — sumber kebenaran. Run sebuah live test dan periksa rendered HTML, screenshot, halaman resources (adalah apa pun JS/CSS blocked?), dan console messages. ini adalah how Anda confirm Anda Vue konten, meta, dan JSON-LD actually rendered.
- Rich hasil Test — sebuah fast rendered-HTML + structured-data periksa untuk sebuah single URL without verifying situs.
- Chrome DevTools — diff View Source (raw HTML, what sebuah non-rendering bot sees) terhadap Elements panel ( hydrated DOM). Console surfaces hydration mismatch warnings.
- Vue Devtools — inspect component state dan router mode while Anda debug what’s client-hanya vs. server-rendered.
vite-ssg— bangun-time prerendering untuk konten-stable Vue 3 SPAs (swapvite build→vite-ssg build).- JavaScript-rendering crawler — Ahrefs situs Audit dan Screaming Frog (JS-rendering mode) execute JS so Anda dapat diff raw vs. rendered di seluruh whole Vue situs.
- Lighthouse / PageSpeed Insights — catch CSR bundle’s hit pada LCP dan Core Web Vitals levers (code splitting, lazy routes, image priority).
Test yourself: 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 full guide untuk rendering, DOM parity, dan framework-tingkat decisions; mencakup Vue Router history-vs-hash guidance dan my JS-canonical test.
- Beginner’s Guide untuk SEO teknis — where rendering dan JavaScript SEO 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
- rendering sisi server (SSR) | Vue.js — official guide: SSR’s SEO benefit, async caveat, dan when untuk pick SSG instead.
- berbeda History modes | Vue Router — why 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.
- How Nuxt.js solves SEO masalah di Vue.js | LogRocket — case untuk Nuxt sebagai SSR/SSG path.
- Google no longer 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 when Anda bangun dengan Vue. Watch
- Google Search Central (YouTube) — Martin Splitt’s broader 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.