Hướng dẫn về React SEO
React renders client-side theo mặc định, so các crawler see an empty shell until JavaScript chạy. Ở đây cách Google thực ra xử lý React apps, mà kết xuất strategy để pick, và cách sửa routing, metadata, và đó render-timeout duplicate-nội dung trap.
Ngôn ngữ
React không phải bad cho SEO — nhưng client-side kết xuất theo mặc định là. Out of đó box (CRA, Vite + React), đó máy chủ ships an empty shell và đó trình duyệt xây dựng đó trang, so các crawler see không có gì until JavaScript chạy. Google có thể render React qua của nó Web Kết xuất Service, nhưng kết xuất là queued, delayed, và có thể time out — Gary Illyes có shown render timeouts leaving boilerplate-chỉ các trang đó nhận marked as duplicates. AI-crawler kết xuất contracts vary by provider, so CSR-chỉ nội dung adds một coverage risk. Đó cách sửa là kết xuất strategy: SSR hoặc SSG (hầu hết easily Tiếp theo.js hoặc Remix) diễn đạt nội dung trong đó ban đầu HTML, hydrated với hydrateRoot (không createRoot) so máy chủ và client output match chính xác. Thì dùng History API routing, real <a href> links, correct các mã trạng thái, và version-appropriate metadata: React 19 hoists <title>/<meta>/<link> natively, nếu không react-helmet-async (không bao giờ đó unmaintained original react-helmet).
Tóm tắt — React không phải bad Đối với SEO — nhưng way phần lớn React apps là được xây dựng là. theo mặc định, React xây dựng trang trong khách truy cập trình duyệt, so Khi công cụ tìm kiếm đầu tiên fetches của bạn URL nó nhận nearly trang rỗng. Google có thể thường fill trong blanks by đang chạy của bạn JavaScript, nhưng nó chậm hơn và riskier hơn chỉ handing nó finished HTML. khắc phục là để render của bạn các trang on máy chủ hoặc tại xây dựng time — thường với framework như tiếp theo.js.
Vì sao React là khác
phần lớn websites — WordPress blog, chẳng hạn — gửi công cụ tìm kiếm hoàn tất trang:
máy chủ xây dựng HTML và ships nó, headline và all. tiêu chuẩn React app làm
opposite. máy chủ gửi gần như-rỗng shell (basically rỗng <div>),
và sau đó JavaScript chạy trong trình duyệt để xây dựng thực trang.
đó great cho slick, app-như experiences. nó vấn đề Đối với SEO, vì đầu tiên điều crawler downloads là đó rỗng shell. của bạn nội dung không phải ở đó tuy vậy — nó chỉ hiển thị lên sau khi JavaScript chạy.
có thể’t Google chỉ chạy JavaScript?
Có — Google chạy thực, lên-để-date version của Chrome behind scenes và có thể execute của bạn JavaScript để see finished trang. So React nội dung có thể nhận được lập chỉ mục. Evidence for this claim Googlebot uses an evergreen Chromium rendering engine and can execute JavaScript. Scope: Google Search; successful execution still depends on accessible resources and application behavior. Confidence: high · Verified: Google: JavaScript SEO basics
nhưng có catches:
- nó delayed. Google làm kết xuất sau đó, trong tách biệt step đó queued lên. So của bạn nội dung có thể take lâu hơn để hiển thị lên trong tìm kiếm.
- nó có thể fail. nếu của bạn trang là chậm để load của nó nội dung, Google renderer có thể cho lên trước khi nội dung xuất hiện — và chỉ mục blank-ish trang.
- khác các crawler vary. Bing xử lý JavaScript ít hơn reliably, và AI providers không publish một shared kết xuất contract. bất kỳ crawler đó fetches chỉ ban đầu HTML sẽ see default React app as rỗng.
đơn giản khắc phục
Nhận của bạn nội dung vào HTML trước khi nó reaches trình duyệt. Hai ways:
- máy chủ-side kết xuất (SSR) — máy chủ xây dựng đầy đủ trang cho mỗi yêu cầu.
- Static trang web generation (SSG) — các trang là được xây dựng vào finished HTML ahead của time.
easiest path để either là tiếp theo.js, framework được xây dựng on React đó làm điều này cho bạn. (Remix là một good option.) với SSR hoặc SSG, của bạn React trang web hands các crawler hoàn tất trang — và nó as tìm kiếm-friendly as bất kỳ thông thường trang web.
một vài khác điều để nhận right
- sử dụng thông thường-looking các URL (
/products), không hash các URL (/#/products) — Google có thể’t reliably chỉ mục hash ones. - Làm của bạn links thực links (
<a href>), không clickable<div>s. - Cho mỗi trang của nó own tiêu đề và mô tả đó cập nhật Khi trang thay đổi.
Muốn deeper version — Cách Google renderer thực ra hoạt động, render-timeout trap đó tạo duplicate các trang, kết xuất-strategy so sánh, và Cách kiểm thử Điều gì Google sees? Chuyển để Nâng cao tab.
Tóm tắt — React SEO vấn đề không phải React — nó client-side kết xuất theo mặc định. CRA và Vite + React ship rỗng shell và xây dựng DOM trong trình duyệt, so thô HTML crawler fetches có Không có nội dung. Google có thể render nó qua Web Kết xuất Service (evergreen Chromium), nhưng kết xuất là queued riêng, có thể là delayed, và có thể time out — Gary Illyes có được ghi lại render timeouts leaving boilerplate-chỉ các trang đó sau đó nhận flagged as duplicates. Bing renders JS ít hơn reliably; AI-crawler kết xuất varies by provider. khắc phục là kết xuất strategy: SSR hoặc SSG (phần lớn easily tiếp theo.js hoặc Remix) diễn đạt nội dung trong ban đầu HTML — và nếu bạn’re hydrating máy chủ-được kết xuất markup, sử dụng
hydrateRoot(khôngcreateRoot) và treat bất kỳ máy chủ/client mismatch as bug, không warning để suppress. sau đó sử dụng History API routing (không hash các URL) và thực<a href>links. cho<head>metadata: React 19 hoists<title>/<meta>/<link>natively; on React 18 hoặc cho Nâng cao cần, sử dụng react-helmet-async (không bao giờ unmaintained gốc react-helmet). đặt đúng HTTP các mã trạng thái. có không xếp hạng bonus cho SSR — nó chỉ làm nội dung reliably indexable. cho chung kết xuất mechanics, see JavaScript SEO và headless CMS topics.
Điều gì thực ra làm React hard Đối với SEO
React là component-based JavaScript library, và out của box — Tạo React App,
Vite + React — nó chạy client-side. máy chủ trả về near-rỗng document
(famously chỉ <div id="root"></div>) plus bundle của JavaScript, và trình duyệt
executes đó JavaScript để construct DOM. Contrast đó với máy chủ-được kết xuất
trang (WordPress, Rails app), nơi đầy đủ HTML — nội dung, headings, links —
arrives trong rất đầu tiên phản hồi.
So đó câu hỏi đó decides mọi thứ là: điều gì là trong đó thô HTML trước bất kỳ JavaScript chạy? Cho một default React app, đó câu trả lời là “almost nothing.” (bản dịch) «gần như không có gì.» Right-nhấp → View Nguồn on một CRA app và bạn’ll see đó shell, không đó nội dung. đó là chính xác điều gì một crawler nhận on của nó đầu tiên fetch.
để là precise về nơi responsibility thực ra sits: React library không phải
CSR-chỉ. React DOM ships client kết xuất (createRoot), máy chủ kết xuất (streaming
và static APIs), và hydration APIs — library hỗ trợ tất cả nó. rỗng-shell
vấn đề là thuộc tính của default toolchain (Tạo React App, Vite + React với
không máy chủ), mà wires lên chỉ client APIs và không có gì đó renders để HTML on
máy chủ. Đổi toolchain — tiếp theo.js, Remix, hoặc React own máy chủ-kết xuất APIs — và
giống nhau library ships đầy đủ HTML on đầu tiên phản hồi.
Đây là React-cụ thể application của rộng hơn JavaScript SEO vấn đề — go ở đó cho chung thất bại modes (parity, interaction, state, timing). Ở đây I’ll focus on Điều gì cụ thể để React và Cách khắc phục nó.
Cách Google thực ra xử lý React app
Google xử lý JavaScript trong three phases: crawl → render → chỉ mục. Googlebot fetches URL, được kết xuất DOM là được xây dựng sau đó by Web Kết xuất Service (WRS) — evergreen version của Chromium, giống nhau engine as Chrome — và sau đó được kết xuất output nhận được lập chỉ mục và của nó links extracted. Evidence for this claim Google processes JavaScript pages through crawling, rendering, and indexing using its Web Rendering Service. Scope: Google Search rendering behavior. Confidence: high · Verified: Google: JavaScript SEO basics
Đó quan trọng nuance là khi kết xuất happens. Kết xuất là tài nguyên-intensive, so đây là queued riêng từ đó ban đầu crawl. Martin Splitt described đó flow plainly: “we do an HTTP request, and we get something back … some barebone HTML and all it does is load the JavaScript and run the JavaScript. Then, this HTML … goes into rendering. Rendering runs JavaScript — boom!, a lot of content happens that wasn’t there before.” (bản dịch) «we làm an HTTP yêu cầu, và we nhận điều gì đó lại … some barebone HTML và all điều này làm là load đó JavaScript và chạy đó JavaScript. Thì, này HTML … goes vào kết xuất. Kết xuất chạy JavaScript — boom!, một lot of nội dung happens đó đã không ở đó trước.» Cho một CSR React trang, đó “boom” là của bạn entire trang — none of điều này tồn tại until đó render step chạy.
MỘT caveat worth carrying: không over-chỉ mục on đó old “two waves of indexing” (bản dịch) «hai waves of lập chỉ mục» model. Splitt himself walked điều này lại, calling đó wave “an oversimplification.” (bản dịch) «an oversimplification.» Đó practical takeaway không “there’s a formal Wave 2 with defined timing” (bản dịch) «có một formal Wave 2 với được định nghĩa timing» — đây là đó kết xuất là một distinct, deferrable, fallible step, và CSR diễn đạt 100% of nội dung của bạn on đó sai side of điều này.
Hai nhiều hơn facts về renderer đó bite React apps cụ thể:
- nó stateless. Googlebot không retain
localStorage,sessionStorage, hoặc cookies giữa trang loads. bất kỳ nội dung hoặc routing đó phụ thuộc vào client-side state là invisible để crawler. - nó có thể cho lên. renderer enforces timeout. nếu của bạn main nội dung loads slowly — lớn bundles, waterfalls của API calls — kết xuất có thể finish trước khi của bạn nội dung arrives, và Google indexes incomplete trang.
render-timeout trap (và Vì sao nó tạo duplicates)
Này chế độ lỗi là rarely explained well, và đây là đó hầu hết damaging một cho React apps. Gary Illyes described điều này trực tiếp: “I have a bunch of emails in my inbox where the issue is that the centerpiece took forever to load, so rendering timed out … and we were left with a bunch of pages that only had the boilerplate. With only the boilerplate, those pages are dups.” (bản dịch) «I có một bunch of emails trong my inbox nơi đó vấn đề là đó centerpiece took forever để load, so kết xuất timed out … và we đã là left với một bunch of các trang đó chỉ đã có đó boilerplate. Với chỉ đó boilerplate, những các trang là dups.»
Walk qua Điều gì đó có nghĩ là cho CSR React app. của bạn header, nav, và footer là boilerplate đó loads fast. của bạn thực tế nội dung trang — part đó làm mỗi URL unique — là fetched và được kết xuất by JavaScript, và nó loads slowly. Kết xuất times out. Google là left với header + nav + footer on mỗi URL. Hiện tại mỗi trang looks giống hệt, và Google marks them as duplicates của mỗi khác trong Search Console.
Illyes own cách sửa là đó actionable bit: “Try to restructure the js calls such that the content (including marginal boilerplate) loads first and see if that helps.” (bản dịch) «Try để restructure đó js calls such đó nội dung (including marginal boilerplate) loads đầu tiên và see nếu đó helps.» Nhưng đó hơn durable câu trả lời là để không phụ thuộc on đó render step cho của bạn main nội dung tại all — mà có nghĩa là SSR hoặc SSG.
Kết xuất strategies cho React
Đây là single phần lớn impactful decision. options, khoảng worst để best Đối với SEO:
- CSR (default React). máy chủ gửi shell; trình duyệt xây dựng mọi thứ. nội dung là delayed by render queue và exposed để timeout. Worst Đối với SEO. Fine cho authenticated dashboards bạn không muốn được lập chỉ mục anyway.
- Pre-kết xuất. Xây dựng-time kết xuất không có đầy đủ SSR framework — tools như
react-snaphoặc prerender service crawl của bạn app và save static HTML. Nhẹ hơn-weight; hoạt động cho simpler, mostly-static các trang. - SSG (Static trang web Generation). HTML được xây dựng sau khi tại deploy time và phân phối as static files. Fastest, nội dung luôn present trong thô HTML. Limited cho highly dynamic hoặc theo-người dùng nội dung; lớn các trang nhận chậm xây dựng.
- SSR (máy chủ-Side Kết xuất). máy chủ executes React theo yêu cầu và gửi đầy đủ HTML. nội dung immediately khả dụng để các crawler; luôn fresh. Costs Node.js máy chủ và slightly cao hơn TTFB.
- Hybrid / ISR (Incremental Static Regeneration). tiếp theo.js feature đó regenerates static các trang trong background — static speed với periodic freshness.
| Strategy | nội dung trong ban đầu HTML? | SEO risk | Best cho |
|---|---|---|---|
| CSR (thô React) | Không | Highest | Logged-trong dashboards, không-được lập chỉ mục apps |
| Pre-kết xuất | Có (xây dựng time) | Thấp | Nhỏ, mostly-static các trang |
| SSG | Có (xây dựng time) | Lowest | Blogs, tài liệu, marketing |
| SSR | Có (theo yêu cầu) | Thấp | Fresh, dynamic nội dung |
| ISR / hybrid | Có | Thấp | nội dung đó thay đổi hourly/daily |
Và một strategy để skip on new xây dựng: dynamic kết xuất — detecting đó crawler người dùng-agent và serving điều này một pre-được kết xuất version trong khi người dùng nhận CSR. Google hiện tại calls điều này “a workaround and not a long-term solution” (bản dịch) «một workaround và không một dài-term giải pháp» đó “creates additional complexities and resource requirements,” (bản dịch) «tạo additional complexities và tài nguyên requirements,» và khuyến nghị máy chủ-side kết xuất, static kết xuất, hoặc hydration thay vì. (Bing được khuyến nghị dynamic kết xuất lại trong 2018, nhưng đó hướng dẫn là dated — since 2019 Bingbot renders qua Microsoft Edge / Chromium, và SSR/SSG là đó right call ở đó cũng.)
có một myth worth killing ở đây: SSR không phải một xếp hạng boost. As John Mueller put điều này, “there are no SEO ranking bonuses for implementing it one way or another” (bản dịch) «có không SEO xếp hạng bonuses cho implementing điều này một way hoặc một sản phẩm khác» — đó khác nhau kết xuất các phương thức là “just different ways of making the content indexable.” (bản dịch) «chỉ khác nhau ways of đang làm đó nội dung indexable.» SSR giá trị là reliable indexability (và thường tốt hơn Core Web Vitals từ một nhanh hơn Đầu tiên Contentful Paint), không một magic xếp hạng lever.
Hydration phải match chính xác — đó bug boundary, không SEO technique
SSR và SSG cả hai hand trình duyệt HTML đó đã có của bạn nội dung trong nó. React sau đó có để attach để đó markup on client, và đó khác API từ đơn giản client render:
createRootrenders React vào DOM node từ scratch — không existing markup dự kiến. sử dụng nó cho CSR-chỉ apps.hydrateRootattaches React để HTML đóreact-dom/serverđã generated, và expects client đầu tiên render để produce output giống hệt để Điều gì máy chủ được gửi. nếu bạn’re SSR/SSG, bạn muốnhydrateRoot, khôngcreateRoot— callingcreateRooton máy chủ-được kết xuất markup có nghĩ là React discards nó và re-renders từ scratch, throwing away chính xác SEO benefit bạn thiết lập SSR/SSG để nhận.
Mismatches giữa máy chủ và client output là một real risk trong React apps đang làm SEO
các cách sửa — một Date.now() trong một tiêu đề, một locale-phụ thuộc format, an
if (typeof window !== 'undefined') branch. React own tài liệu là blunt về điều gì
happens thì: điều này warns về mismatches trong development, nhưng “there are no guarantees
that attribute differences will be patched up in case of mismatches.” (bản dịch) «có không bảo đảm đó thuộc tính differences sẽ là patched lên trong case of mismatches.» Đó hướng dẫn là
để treat mismatches as bugs và cách sửa them — không để suppress đó warning và assume
nội dung parity. Cho SEO cụ thể: không assume của bạn được kết xuất nội dung và metadata
match điều gì đó máy chủ đã gửi chỉ vì đó trang looks right trong đó trình duyệt. Diff đó
máy chủ HTML so với đó post-hydration DOM trực tiếp (đó View Nguồn so với. Inspect
Element kiểm tra từ đó kiểm thử section dưới là đó fast version of này) thay vì
trusting một sạch console.
React Router và URL structure
React Router xử lý navigation trong trình duyệt không có máy chủ round-trips, mà là fine Đối với SEO nếu configured correctly:
- sử dụng History API, không hash routing.
BrowserRouterdùngpushStatevà produces sạch, crawlable các URL (/products).HashRouterproduces/#/products, và Google không thể reliably resolve hash-based các URL — old AJAX-crawling scheme đó đã làm them hoạt động là deprecated. sử dụng History API. - máy chủ phải xử lý những điều đó các URL cũng. với History API routing, mỗi “trang” cần
thực URL máy chủ có thể respond để — cốt yếu cho SSR, và necessary so trực tiếp hit
hoặc refresh on
/productskhông 404. <Link>renders thực anchor. React Router<Link>component outputs<a href>, mà là crawlable. Navigation được xây dựng ononClickhandlers không có anchor là không crawlable — Google chỉ follows thực<a href>links.
Managing metadata: react-helmet, react-helmet-async, và React 19’s native tags
qua React 18, React không bao giờ đã cập nhật document <head> on route thay đổi natively —
mỗi route <title>, mô tả meta, canonical, và Open Graph / Twitter tags có
để là đặt by library. React 19 changed đó: components có thể render <title>,
<meta>, và <link> tags trực tiếp, và React hoists them để <head> on của nó own —
hoạt động với client-chỉ apps, streaming SSR, và máy chủ Components alike. React 19,2 là
hiện tại ổn định phát hành as của mid-2026, so điều này hiện tại áp dụng để bất kỳ app on hiện tại
React version.
đó có nghĩ là right câu trả lời phụ thuộc vào của bạn React version và Điều gì bạn thực ra cần:
- React 19, standalone app, chỉ basic tags. Render
<title>/<meta>/<link>trong của bạn components trực tiếp — không library needed. - React 19, nhưng bạn cần
htmlAttributes/bodyAttributes, SSRcontextserialization,onChangeClientState,prioritizeSeoTags, hoặctitleTemplate. Native hoisting không cover những điều này — sử dụngreact-helmet-async. Của nó own tài liệu call điều này out trực tiếp: không có những điều đó cụ thể cần, bạn có thể không cần package tại all on React 19. - React 18 hoặc trước đó, standalone app. Native hoisting không exist tuy vậy — sử dụng
react-helmet-async. nó actively maintained (major version 3, và nó detects của bạn React version tại runtime) và hỗ trợ SSR. - ** gốc
react-helmet.** không sử dụng nó, on bất kỳ React version. nó unmaintained — không phát hành since 2020 — và có known bugs dưới React 18’s concurrent kết xuất. - tiếp theo.js apps. sử dụng tiếp theo own Metadata API (
metadataexport /generateMetadatatrong App Router) regardless của React version — không bolt on Helmet, và không rely on native React tag hoisting either. framework owns document trong tiếp theo.js app.
Một reliability rule carries over từ JavaScript SEO generally, và áp dụng không quan trọng mà của trên bạn sử dụng: HTML-cấp độ metadata beats JS-injected metadata. canonical tag injected by client-side JavaScript là far ít hơn reliable hơn một present trong máy chủ-được kết xuất HTML — mà là một argument cho SSR/SSG.
AI các crawler làm điều này urgent
2026 wrinkle: kết xuất behavior cho GPTBot (OpenAI), ClaudeBot (Anthropic), PerplexityBot, và khác agents là provider- và version-cụ thể. CSR React app ships mỗi crawler giống nhau rỗng shell đầu tiên Googlebot fetch sees, và hiện tại provider tài liệu không establish một shared render step đó sẽ fill nó trong. As generative engines become bigger phát hiện surface, SSR/SSG dừng là Google-chỉ concern: thô HTML maximizes coverage không có assuming universal crawler limitation. ( headless CMS topic covers điều này AI-crawler reality trong nhiều hơn depth.)
Kiểm thử Điều gì Google thực ra sees
không trust của bạn trình duyệt — của bạn DevTools Inspector hiển thị được kết xuất DOM (post-JavaScript), mà là chính xác Điều gì crawler-không có-JS làm không see. sử dụng right tools:
- View Nguồn so với. Inspect Element. View Nguồn là đó thô HTML (điều gì các crawler nhận trước JS). Inspect Element là đó được kết xuất DOM. Nếu nội dung là trong Inspect nhưng bị thiếu từ View Nguồn, đây là JavaScript-phụ thuộc.
- URL Inspection Tool (Search Console) — đó hầu hết có thẩm quyền kiểm tra. Chạy một trực tiếp kiểm thử và xem đó được kết xuất HTML, đó screenshot, và đó trang các tài nguyên / console messages để see điều gì Google thực ra được kết xuất và điều gì failed để load.
- Rich Kết quả Kiểm thử — một nhanh được kết xuất-HTML kiểm tra không có verifying đó site.
- Disable JavaScript trong DevTools và reload — một fast simulation of một crawler đó không execute JS (và một decent proxy cho điều gì AI các crawler see).
- Search Console Coverage báo cáo — “Discovered, currently not indexed” (bản dịch) «Discovered, hiện tại không được lập chỉ mục» có thể tín hiệu một render queue backlog; clusters of duplicate các trang có thể tín hiệu đó render-timeout boilerplate trap.
- JS-kết xuất các crawler — Ahrefs Site Audit và Screaming Frog (JS-kết xuất chế độ) render các trang tại quy mô so bạn có thể diff thô so với. được kết xuất trên đó toàn bộ site.
tiếp theo.js và Remix ( practical câu trả lời)
nếu SEO matters và bạn’re on thô CSR React, migrating để framework đó renders on máy chủ là thường right move. tiếp theo.js là purpose-được xây dựng cho điều này — SSR và SSG out của box, ISR, App Router, được xây dựng-trong Metadata API, tự động code splitting, và image optimization. Remix là web-các tiêu chuẩn alternative, được xây dựng on fetch/yêu cầu/phản hồi với SSR theo mặc định và mạnh progressive-enhancement story. tiếp theo.js nhận của nó own deep dive — I’m giữ nó brief ở đây on purpose. point cho React SEO là hẹp hơn: framework tồn tại để move của bạn nội dung out của trình duyệt-chỉ render step và vào ban đầu HTML.
React là good Đối với SEO Khi bạn treat kết xuất as architecture decision thay vì afterthought. Pick SSR hoặc SSG cho bất cứ điều gì đó cần để xếp hạng, giữ của bạn links và routing honest, manage metadata theo route, và let Google own tools — không của bạn trình duyệt — tell bạn Điều gì thực ra được kết xuất.
AI summary
condensed take on Nâng cao version:
- React không bad cho SEO — CSR theo mặc định là. React đó library hỗ trợ client,
máy chủ, static, và streaming kết xuất; đây là đó default CRA/Vite toolchain (không
máy chủ) đó ships an empty
<div id="root">shell và xây dựng đó DOM trong đó trình duyệt, so đó thô HTML một crawler fetches có không có nội dung. - Google có thể render React qua đó Web Kết xuất Service (evergreen Chromium), nhưng kết xuất là queued riêng, có thể là delayed, và là stateless (không cookies/localStorage/sessionStorage giữa loads).
- Đó render-timeout trap: nếu main nội dung loads slowly, kết xuất times out và Google indexes một boilerplate-chỉ trang. Trên nhiều URLs những look giống hệt và nhận flagged as duplicates (Gary Illyes được ghi lại chế độ lỗi). Cách sửa: load nội dung đầu tiên — hoặc tốt hơn, không phụ thuộc on đó render step (SSR/SSG).
- Kết xuất strategies, best→worst cho SEO: SSG (lowest risk) ≈ SSR ≈ pre-render > ISR/hybrid > CSR (highest risk). Dynamic kết xuất là deprecated — Google khuyến nghị SSR, static kết xuất, hoặc hydration.
- Không xếp hạng bonus cho SSR — Mueller: “no SEO ranking bonuses for implementing it one way or another.” (bản dịch) «không SEO xếp hạng bonuses cho implementing điều này một way hoặc một sản phẩm khác.» Điều này chỉ làm nội dung reliably indexable.
- Hydration là một bug boundary, không một technique: SSR/SSG apps hydrate với
hydrateRoot(khôngcreateRoot), mà expects đó client đầu tiên render để match đó máy chủ chính xác. React warns on mismatches trong dev nhưng không bảo đảm patching them — treat mismatches as bugs và verify máy chủ so với. post-hydration DOM trực tiếp. - React Router: dùng History API (
BrowserRouter), không hash routing; đó máy chủ phải xử lý những URLs;<Link>renders crawlable<a href>—onClick-chỉ nav không. - Metadata: React 19 natively hoists
<title>/<meta>/<link>để<head>cho standalone apps needing chỉ đó basics. On React 18, hoặc cho advanced cần (SSR context,titleTemplate), dùng react-helmet-async — không bao giờ đó original react-helmet, unmaintained since 2020. Trong Tiếp theo.js, dùng đó Metadata API regardless of React version. HTML-cấp độ beats JS-injected. - AI-crawler kết xuất là provider-cụ thể — CSR React phụ thuộc vào client execution đó mỗi crawler có thể hoặc có thể không hỗ trợ. SSR/SSG diễn đạt nội dung trong đó ban đầu HTML và maximizes coverage.
- Kiểm thử với View Nguồn so với. Inspect, URL Inspection (được kết xuất HTML + screenshot + console), Rich Kết quả Kiểm thử, JS-disabled reload, và một JS-kết xuất crawler.
- Tiếp theo.js / Remix là đó practical cách sửa — they move nội dung vào đó ban đầu HTML.
Tài liệu chính thức
Chính-nguồn tài liệu từ các công cụ tìm kiếm.
- Understand JavaScript SEO Basics — crawl → render → chỉ mục pipeline, SPAs, History API, canonical các URL với JS, và có ý nghĩa HTTP các mã trạng thái.
- khắc phục Tìm kiếm-Related JavaScript Các vấn đề — soft-404 xử lý trong SPAs, stateless renderer (không cookies/localStorage), và kiểm thử với URL Inspection.
- Dynamic Kết xuất (deprecated workaround) — Vì sao Google deprecated nó và Điều gì để sử dụng thay vì (SSR, static kết xuất, hydration).
- Introducing new JavaScript SEO video series — Martin Splitt series, covering React, Angular, và Vue cụ thể.
- Trong-Depth Hướng dẫn để Cách Google Search Hoạt động — nơi kết xuất sits trong crawl → chỉ mục → phục vụ.
Bing / Microsoft
- new evergreen Bingbot (Microsoft Edge) — Bingbot kết xuất JavaScript qua giống nhau Chromium nền tảng as Googlebot.
- bingbot Series: JavaScript, Dynamic Kết xuất, và Cloaking — Bing older (2018) take; hữu ích cho lịch sử dynamic-kết xuất khuyến nghị.
kỹ thuật reference
- React v19 (phát hành notes) — native hỗ trợ cho kết xuất
<title>,<meta>, và<link>tags trong components, hoisted tự động để<head>. - createRoot / hydrateRoot (React tài liệu) — client-render so với. hydration API split, và caveat đó mismatches không phải guaranteed để là patched.
- react-helmet-async (npm) — maintained fork cho managing
<head>trong standalone React apps, React 18 hoặc Nâng cao React 19 cần.
Quotes từ nguồn
On—record statements từ Google Tìm kiếm team. mỗi tìm kiếm-engine deep link jumps để quoted passage on nguồn trang; nhân viên quotes dưới là linked để coverage đó reproduced them.
Google tài liệu — SPAs và dynamic kết xuất
- “Single-page applications (SPA) are websites that load an HTML document once and fetch any additional content using JavaScript APIs.” (bản dịch) «Single-trang applications (SPA) là websites đó load an HTML document khi và fetch bất kỳ additional nội dung dùng JavaScript APIs.» — Google Search Central tài liệu. Nhảy đến trích dẫn
- “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.» — Google Search Central tài liệu. Nhảy đến trích dẫn
Martin Splitt, Google — Cách JavaScript các trang là được lập chỉ mục
- “What we do is we do an HTTP request, and we get something back, right — some HTML, maybe it’s a barebone HTML and all it does is load the JavaScript and run the JavaScript. Then, this HTML that we got from the original HTTP GET request from the crawl, goes into rendering. Rendering runs JavaScript — boom!, a lot of content happens that wasn’t there before.” (bản dịch) «Điều gì we làm là we làm an HTTP yêu cầu, và we nhận điều gì đó lại, right — some HTML, maybe đây là một barebone HTML và all điều này làm là load đó JavaScript và chạy đó JavaScript. Thì, này HTML đó we đã nhận từ đó original HTTP GET yêu cầu từ đó crawl, goes vào kết xuất. Kết xuất chạy JavaScript — boom!, một lot of nội dung happens đó đã không ở đó trước.» Đọc bài đưa tin (Search Engine Journal)
- On đó hai-waves model đang imprecise: “there’s no such thing as the second wave of crawling-ish. The wave is an oversimplification.” (bản dịch) «có không such điều as đó second wave of crawling-ish. Đó wave là an oversimplification.» Đọc bài đưa tin (Công cụ tìm kiếm Roundtable)
Gary Illyes, Google — render-timeout duplicate-nội dung trap
- “I have a bunch of emails in my inbox where the issue is that the centerpiece took forever to load, so rendering timed out (my most likely explanation) and we were left with a bunch of pages that only had the boilerplate. With only the boilerplate, those pages are dups.” (bản dịch) «I có một bunch of emails trong my inbox nơi đó vấn đề là đó centerpiece took forever để load, so kết xuất timed out (my hầu hết có khả năng lời giải thích) và we đã là left với một bunch of các trang đó chỉ đã có đó boilerplate. Với chỉ đó boilerplate, những các trang là dups.»
- “Do you have a JavaScript-heavy site and you see lots of dups reported in Search Console? Try to restructure the js calls such that the content (including marginal boilerplate) loads first and see if that helps.” (bản dịch) «Làm bạn có một JavaScript-nặng site và bạn see lots of dups reported trong Search Console? Try để restructure đó js calls such đó nội dung (including marginal boilerplate) loads đầu tiên và see nếu đó helps.» Đọc đó post (LinkedIn)
John Mueller, Google — không xếp hạng bonus cho kết xuất lựa chọn
- “There are no SEO ranking bonuses for implementing it one way or another.” (bản dịch) «Có không SEO xếp hạng bonuses cho implementing điều này một way hoặc một sản phẩm khác.» họ là “just different ways of making the content indexable (as is client side rendering).” (bản dịch) «chỉ khác nhau ways of đang làm đó nội dung indexable (as là client side kết xuất).» Đọc bài đưa tin (Công cụ tìm kiếm Roundtable)
React SEO checklist
truyền để xác nhận các crawler có thể see và chỉ mục của bạn React app:
- Quan trọng nội dung xuất hiện trong View Nguồn (thô HTML), không chỉ trong đó được kết xuất DOM — nếu đây là bị thiếu, bạn là depending on CSR.
- Các trang đó cần để xếp hạng dùng SSR hoặc SSG (Tiếp theo.js, Remix, hoặc một pre-render step), không thô client-side kết xuất.
- Main nội dung loads fast và đầu tiên — không chậm API waterfalls đó có thể trip đó render timeout vào một boilerplate-chỉ trang.
- Routing dùng đó History API (
BrowserRouter), khôngHashRouter/#/URLs. - Đó máy chủ có thể respond để mỗi client-side route (không 404 on trực tiếp hit hoặc refresh).
- Navigation dùng real
<a href>links (React Router<Link>), khôngonClick-chỉ handlers on<div>/<button>. - Mỗi route sets một unique
<title>, mô tả meta, canonical, và OG tags đó cập nhật on navigation. - Metadata matches của bạn version: React 19 native
<title>/<meta>/<link>tags cho đó basics, react-helmet-async cho React 18 hoặc advanced cần (không bao giờ đó deprecatedreact-helmet), hoặc đó Tiếp theo.js Metadata API nếu on Tiếp theo.js. - Nếu máy chủ-được kết xuất, bạn là hydrating với
hydrateRoot(khôngcreateRoot), và bất kỳ dev-chế độ hydration mismatch warning là treated as một bug để cách sửa. - Client-side “không tìm thấy” routes trả về một real 404 (hoặc một
noindex), không một soft-404 với một200status. - JavaScript và CSS không phải blocked trong
robots.txt(Google sẽ không render từ blocked files). - Không cốt yếu nội dung phụ thuộc vào cookies / localStorage / sessionStorage (đó renderer là stateless).
- Verified trong URL Inspection: đó được kết xuất HTML và screenshot cho thấy của bạn real nội dung.
- Coverage báo cáo checked cho “Discovered, currently not indexed” (bản dịch) «Discovered, hiện tại không được lập chỉ mục» (render backlog) và duplicate clusters (render-timeout trap).
mental models
1. chỉ câu hỏi đó matters: Điều gì trong thô HTML? View Nguồn trước khi bất kỳ JavaScript chạy là Điều gì đầu tiên-fetch crawler — và phần lớn AI các crawler, forever — see. nếu của bạn nội dung không phải ở đó, bạn có React SEO vấn đề regardless của Cách good trang looks trong của bạn trình duyệt.
2. Kết xuất là tách biệt, fallible step. Crawl → render → chỉ mục. CSR diễn đạt 100% của bạn nội dung on far side của render step, mà là queued, delayed, stateless, và có thể time out. SSR/SSG move của bạn nội dung trước khi đó step. không over-trust “hai waves” model — Splitt himself được gọi là nó oversimplification.
3. boilerplate-duplicate thất bại chế độ. Chậm nội dung + render timeout = mỗi URL renders as header/nav/footer chỉ = Google sees duplicates. khắc phục là structural: load nội dung đầu tiên, hoặc dừng depending on render step.
4. kết xuất cây quyết định.
- Công khai nội dung đó phải xếp hạng hoặc là cited by AI → SSG (static) hoặc SSR (fresh).
- Mostly static (blog, tài liệu, marketing) → SSG, hoặc ISR on timer.
- Frequently thay đổi, phải là fresh → SSR.
- Logged-trong dashboard, không meant để là được lập chỉ mục → CSR là fine.
- New xây dựng đó cần SEO → reach cho tiếp theo.js / Remix, không dynamic kết xuất.
5. HTML-đầu tiên, JS-thứ hai cho mỗi SEO tín hiệu. nội dung, links, canonicals, các tiêu đề, dữ liệu có cấu trúc — nhận them vào máy chủ-được kết xuất HTML. Treat JS-injected SEO các tín hiệu (including JS canonical tags và react-helmet on CSR) as fallback, không plan: Google sees them muộn, và AI các crawler không tại all.
React SEO — bảng tra nhanh
Kết xuất modes tại glance
| Chế độ | nội dung trong ban đầu HTML? | SEO risk | sử dụng cho |
|---|---|---|---|
| CSR (thô React) | Không | Highest | Logged-trong dashboards, không-được lập chỉ mục apps |
| Pre-kết xuất (react-snap) | Có (xây dựng time) | Thấp | Nhỏ, mostly-static các trang |
| SSG | Có (xây dựng time) | Lowest | Blogs, tài liệu, marketing |
| SSR | Có (theo yêu cầu) | Thấp | Fresh, dynamic nội dung |
| ISR / hybrid (tiếp theo.js) | Có | Thấp | Hourly/daily nội dung |
| Dynamic kết xuất | Bot-chỉ | Deprecated | không — sử dụng SSR/SSG/hydration |
phổ biến React SEO mistakes → các cách sửa
| Mistake | khắc phục |
|---|---|
| nội dung chỉ trong được kết xuất DOM (CSR) | SSR / SSG / pre-render |
Hash các URL (/#/path) | History API (BrowserRouter) |
onClick navigation, không anchor | thực <a href> / React Router <Link> |
| Meta tags không cập nhật on route | React 19: native <title>/<meta>/<link>. Older/Nâng cao: react-helmet-async. tiếp theo.js: Metadata API |
react-helmet (gốc, bất kỳ React version) | Chuyển để react-helmet-async hoặc React 19 native tags |
createRoot được sử dụng on máy chủ-được kết xuất HTML | sử dụng hydrateRoot thay vì — createRoot discards máy chủ markup |
| Hydration mismatch warning suppressed | Treat nó as bug và khắc phục máy chủ/client khác biệt |
| Chậm nội dung → render timeout → dups | Load main nội dung đầu tiên; move để SSR/SSG |
Client-side 404 trả về 200 | thực 404 status hoặc noindex |
Blocked .js / .css trong robots.txt | Cho phép them — Google sẽ không render blocked files |
| nội dung gated on cookies/localStorage | không — renderer là stateless |
Fast rules
- renderer là evergreen Chromium, queued, stateless, và times out.
- Không xếp hạng bonus cho SSR — nó về reliable indexability (Mueller).
- AI-crawler kết xuất varies by provider → thô HTML là safest coverage baseline.
- Trong tiếp theo.js, sử dụng Metadata API — không React Helmet.
- Bing renders JS (qua Edge) nhưng ít hơn reliably; SSR/SSG là safe call ở đó cũng.
kiểm tra Điều gì máy chủ gửi trước khi React chạy
Put representative indexable routes trong urls.txt. điều này tìm thấy CSR shells và bị thiếu
máy chủ-được kết xuất head markup trong thô phản hồi:
while IFS= read -r url; do
html=$(mktemp)
status=$(curl -sS -o "$html" -w '%{http_code}' "$url")
bytes=$(wc -c < "$html" | tr -d ' ')
title_count=$(grep -Eio '<title>[^<]*</title>' "$html" | wc -l | tr -d ' ')
canonical_count=$(grep -Eio '<link[^>]+rel=["'"']canonical["'"'][^>]*>' "$html" | wc -l | tr -d ' ')
printf '%s\t%s\tbytes=%s\ttitles=%s\tcanonicals=%s\n' "$status" "$url" "$bytes" "$title_count" "$canonical_count"
rm -f "$html"
done < urls.txtNhỏ byte size là chỉ review tín hiệu, không lỗi by itself. So sánh flagged thô các phản hồi với được kết xuất HTML và xác nhận đó chính text và crawlable links là present.
Tools cho auditing React SEO
- View Nguồn so với. Inspect Element — đó fastest đầu tiên kiểm tra. View Nguồn là đó thô HTML (điều gì một crawler nhận trước JS); Inspect Element là đó được kết xuất DOM. Nội dung trong Inspect nhưng không View Nguồn là JavaScript-phụ thuộc.
- URL Inspection (Google Search Console) — đó nguồn of truth. Chạy một trực tiếp kiểm thử, thì view đó được kết xuất HTML, đó screenshot, đó trang các tài nguyên (điều gì loaded so với. đã là blocked), và console messages để see chính xác điều gì Google được kết xuất.
- Rich Kết quả Kiểm thử — một nhanh được kết xuất-HTML và structured-dữ liệu kiểm tra cho một single URL không có verifying đó site.
- Chrome DevTools — disable JavaScript (Command Menu → “Disable JavaScript” (bản dịch) «Disable JavaScript») và reload để inspect điều gì an HTML-chỉ fetcher nhận. Này là một coverage kiểm tra, không proof of bất kỳ named AI crawler hiện tại kết xuất behavior.
- Search Console Coverage báo cáo — watch “Discovered, currently not indexed” (bản dịch) «Discovered, hiện tại không được lập chỉ mục» (render backlog) và duplicate clusters (đó render-timeout boilerplate trap).
- JS-kết xuất các crawler — Ahrefs Site Audit và Screaming Frog SEO Spider (JS-kết xuất chế độ) execute JavaScript so bạn có thể diff thô so với. được kết xuất HTML trên đó site.
Mistakes React nhóm thực ra làm
Concrete patterns I giữ seeing trong CSR React apps đó nhận shipped, không hypothetical ones. mỗi là prevention move — catch nó trước khi nó costs bạn lập chỉ mục.
Shipping thô CRA/Vite CSR Đối với các trang đó cần để xếp hạng
Nhóm ship Tạo React App hoặc Vite + React straight để production cho marketing các trang,
blog posts, hoặc sản phẩm các trang — chính xác nội dung đó cần để hiển thị lên trong tìm kiếm.
Vì sao nó sai: máy chủ gửi gần như-rỗng <div id="root"> shell; của bạn thực
nội dung chỉ tồn tại sau khi JavaScript chạy, so nó delayed by Google render queue và
có thể là invisible để bất kỳ AI crawler đó fetches ban đầu HTML không có client execution.
Điều gì để làm thay vì: move
bất cứ điều gì đó cần để xếp hạng hoặc là cited để SSR hoặc SSG — tiếp theo.js hoặc Remix là easiest
paths — và reserve thô CSR cho logged-trong, non-được lập chỉ mục surfaces như dashboards.
Routing on hash các URL (HashRouter)
Reaching cho React Router HashRouter vì nó path của least resistance —
không máy chủ config needed, hoạt động on bất kỳ static host. Vì sao nó sai: Google có thể’t
reliably resolve /#/products-style các URL; old AJAX-crawling scheme đó đã làm hash
fragments crawlable là deprecated. Điều gì để làm thay vì: sử dụng BrowserRouter (
History API) và hãy đảm bảo máy chủ responds để mỗi route nó produces, including
trực tiếp hit hoặc refresh on deep link.
Building navigation on onClick thay vì thực anchors
Wiring lên navigation với onClick handlers on <div> hoặc <button>, thường vì nó
là easier để style hoặc tránh default link behavior. Vì sao nó sai: Google chỉ
follows thực <a href> links — <div> với nhấp handler là invisible để crawling,
không quan trọng Cách nó behaves cho mouse. Điều gì để làm thay vì: sử dụng React Router
<Link> component, mà renders thực tế <a href> dưới hood, hoặc đơn giản anchor
tag cho external navigation.
Loading main nội dung behind chậm API waterfall
Fetching header và nav fast, sau đó chaining several API calls trước khi thực tế trang nội dung — part đó làm mỗi URL unique — xuất hiện. Vì sao nó sai: Google Web Kết xuất Service enforces timeout; nếu của bạn centerpiece nội dung loads slowly, kết xuất finishes trước khi nó arrives, và Google là left lập chỉ mục boilerplate-chỉ các trang đó sau đó nhận flagged as duplicates của mỗi khác — chính xác thất bại chế độ Gary Illyes described. Điều gì để làm thay vì: restructure các yêu cầu so main nội dung loads đầu tiên, hoặc xóa dependency on client-side kết xuất hoàn toàn với SSR/SSG.
vẫn sử dụng gốc react-helmet
Reaching cho react-helmet cho theo-route <title> và meta tags vì nó
library mỗi older tutorial khuyến nghị. Vì sao nó sai: gốc package là
unmaintained — không phát hành since 2020 — và có known các vấn đề dưới React 18’s concurrent
kết xuất và SSR. Điều gì để làm thay vì: on React 19, render <title>/<meta>/<link>
trực tiếp trong của bạn components và let React hoist them (không library needed cho basics).
On React 18, hoặc cho Nâng cao cần như SSR context serialization hoặc titleTemplate, sử dụng
react-helmet-async, maintained fork. On tiếp theo.js, sử dụng của nó được xây dựng-trong Metadata API và
không bolt Helmet bên cạnh nó.
Blocking JavaScript hoặc CSS trong robots.txt
Blocking /static/js/ hoặc bundler asset folder trong robots.txt, đôi khi left over
từ old crawl-budget concern hoặc copied từ một trang web config. Vì sao nó
sai: Google có thể’t render Điều gì nó không phải được phép để fetch — blocked bundle có nghĩ là
Web Kết xuất Service xây dựng incomplete (hoặc rỗng) DOM, mặc dù của bạn mã nguồn
là fine. Điều gì để làm thay vì: cho phép các crawler để fetch của bạn JS và CSS, và xác nhận nó
với URL Inspection tool trang-các tài nguyên kiểm tra để see không có gì cốt yếu là blocked.
Tự kiểm tra: React SEO
Five nhanh các câu hỏi on đang làm React 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 related writing
- React SEO: Thực hành tốt nhất để Làm nó SEO-Friendly (Ahrefs) — React SEO hướng dẫn on Ahrefs, mà I reviewed; điều này bài viết là deeper, nguồn-linked treatment.
- JavaScript SEO: Definitive Hướng dẫn (Ahrefs) — my đầy đủ hướng dẫn để underlying kết xuất mechanics: DOM parity, phần lớn-restrictive-directive rule, canonical và meta-tag xử lý, và kết xuất choices. đọc điều này cho chung case behind React-cụ thể các cách sửa.
- Người mới bắt đầu Hướng dẫn để kỹ thuật SEO (Ahrefs) — nơi React/JavaScript SEO fits 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
- Understand JavaScript SEO Basics (Google) — chính-nguồn tài liệu on SPAs, đó History API, và canonical/status-code xử lý.
- Dynamic Kết xuất (deprecated) (Google) — vì sao dynamic kết xuất là một workaround, không một dài-term giải pháp.
- Martin Splitt Giải thích Cách JavaScript Các trang Là Được lập chỉ mục (Search Engine Journal) — đó “barebone HTML … boom” (bản dịch) «barebone HTML … boom» lời giải thích of đó crawl → render → chỉ mục flow.
- Gary Illyes on JS-nặng các trang và duplicate nội dung (LinkedIn) — đó render-timeout-để-duplicates chế độ lỗi, trong his own words.
- Cách sửa SEO kỹ thuật các vấn đề on client-side React apps (Search Engine Land) — một thực tế case nghiên cứu on auditing và sửa một CSR React app.
- SSR so với. dynamic kết xuất — không xếp hạng khác biệt (Công cụ tìm kiếm Roundtable) — Mueller “no SEO ranking bonuses” (bản dịch) «không SEO xếp hạng bonuses» statement.
- react-helmet-async (npm) — đó maintained head-management library cho standalone React.
- Đó new evergreen Bingbot (Microsoft Edge) (Bing) — Bingbot kết xuất JS qua Chromium, như Googlebot.
Videos
- Google Search Central — JavaScript SEO series (YouTube) — Martin Splitt chính thức video series covers SEO cho React, Angular, và Vue cụ thể, walking qua crawl → render → chỉ mục xử lý và phổ biến các cách sửa. Series announcement · 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.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.