Hướng dẫn về Vue SEO
Vue 3 defaults để client-side kết xuất, so đó nội dung không trong đó thô HTML. Này là cách làm Vue apps crawlable và indexable — router chế độ, @unhead/vue, prerendering với vite-ssg, SSR/SSG với Nuxt, hydration, và Core Web Vitals.
Ngôn ngữ
Vue 3 defaults để client-side kết xuất, so một đơn giản Vite + Vue app ships an empty HTML shell và xây dựng đó trang trong đó trình duyệt. Google có thể render điều này — nhưng kết xuất là delayed và async dữ liệu có thể là missed, và Bing và social scrapers thường không thể chạy đó JS tại all. Đó các cách sửa: dùng Vue Router history chế độ (không hash chế độ), manage <head> với @unhead/vue, và put nội dung trong đó HTML với prerendering (vite-ssg), SSR, hoặc SSG qua Nuxt. Dynamic kết xuất là deprecated — không xây dựng on điều này.
Tóm tắt — Vue xây dựng của bạn trang trong trình duyệt theo mặc định. đó có nghĩ là thô HTML công cụ tìm kiếm đầu tiên downloads là nearly rỗng — nội dung thực chỉ hiển thị lên sau khi JavaScript chạy. Google có thể thường xử lý điều này, nhưng Bing và bots đó làm social-share previews thường có thể’t. các cách sửa: sử dụng Vue Router “history” chế độ cho sạch các URL, thêm nhỏ library được gọi là
@unhead/vuecho của bạn các tiêu đề và các mô tả, và Đối với các trang đó cần để xếp hạng, xây dựng HTML ahead của time (prerendering hoặc Nuxt) thay vì chỉ trong trình duyệt.
Vì sao Vue cần special SEO attention
Khi bạn xây dựng trang web với Vue 3 thông thường way (Vite + Vue), máy chủ gửi tiny HTML file — basically rỗng container — và big JavaScript bundle. trình duyệt chạy đó JavaScript để draw thực tế trang. Đây là được gọi là client-side kết xuất (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
human không bao giờ notices. công cụ tìm kiếm có thể. đầu tiên điều crawler downloads là đó nearly-rỗng container. nó có để chạy của bạn JavaScript để see bất cứ điều gì — và không mỗi crawler làm đó well.
- Google chạy lên-để-date version của Chrome và có thể render của bạn Vue app. nhưng nó làm kết xuất sau đó, trong queue, và nếu của bạn nội dung chờ on chậm dữ liệu yêu cầu, Google có thể move on trước khi nó loads.
- Bing, DuckDuckGo, và social-preview bots ( ones đó làm little card Khi bạn paste link vào X, Slack, hoặc iMessage) là nhiều ít hơn reliable tại đang chạy JavaScript. On đơn giản Vue app, của bạn social previews có thể come lên blank.
three điều để nhận right
-
Dùng “history” chế độ trong Vue Router, không “hash” chế độ. Hash-chế độ URLs trông giống
example.com/#/about. Vue Router own tài liệu chẳng hạn hash chế độ “has a bad impact in SEO.” (bản dịch) «có một bad impact trong SEO.» DùngcreateWebHistory()so của bạn URLs trông giốngexample.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 của bạn các tiêu đề và meta tags với
@unhead/vue. Out của box, mỗi Vue trang chia sẻ giống nhau tiêu đề và mô tả.@unhead/vuelets mỗi trang đặt của nó own — including Open Graph và Twitter tags đó drive social previews. -
Put của bạn nội dung trong HTML Đối với các trang đó cần để xếp hạng. thay vì building mọi thứ trong trình duyệt, xây dựng nó ahead của time so nội dung là đã ở đó Khi crawler arrives. easy on-ramp là prerendering với tool được gọi là
vite-ssg. cho bigger hoặc nhiều hơn dynamic các trang, Nuxt ( chính thức Vue framework cho điều này) làm nó cho bạn.
nên bạn chỉ sử dụng Nuxt?
cho phần lớn các trang nơi SEO thực ra matters, có — và Vue own tài liệu points
bạn ở đó. Nuxt xử lý kết xuất, meta tags, sitemaps, và robots.txt cho
bạn. nếu của bạn trang web là fairly static ( marketing trang web, tài liệu, blog), vite-ssg là
nhẹ hơn option đó không require switching các framework.
Muốn deeper version — Cách Google render queue hoạt động, @unhead/vue code,
prerendering so với. SSR, hydration mismatches, và Core Web Vitals? Chuyển để
Nâng cao tab.
TL;DR — Vue 3 là CSR theo mặc định, so đó nội dung không trong đó thô HTML — Google renders điều này sau đó qua của nó evergreen Chromium WRS, nhưng đó render là queued và async dữ liệu fetched trong
onMountedcó thể là missed, và Bing/social scrapers thường không chạy đó JS tại all. Non-negotiables: Vue RoutercreateWebHistory()(hash chế độ có “a bad impact in SEO” (bản dịch) «một bad impact trong SEO»),<head>qua@unhead/vue/useSeoMeta(), và một kết xuất strategy đó nhận nội dung vào HTML —vite-ssgprerendering cho nội dung-ổn định các trang, Nuxt cho đầy đủ SSR/SSG. Dynamic kết xuất là deprecated;prerender-spa-pluginlà legacy. Watch hydration mismatches (một máy chủ/client nội dung delta là an SEO vấn đề, không chỉ một perf một) và đó CSR bundle hit on LCP. Cho đó framework-agnostic version of toàn bộ điều này, see JavaScript SEO.
default Vite + Vue scaffold là client-side được kết xuất
đơn giản npm create vue@latest app (Vite + Vue) ships near-rỗng HTML shell và
JavaScript bundle. trình duyệt executes đó bundle để xây dựng DOM. Đây là
fine cho người dùng và vấn đề cho các crawler: thô HTML contains gần như không
nội dung, và mọi thứ phụ thuộc vào kết xuất.
đó thuộc tính của default scaffold, không ceiling on Vue itself — Vue cốt lõi
cũng hỗ trợ máy chủ kết xuất (createSSRApp) và static generation as
đầu tiên-class paths, và Vue own SSR hướng dẫn steers phần lớn production SSR/SSG hoạt động
toward Nuxt thay vì hand-rolled setup. So trước khi reaching cho khắc phục, kiểm tra
Điều gì của bạn app là thực ra shipping: bare Vite SPA với không kết xuất config là
CSR; giống nhau app behind Nuxt hoặc vite-ssg không phải.
Vue own SSR hướng dẫn là trực tiếp về đó upside of không đang làm này: với máy chủ-side kết xuất, “the search engine crawlers will directly see the fully rendered page.” (bản dịch) «đó công cụ tìm kiếm các crawler sẽ trực tiếp see đó fully được kết xuất trang.» Đó flip side là điều gì bạn ship theo mặc định — nội dung đó chỉ tồn tại sau JavaScript chạy. 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 của life trong December 2023; mọi thứ ở đây là Vue 3.)
Cách Googlebot xử lý Vue app
Google xử lý JavaScript trong phases — crawl thô HTML, sau đó render nó trong evergreen, headless Chromium instance ( Web Kết xuất Service), sau đó chỉ mục được kết xuất kết quả. Hai điều follow từ đó:
- Kết xuất là queued và delayed. MỘT trang sits trong đó render queue — thường seconds để minutes, nhưng điều này có thể spike. Nội dung đó tồn tại chỉ sau JS chạy là không immediately indexable; nội dung trong đó thô HTML là.
- Async dữ liệu là đó real risk. Synchronous JavaScript renders reliably. Dữ liệu
fetched từ an API sau mount không phải guaranteed để là caught. Vue SSR hướng dẫn
says điều này 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.” (bản dịch) «Nếu của bạn app bắt đầu với một loading spinner, thì fetches nội dung qua Ajax, đó crawler sẽ không chờ cho bạn để finish. Này có nghĩa là nếu bạn có nội dung fetched asynchronously on các trang nơi SEO là quan trọng, SSR có thể là necessary.» Practically: dữ liệu fetched trong
onMountedlà client-chỉ và invisible để các crawler đó không render — và tại risk ngay cả với đó ones đó làm.
John Mueller có described thất bại chế độ cho SPA-style setups nơi static HTML là mostly giống hệt và all unique nội dung phụ thuộc vào JavaScript: nếu đó JS có thể’t là executed properly, các trang end lên looking giống nhau để Google, và focus vẫn giữ on boilerplate HTML thay vì JS-loaded nội dung. lesson là giống nhau as rộng hơn JavaScript SEO trang: nhận nội dung vào DOM, fast và reliably.
Bing và social bots là tệ hơn tại điều này hơn Google. Bing có không kết xuất pipeline comparable để Google, và social preview scrapers (X, Slack, iMessage) generally không chạy JavaScript tại all — so bare CSR Vue app produces rỗng share previews. nếu Bing traffic hoặc social sharing matters, prerendering hoặc SSR không phải tùy chọn.
Vue Router: sử dụng createWebHistory(), không hash chế độ
Vue Router có hai history modes. Hash chế độ (createWebHashHistory()) produces
URLs như example.com/#/about; Vue Router tài liệu chẳng hạn điều này “does however have a bad
impact in SEO” (bản dịch) «làm tuy nhiên có một bad impact trong SEO» vì mọi thứ sau đó # là một fragment đó máy chủ bỏ qua. 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
Dùng HTML5 history chế độ:
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(),
routes: [/* ... */],
})History chế độ cho sạch các URL (example.com/about) nhưng requires máy chủ
fallback — bất kỳ trực tiếp yêu cầu để route có để phục vụ index.html so Vue có thể
take over, nếu không trực tiếp hits 404. Configure đó catch-all on của bạn host (Nginx
try_files, SPA rewrite on Netlify/Vercel/Cloudflare, etc.).
Phạm vi đó rewrite cẩn thận — catch-all đó cũng rộng cũng phục vụ
index.html cho bị thiếu static assets, thực API routes, hoặc các trang bạn thực ra
muốn để 404. đó silently undoes soft-404 hướng dẫn dưới và có thể hide
hỏng link behind trang đó looks như nó “worked.”
cho genuine không-tìm thấy trạng thái, tránh soft-404s — client-side “không tìm thấy” view đó
vẫn trả về 200 có thể nhận được lập chỉ mục as rỗng shell. Google hướng dẫn là để
either chuyển hướng để URL đó trả về thực 404 status hoặc thêm
<meta name="robots" content="noindex"> để lỗi các trang, và để sử dụng History API
cho routing giữa views.
Head và meta management: @unhead/vue
theo mặc định mỗi Vue route chia sẻ một <title> và một mô tả meta. tag
history ở đây matters vì old các câu trả lời là dead ends:
vue-meta— Nuxt 2-era library. Legacy.@vueuse/head— của nó successor, hiện tại sunset.@unhead/vue— hiện tại community tiêu chuẩn, và Điều gì bạn nên sử dụng cho non-Nuxt Vue 3 app.
ergonomic entry point là useSeoMeta() composable — loại-safe, XSS-safe,
và aware của 100+ meta tags including Open Graph và 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 có thể là reactive — truyền một getter hoặc computed giá trị và đó tags cập nhật khi của bạn dữ liệu làm. Cho canonical tags, đó safest pattern là vẫn HTML, không JS: Google hướng dẫn là đó “the best way to set the canonical URL is to use HTML,” (bản dịch) «đó best way để set đó canonical URL là để dùng HTML,» và nếu bạn phải inject điều này với JavaScript, luôn set điều này để đó giống nhau giá trị đó HTML sẽ. (I tested JS canonicals tại Ahrefs và được tìm thấy Google làm respect them — điều này ngay cả led Google để thêm an exception để của nó tài liệu — nhưng HTML là vẫn đó thấp hơn-risk path.)
Pick kết xuất strategy
Đây là decision đó thực ra moves needle. giống nhau menu as framework- agnostic JavaScript SEO trang, applied để Vue.
Client-side kết xuất (CSR) — default, và risky một. Acceptable cho app-như các trang behind login, dashboards, và bất cứ điều gì bạn không cần được lập chỉ mục. không acceptable cho nội dung đó phải xếp hạng hoặc là shared.
Prerendering với vite-ssg. cho nội dung-ổn định Vue 3 SPAs, vite-ssg
generates static HTML tại xây dựng time — đổi của bạn xây dựng script từ vite build để
vite-ssg build. nó ships @unhead/vue được xây dựng trong. Great cho marketing các trang, tài liệu,
và blogs; không substitute cho SSR on highly dynamic, theo-yêu cầu các trang. Note đó
old webpack-era prerender-spa-plugin là legacy và effectively
unmaintained — vite-ssg (hoặc Nuxt) là modern replacement.
Máy chủ-side kết xuất. Vue chính thức hướng dẫn covers một manual SSR setup với
@vue/server-renderer, nhưng điều này explicitly steers hầu hết projects để một meta-framework
thay vì rolling của bạn own — và cho đơn giản cases điều này ngay cả 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.” (bản dịch) «nếu bạn là chỉ investigating SSR để improve đó SEO of một handful of marketing các trang … thì bạn probably muốn SSG thay vì SSR.» Nếu bạn làm roll manual SSR, tạo đó app,
router, và store fresh theo yêu cầu: on một dài-đang chạy Node máy chủ, module-cấp độ
singletons nhận reused trên các yêu cầu, và mutating shared state với một người dùng
dữ liệu có thể leak điều này vào một sản phẩm khác người dùng phản hồi. đó là một hơn reason Vue tài liệu
point hầu hết projects tại Nuxt, mà xử lý theo-yêu cầu isolation cho bạn.
Nuxt — được khuyến nghị đầy đủ giải pháp. Nuxt cho bạn SSR và SSG out của
box, được xây dựng-trong useSeoMeta() và head management, và @nuxtjs/seo module cho
sitemaps, robots.txt, và dữ liệu có cấu trúc. cho phần lớn Vue projects nơi SEO matters,
Đây là path Vue own tài liệu point để. (Nuxt có của nó own depth — covered
riêng; treat điều này as cross-link, không deep dive.)
Dynamic kết xuất — không. Serving prerendered HTML để bots và SPA để người dùng là luôn workaround, và Google deprecated nó trong 2024, removing implementation tài liệu. Xây dựng on SSR hoặc SSG thay vì.
cho tài liệu cụ thể, VitePress là Vue-native static trang web
generator. mỗi trang ships as đơn giản HTML — không JS kết xuất barrier — và SEO là
configured qua frontmatter (title, description, head) hoặc transformHead
xây dựng hook cho canonical/dynamic tags.
Hydration mismatches là SEO vấn đề, không chỉ perf một
Khi bạn làm SSR/SSG, client mounts với createSSRApp() — không đơn giản
createApp() — và hydrates máy chủ-được kết xuất HTML thay vì rebuilding nó
từ scratch. nếu máy chủ HTML và client render diverge, Vue discards và
re-renders mismatched nodes. trong SEO terms, đó có nghĩ là nội dung Google được lập chỉ mục
từ máy chủ render có thể differ từ Điều gì người dùng sees sau khi hydration —
quality-tín hiệu inconsistency, không chỉ flicker. phổ biến gây ra: không hợp lệ HTML
nesting, random các giá trị trong templates, và date/time discrepancies giữa máy chủ và
client. Vue 3,5+ adds data-allow-mismatch để suppress mismatch warning
selectively nơi khác biệt là intentional — nó quiets console, nó không
làm máy chủ và client output tương đương, so không reach cho nó chỉ để silence
mismatch bạn haven’t thực ra diagnosed.
Core Web Vitals là Vue-cụ thể concern
Default CSR Vue ships lớn JS bundle đó có để download, parse, và execute trước khi largest nội dung paints — so LCP suffers nếu bạn làm không có gì. Levers:
- Code splitting (Vite default) và lazy-loaded routes so bạn không ship toàn bộ app lên front.
fetchpriority="high"on LCP hero image.- Vapor Chế độ — opt-trong compiler chế độ đó bypasses virtual DOM cho eligible components, mà có thể cut hydration cost on SSR các trang. nó Vue 3,6, không 3,5 — vẫn experimental (beta/phát hành-candidate as của mid-2026, không tuy vậy trong ổn định 3,5.x line) — worth watching, không điều gì đó để phụ thuộc on trong production hôm nay.
Dữ liệu có cấu trúc trong Vue
Google executes JavaScript trước khi reading dữ liệu có cấu trúc, so injecting JSON-LD
hoạt động — @unhead/vue’s useHead() với script của loại
application/ld+json là reliable pattern. vì nó phụ thuộc vào kết xuất,
xác nhận nó với URL Inspection thay vì assuming Google saw nó.
nơi điều này fits
Vue SEO là một instance của chung JavaScript SEO vấn đề — parity, interaction, state, timing — và nó chia sẻ gần như mọi thứ với headless CMS situation, nơi kết xuất chế độ của frontend decides outcome.
Một caveat đó áp dụng để mỗi option trên: SSR và SSG nhận của bạn nội dung vào HTML, nhưng neither bảo đảm lập chỉ mục, thứ hạng, Core Web Vitals, hoặc đó hydration sẽ match máy chủ output chính xác. họ xóa JavaScript-kết xuất barrier — rest của SEO (và correctness) là vẫn on bạn.
nếu bạn remember một điều: nhận của bạn nội dung vào HTML. Mọi thứ khác là detail.
AI summary
condensed take on Nâng cao version:
- Đó default Vite + Vue scaffold là CSR — một đơn giản
npm create vue@latestapp ships một near-empty HTML shell và xây dựng đó DOM trong đó trình duyệt. đó là một thuộc tính of đó bare scaffold, không một ceiling on Vue itself — Vue cốt lõi cũng hỗ trợ SSR (createSSRApp) và SSG as đầu tiên-class paths. - Google renders Vue, nhưng với caveats — của nó evergreen Chromium WRS chạy đó JS,
nhưng kết xuất là queued/delayed và async dữ liệu (e.g. fetched trong
onMounted) có thể là missed. Vue SSR tài liệu: một crawler “will not wait for you to finish” (bản dịch) «sẽ không chờ cho bạn để finish» an Ajax fetch behind một spinner. - Bing và social scrapers là tệ hơn — they thường không chạy JS tại all, so một bare CSR Vue app produces empty share previews.
- Router: dùng
createWebHistory(), không hash chế độ (hash có “a bad impact in SEO” (bản dịch) «một bad impact trong SEO»). History chế độ cần một máy chủindex.htmlfallback — scoped so điều này không cũng swallow real static assets, API routes, hoặc dự kiến 404s. Tránh soft-404s. - Head/meta:
@unhead/vuevớiuseSeoMeta()là đó hiện tại tiêu chuẩn;vue-metalà legacy,@vueuse/headlà sunset. Ưu tiên HTML canonicals. - Kết xuất strategy decides điều này: CSR (risky, OK cho app các trang) →
vite-ssgprerendering (nội dung-ổn định các trang) → SSR / SSG qua Nuxt (đó được khuyến nghị đầy đủ giải pháp).prerender-spa-pluginlà legacy; dynamic kết xuất là deprecated. Nếu bạn roll manual SSR, xây dựng đó app/router/store fresh theo yêu cầu để tránh cross-yêu cầu state leaks. - VitePress cho tài liệu các trang (đơn giản static HTML).
- Hydration dùng
createSSRApp(); mismatches tạo một máy chủ/client nội dung delta — an SEO quality vấn đề, không chỉ một flicker. Vue 3,5+‘sdata-allow-mismatchsuppresses đó warning cho intentional cases — điều này không làm đó hai renders tương đương. - Core Web Vitals: big CSR bundle hurts LCP — code-split, lazy routes,
fetchpriority="high", và (experimental, Vue 3,6 beta/RC — không ổn định tuy vậy) Vapor Chế độ. - Dữ liệu có cấu trúc qua
@unhead/vueuseHead()JSON-LD; verify với URL Inspection. - Không option ở đây bảo đảm lập chỉ mục, thứ hạng, CWV, hoặc hydration parity — SSR/SSG xóa đó JS-kết xuất barrier; đó rest of SEO là vẫn on bạn.
Tài liệu chính thức
Chính-nguồn tài liệu từ Vue và các công cụ tìm kiếm.
Vue
- máy chủ-Side Kết xuất (SSR) | Vue.js — SEO benefit của SSR, async/spinner caveat, và SSG-cho-marketing-các trang khuyến nghị.
- khác History modes | Vue Router —
createWebHistory()so với. hash chế độ, SEO note, và máy chủ fallback requirement. - useSeoMeta() · Unhead — hiện tại
@unhead/vuecomposable cho loại-safe meta management. - trang web Config | VitePress và Frontmatter Config | VitePress — SEO configuration cho Vue-powered tài liệu các trang.
- antfu-collective/vite-ssg | GitHub — xây dựng-time prerendering cho Vue 3 SPAs.
- Understand JavaScript SEO basics — hai-phase processing, History API khuyến nghị, soft-404 xử lý, và HTML canonicals.
- Dynamic Kết xuất as workaround — hiện tại flagged as deprecated; SSR/static kết xuất/hydration được khuyến nghị thay vì.
- Introducing new JavaScript SEO video series — Google chính thức JS SEO series (bao gồm Vue.js episode).
Quotes từ nguồn
On—record statements từ Vue và Google. mỗi link là deep link đó jumps để quoted passage on nguồn trang.
Vue — SSR & SEO
- “Better SEO: the search engine crawlers will directly see the fully rendered page.” (bản dịch) «Tốt hơn SEO: đó công cụ tìm kiếm các crawler sẽ trực tiếp see đó fully được kết xuất trang.» — Vue.js SSR hướng dẫn. Nhảy đến trích dẫn
- “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.” (bản dịch) «As of hiện tại, Google và Bing có thể chỉ mục synchronous JavaScript applications chỉ fine. Synchronous đang đó key word ở đó. Nếu của bạn app bắt đầu với một loading spinner, thì fetches nội dung qua Ajax, đó crawler sẽ không chờ cho bạn để finish.» Nhảy đến trích dẫn
- “If you’re only investigating SSR to improve the SEO of a handful of marketing pages … then you probably want SSG instead of SSR.” (bản dịch) «Nếu bạn là chỉ investigating SSR để improve đó SEO of một handful of marketing các trang … thì bạn probably muốn SSG thay vì SSR.» Nhảy đến trích dẫn
Vue Router — history chế độ
- On hash chế độ: “It does however have a bad impact in SEO.” (bản dịch) «Điều này làm tuy nhiên có một bad impact trong SEO.» Nhảy đến trích dẫn
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.” (bản dịch) «Đó best way để set đó canonical URL là để dùng HTML, nhưng nếu bạn có để dùng JavaScript, hãy bảo đảm đó bạn luôn set đó canonical URL để đó giống nhau giá trị as đó original HTML.» Nhảy đến trích dẫn
Google — dynamic kết xuất (deprecated)
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” (bản dịch) «Dynamic kết xuất đã là một workaround và không một dài-term giải pháp cho các vấn đề với JavaScript-generated nội dung trong các công cụ tìm kiếm.» Nhảy đến trích dẫn
Vue SEO checklist
truyền để xác nhận Vue 3 app là crawlable và indexable:
- Vue Router dùng
createWebHistory()(HTML5 history chế độ), khôngcreateWebHashHistory(). - máy chủ có
index.htmlfallback so trực tiếp route hits không 404. -
@unhead/vuelà wired lên; mỗi trang sets của nó own tiêu đề, mô tả, và canonical (không all sharing default). - Open Graph / Twitter Card tags là present (và thực ra render cho social scrapers — i.e. họ’re trong phân phối HTML, không CSR-chỉ).
- Canonical là đặt trong HTML nơi có thể; nếu injected qua JS, nó matches.
- SEO-cốt yếu nội dung là trong HTML qua SSR/SSG/prerender — không fetched trong
onMountedon CSR trang. - Client-side không-tìm thấy trạng thái trả về thực
404hoặcnoindex(không soft-404 shells). - JavaScript và CSS không phải blocked trong
robots.txt. - Không dynamic-kết xuất dependency trong new xây dựng (deprecated by Google).
- Core Web Vitals truyền — code splitting, lazy routes,
fetchpriority="high"on LCP image. - nếu SSR/SSG: không hydration mismatches (kiểm tra console; sử dụng
data-allow-mismatchchỉ cho intentional ones). - Dữ liệu có cấu trúc (JSON-LD) confirmed trong được kết xuất HTML qua URL Inspection.
mental models
1. default là trap. Vue 3 out của box là CSR — nội dung không phải trong thô HTML. Mọi thứ trong Vue SEO là về overriding đó default Đối với các trang đó cần để là tìm thấy.
2. Kết xuất decides outcome.
single highest-leverage lựa chọn là Cách HTML là produced: CSR (risky) →
prerender/vite-ssg (nội dung-ổn định) → SSR/SSG qua Nuxt (dynamic, SEO-cốt yếu).
Pick lightest option đó diễn đạt của bạn nội dung trong HTML.
3. Synchronous trong HTML, không async sau khi mount. nội dung đó ở đó synchronously renders reliably; dữ liệu fetched sau khi mount có thể là missed — by các crawler đó render muộn, và hoàn toàn by ones đó không.
4. Hai audiences của bots. Google renders (eventually). Bing và social scrapers largely không. Design cho tệ hơn một nếu Bing traffic hoặc share previews quan trọng — đó có nghĩ là HTML, không CSR.
5. cây quyết định cho new Vue project.
Pure app behind login? CSR là fine. nội dung-ổn định marketing/tài liệu/blog? vite-ssg
hoặc VitePress. Dynamic, theo-yêu cầu, SEO-cốt yếu nội dung? Nuxt. không bao giờ reach cho
dynamic kết xuất hoặc prerender-spa-plugin — cả hai là dead ends trong 2026.
6. máy chủ và client phải agree. Hydration mismatch không phải chỉ perf nit — nó nội dung delta giữa Điều gì Google được lập chỉ mục và Điều gì người dùng nhận. giữ hai renders giống hệt.
Vue SEO — bảng tra nhanh
Router chế độ
| Chế độ | URL | SEO |
|---|---|---|
createWebHistory() | example.com/about | Dùng này (cần máy chủ fallback) |
createWebHashHistory() | example.com/#/about | ”Bad impact in SEO” (bản dịch) «Bad impact trong SEO» — tránh |
Head / meta libraries
| Library | Status |
|---|---|
vue-meta | Legacy (Nuxt 2 era) |
@vueuse/head | Sunset |
@unhead/vue (useSeoMeta()) | hiện tại tiêu chuẩn |
Kết xuất strategies
| Strategy | Khi | SEO risk |
|---|---|---|
| CSR (default) | App các trang, behind login | Highest |
vite-ssg prerender | nội dung-ổn định SPAs (marketing/tài liệu/blog) | Thấp |
| SSR (Nuxt) | Dynamic, theo-yêu cầu các trang | Thấp |
| SSG (Nuxt / VitePress) | nội dung known tại xây dựng time | Lowest |
prerender-spa-plugin | — | Legacy/unmaintained — không |
| Dynamic kết xuất | — | Deprecated by Google — không |
Fast facts
- Google renders Vue (evergreen Chromium WRS) — nhưng delayed, và async dữ liệu có thể là missed.
- Bing + social scrapers thường không chạy JS — bare CSR = rỗng share previews.
- Canonicals: HTML đầu tiên; JS canonicals hoạt động nhưng là riskier.
- Vue 2 là EOL (Dec 2023) — Vue 3 chỉ.
Cách nên Vue route render?
Choose a Vue SEO rendering path
Vue SEO mistakes
- Shipping tìm kiếm landing các trang as Vite SPA shell. sử dụng Nuxt SSR/SSG hoặc prerendering so essential nội dung là trong nguồn HTML.
- sử dụng hash chế độ cho công khai nội dung routes. Fragments không tạo thông thường máy chủ các URL. sử dụng history routing với host fallback configured correctly.
- Setting head tags chỉ sau khi client fetches. Generate metadata từ máy chủ/xây dựng dữ liệu qua head integration.
- sử dụng dynamic kết xuất as dài-term khắc phục. Maintain một consistent người dùng/crawler kết xuất path thay vì bot-cụ thể output.
- Kiểm thử chỉ với Google. Thô HTML matters để khác các công cụ tìm kiếm, social scrapers, và tools đó không execute application fully.
Thô HTML contains chỉ Vue mount element
có khả năng nguyên nhân: route là CSR-chỉ. khắc phục: move nó để Nuxt SSR/SSG hoặc prerender finite route đặt. xác nhận: curl trả về chính nội dung và links.
Trực tiếp route các yêu cầu trả về 404
có khả năng nguyên nhân: Vue Router history chế độ lacks máy chủ fallback hoặc deployment omitted generated routes. khắc phục: configure host rewrites cho SPA-chỉ routes hoặc deploy thực tế SSR/static route output. xác nhận: refresh và trực tiếp các yêu cầu trả về dự kiến status và trang.
Các tiêu đề cập nhật trong trình duyệt nhưng không trong nguồn
có khả năng nguyên nhân: metadata phụ thuộc vào client lifecycle hoặc asynchronous trình duyệt fetch. khắc phục: resolve dữ liệu during SSR/SSG và render head tags với @unhead/vue hoặc Nuxt head APIs. xác nhận: thô và được kết xuất các tiêu đề, canonicals, và robots directives agree.
Hydration replaces đúng máy chủ nội dung
có khả năng nguyên nhân: máy chủ/client dữ liệu hoặc environment branches disagree. khắc phục: làm ban đầu dữ liệu deterministic và xóa trình duyệt-chỉ conditions từ essential markup. xác nhận: hydration completes không có mismatch warnings hoặc thay đổi indexable nội dung.
So sánh Vue thô và được kết xuất output
curl -fsSL https://example.com/page/ > raw.html
grep -Eio '<title>[^<]+|<h1[^>]*>[^<]+|<link[^>]+rel="canonical"[^>]*' raw.htmlChạy điều này trong DevTools Console sau khi hydration:
({title: document.title, h1: document.querySelector('h1')?.textContent.trim(), canonical: document.querySelector('link[rel="canonical"]')?.href, links: [...document.querySelectorAll('a[href]')].length});nếu quan trọng các giá trị exist chỉ trong Console kết quả, SSR/prerendering là incomplete.
tìm hash-based nội dung links
[...document.querySelectorAll('a[href^="#"]')].map(a => ({text: a.textContent.trim(), href: a.getAttribute('href')}));Review list manually: trong-trang navigation là fine; sử dụng fragments as tách biệt nội dung routes là vấn đề.
Tools cho Vue SEO
- URL Inspection (Google Search Console) — nguồn của truth. Chạy trực tiếp kiểm thử và kiểm tra được kết xuất HTML, screenshot, trang các tài nguyên (là bất kỳ JS/CSS blocked?), và console messages. Đây là Cách bạn xác nhận của bạn Vue nội dung, meta, và JSON-LD thực ra được kết xuất.
- Rich Kết quả Kiểm thử — fast được kết xuất-HTML + structured-dữ liệu kiểm tra cho single URL không có verifying trang web.
- Chrome DevTools — diff View Nguồn (thô HTML, Điều gì non-kết xuất bot sees) so với Elements panel ( hydrated DOM). Console surfaces hydration mismatch warnings.
- Vue Devtools — inspect component state và router chế độ trong khi bạn debug Điều gì client-chỉ so với. máy chủ-được kết xuất.
vite-ssg— xây dựng-time prerendering cho nội dung-ổn định Vue 3 SPAs (đổivite build→vite-ssg build).- JavaScript-kết xuất các crawler — Ahrefs trang web Audit và Screaming Frog (JS-kết xuất chế độ) execute JS so Bạn có thể diff thô so với. được kết xuất trên toàn bộ Vue trang web.
- Lighthouse / PageSpeed Insights — catch CSR bundle hit on LCP và Core Web Vitals levers (code splitting, lazy routes, image priority).
Tự kiểm tra: Vue SEO
Five nhanh các câu hỏi on đang làm Vue apps crawlable và indexable. Pick câu trả lời cho mỗi, sau đó kiểm tra.
các tài nguyên worth của bạn time
My writing
- JavaScript SEO: Definitive Hướng dẫn — my đầy đủ hướng dẫn để kết xuất, DOM parity, và framework-cấp độ decisions; bao gồm Vue Router history-so với-hash hướng dẫn và my JS-canonical kiểm thử.
- Người mới bắt đầu Hướng dẫn để kỹ thuật SEO — nơi kết xuất và JavaScript SEO fit trong bigger picture.
My speaking
- Cách Tìm kiếm Hoạt động (SlideShare) — my walkthrough of crawling, kết xuất, lập chỉ mục, và xếp hạng. (My standing disclaimer áp dụng: “This is my understanding of systems… not going to be 100% complete or accurate.” (bản dịch) «Này là my understanding of các hệ thống… không going để là 100% hoàn tất hoặc chính xác.»)
từ khoảng ngành
- máy chủ-Side Kết xuất (SSR) | Vue.js — chính thức hướng dẫn: SSR SEO benefit, async caveat, và Khi để pick SSG thay vì.
- khác History modes | Vue Router — Vì sao hash chế độ hurts SEO và Cách configure history chế độ.
- useSeoMeta() · Unhead — hiện tại
@unhead/vuemeta API. - antfu-collective/vite-ssg | GitHub — xây dựng-time prerendering cho Vue 3 SPAs.
- trang web Config | VitePress — SEO cho Vue-powered tài liệu các trang.
- Cách Nuxt.js solves SEO các vấn đề trong Vue.js | LogRocket — case cho Nuxt as SSR/SSG path.
- Google không lâu hơn khuyến nghị sử dụng dynamic kết xuất | công cụ tìm kiếm Land — coverage của dynamic-kết xuất deprecation.
- Vue.js và SEO: Cách Optimize Reactive Websites | Smashing Magazine — widely-cited 2019 piece; hữu ích cho async-timing các thử nghiệm, nhưng dated on tooling (pre-evergreen Chromium).
Videos
- kỹ thuật SEO tips cho Vue.js by Martin Splitt (Google Search Central, 2019) — Google own Vue-cụ thể JavaScript SEO episode: đang làm các tiêu đề, các mô tả, và các URL discoverable Khi bạn xây dựng với Vue. Watch
- Google Search Central (YouTube) — Martin Splitt rộng hơn JavaScript SEO series covers kết xuất, render queue, và thất bại modes đó apply để bất kỳ Vue app. Channel
Nhật ký thay đổi
Đã cập nhật 8 thg 8, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.
Đã cập nhật 18 thg 7, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.