Hướng dẫn SEO React: vì sao dựng phía client làm hại việc lập chỉ mục, khi nào chọn SSR hoặc dựng trước, cách đặt thẻ meta trong React 19 và vẫn đọc được bởi AI.

Trên trang này
Tóm lại
React có thể lên top Google, nhưng một ứng dụng một trang mặc định gửi một tệp HTML gần như rỗng và phụ thuộc vào JavaScript để hiện nội dung, điều này làm chậm việc lập chỉ mục và ẩn trang khỏi hầu hết crawler AI. Cách sửa đáng tin cậy là gửi HTML từ máy chủ: dựng sẵn các trang tĩnh lúc build hoặc dùng một framework có dựng phía máy chủ (Next.js, React Router). Sau đó đặt tiêu đề, mô tả và canonical riêng cho từng URL, dùng liên kết thật và mã trạng thái đúng, rồi kiểm tra những gì bot nhận được.
Muốn tìm hiểu sâu hơn? Hãy hỏi
Bài trắc nghiệm nhanh
SEO có phù hợp với bạn không, và nên bắt đầu như thế nào?
Sorank phù hợp với câu trả lời của bạn
Thử nghiệm trong 3 ngày trên chính website của bạn và xem vị trí của bạn trên Google, ChatGPT và các AI khác.
Bắt đầu dùng thử miễn phí 3 ngày3 ngày miễn phí, sau đó bạn có thể dừng bất cứ lúc nào. Cam kết hoàn tiền trong 90 ngày nếu không có kết quả.
SEO React là công việc làm cho một ứng dụng React có thể được công cụ tìm kiếm và trợ lý AI thu thập, lập chỉ mục và hiểu. Bản thân React là trung lập: vấn đề phát sinh khi mọi thứ được dựng trong trình duyệt. Google xác nhận trong kiến thức cơ bản về SEO JavaScript rằng nó xử lý ứng dụng JavaScript qua ba giai đoạn (thu thập, dựng, lập chỉ mục) và rằng "dựng phía máy chủ hoặc dựng trước vẫn là một ý tưởng rất tốt, vì nó làm website nhanh hơn cho người dùng và crawler, và không phải bot nào cũng chạy được JavaScript."
Một ứng dụng React được tạo dưới dạng ứng dụng một trang gửi một tệp HTML chỉ có một thẻ div gốc rỗng và một thẻ script. Trình duyệt tải JavaScript, chạy nó và dựng trang. Một crawler chỉ đọc HTML sẽ không thấy gì để lập chỉ mục: không có tiêu đề, không có văn bản, không có liên kết.
Googlebot có chạy JavaScript, nhưng trong một bước riêng: trang được thu thập, xếp hàng để dựng, được dựng trong Chromium không giao diện, và chỉ sau đó nội dung và liên kết đã dựng mới được dùng. Mỗi bước thêm là một cơ hội thất bại (lỗi script, API bị chặn, quá thời gian chờ) và làm chậm việc trang mới xuất hiện trên tìm kiếm. Hướng dẫn về SEO JavaScript của chúng tôi trình bày chi tiết quy trình này, còn bài viết về lập chỉ mục trên Google giải thích cách đưa trang vào chỉ mục nhanh hơn.
Các bot khác thì kém kiên nhẫn hơn. Phân tích tháng 12/2024 của Vercel, The rise of the AI crawler, nhận thấy rằng "hiện không có crawler AI lớn nào dựng JavaScript", kể tên GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot và PerplexityBot. Một trang React dựng phía client sẽ vô hình với ChatGPT, Claude và Perplexity, ngay cả khi Google đã lập chỉ mục nó.
Đội ngũ React giờ khuyến nghị bắt đầu các ứng dụng mới bằng một framework. Khi ngừng hỗ trợ Create React App vào ngày 14/02/2025, họ viết trong thông báo rằng "dựng phía máy chủ có thể cải thiện SEO", và cũng cải thiện hiệu năng vì giảm lượng JavaScript người dùng phải tải trước khi thấy nội dung. Các lựa chọn, từ yếu nhất đến mạnh nhất với tìm kiếm:
| Cách tiếp cận | Bot nhận được gì | Đánh giá SEO | Công cụ điển hình |
|---|---|---|---|
| Dựng phía client (SPA) | HTML rỗng, nội dung xuất hiện sau JavaScript | Yếu: lập chỉ mục chậm, vô hình với crawler AI | Vite + React, các dự án Create React App cũ |
| Dựng động (dynamic rendering) | HTML đã dựng sẵn chỉ dành cho bot | Giải pháp tạm, Google không khuyến nghị | Dịch vụ dựng trước, proxy trình duyệt không giao diện |
| Dựng trước tĩnh lúc build | HTML đầy đủ cho mọi URL đã biết | Rất tốt cho nội dung ít thay đổi | Dựng trước với React Router, trình tạo site tĩnh, xuất tĩnh Next.js |
| Dựng phía máy chủ (SSR) | HTML đầy đủ ở mỗi yêu cầu, sau đó hydrate | Tốt nhất cho site lớn hoặc được cập nhật thường xuyên | Next.js, React Router (chế độ framework, trước đây là Remix) |
Về dựng động, tài liệu của Google nói rõ: nó "là một giải pháp tạm thời, không phải giải pháp lâu dài", và Google khuyến nghị dựng phía máy chủ, dựng tĩnh hoặc hydrate thay thế. Nếu bạn đang chọn framework, hướng dẫn SEO Next.js của chúng tôi trình bày chi tiết các chế độ dựng, Metadata API và sitemap.
Nếu không thể chuyển đổi, một ứng dụng một trang vẫn có thể được Google lập chỉ mục khi làm cẩn thận. Hướng dẫn về SEO cho ứng dụng một trang của chúng tôi liệt kê các điều kiện; phần còn lại của bài viết này áp dụng cho cả hai trường hợp.
Từ React 19 (ổn định từ ngày 05/12/2024), các thành phần có thể render trực tiếp thẻ title, meta và link, và React đưa chúng lên phần đầu của tài liệu. Ghi chú phát hành React 19 nêu rằng hỗ trợ gốc này hoạt động "với các ứng dụng chỉ chạy phía client, SSR có streaming và Server Components". Trước React 19, các thư viện như react-helmet hoặc react-helmet-async làm cùng công việc, và chúng vẫn hữu ích để ghi đè giá trị mặc định theo từng route.
function ProductPage({ product }) {
return (
<>
<title>{`${product.name} | Shop`}</title>
<meta name="description" content={product.summary} />
<link rel="canonical" href={`https://example.com/p/${product.slug}`} />
<h1>{product.name}</h1>
</>
)
}Ba quy tắc áp dụng bất kể phương pháp nào:
Cần chú ý
Trong một ứng dụng chỉ chạy phía client, các thẻ do React render chỉ tồn tại sau khi JavaScript chạy. Google có thể đọc chúng sau khi dựng; crawler AI và hầu hết bot xem trước mạng xã hội thì không. Dựng phía máy chủ hoặc dựng trước đưa chúng vào phản hồi HTML cho mọi người.
Google nêu rõ rằng nó "chỉ có thể khám phá liên kết của bạn nếu chúng là phần tử HTML a có thuộc tính href" và khuyên không dùng phần băm (fragment) của URL để tải nội dung khác nhau. Phần lớn lỗi SEO React đến từ các chi tiết định tuyến:
| Lỗi | Hậu quả | Cách sửa |
|---|---|---|
| Điều hướng bằng onClick trên div hoặc button | Google không tìm thấy liên kết để theo | Dùng thành phần Link của router, nó render thẻ a có href |
| Route dạng hash (/#/products) | Mọi trang chia sẻ chung một URL với Google | Dùng route dựa trên lịch sử (/products) với BrowserRouter hoặc framework |
| Giao diện "không tìm thấy" trả về trạng thái 200 | Soft 404 trong Search Console | Trả về 404 thật từ máy chủ, hoặc thêm noindex bằng JavaScript trong SPA thuần |
| Chỉ chuyển hướng phía client | Chuyển hướng chậm hoặc bị bỏ sót | Dùng chuyển hướng 301 hoặc 308 từ máy chủ cho trang đã chuyển |
| Nội dung tải khi nhấp hoặc cuộn | Crawler không bao giờ thấy văn bản | Render nội dung chính khi tải trang; phân trang danh sách bằng URL thật |
| JavaScript hoặc API bị chặn trong robots.txt | Google dựng ra trang trống | Cho phép các script và endpoint API mà trang cần |
Để xem Google dựng những gì, dùng công cụ Kiểm tra URL trong Search Console và xem HTML của trang đã kiểm tra, hoặc chạy công cụ kiểm tra khả năng lập chỉ mục trên các mẫu trang chính.
React không có sitemap sẵn. Hãy tạo sitemap.xml lúc build từ các route và dữ liệu của bạn (hoặc từ tính năng sitemap của framework), chỉ liệt kê các URL canonical trả về 200, và tham chiếu đến nó trong robots.txt. Công cụ tạo sitemap XML phù hợp với các site tĩnh nhỏ.
Dữ liệu có cấu trúc tuân theo cùng quy tắc với metadata: render script JSON-LD cùng trang, từ cùng dữ liệu, lý tưởng là trên máy chủ. Google có thể đọc JSON-LD được chèn bằng JavaScript sau khi dựng, nhưng đánh dấu không có trong HTML ban đầu thì vắng mặt với các crawler không dựng trang. Dùng Article cho bài viết, Product cho thương mại điện tử, Organization cho toàn site và BreadcrumbList cho các trang sâu.
Mẹo
Chạy curl trên URL một trang và tìm trong kết quả H1 của nó cùng một câu trong nội dung. Nếu không có, Google có thể lập chỉ mục trang sau khi dựng, nhưng crawler AI sẽ không thấy gì.
Các gói JavaScript lớn làm hại Core Web Vitals: trình duyệt phải tải, phân tích và hydrate mã trước khi trang phản hồi, điều này ảnh hưởng đến Largest Contentful Paint và Interaction to Next Paint, nhất là trên di động. Thông báo về Create React App của đội ngũ React ghi rằng dựng phía máy chủ gửi ít JavaScript hơn và một tài liệu HTML đầy đủ, giúp First Contentful Paint nhanh hơn và có thể giảm INP. Các đòn bẩy thực tế: tách mã theo route bằng React.lazy, cung cấp hình ảnh với kích thước rõ ràng, tải lười các thành phần nằm dưới màn hình đầu, và rà soát các script bên thứ ba.
GEO (generative engine optimization) bắt đầu từ khả năng truy cập. Vì crawler AI tải HTML thô, một trang React phải cung cấp văn bản, tiêu đề và JSON-LD mà không cần JavaScript thì mới được đọc, tóm tắt và trích dẫn. Kiểm tra AI về khả năng thu thập của website cho thấy những bot này nhận được gì từ trang của bạn. Điều kiện thứ hai là nội dung đáng được trích dẫn: các trang trả lời một câu hỏi mỗi phần, có nguồn, số liệu và định nghĩa rõ ràng.
Phần nội dung đó là thứ Sorank, sản phẩm của chúng tôi, tự động hóa. Sorank là phần mềm SEO và GEO chạy theo chế độ autopilot: trình tạo bài viết blog của nó viết và xuất bản 20, 60 hoặc 120 bài mỗi tháng kèm nguồn, liên kết nội bộ và hình ảnh, và nó kết nối với các hệ thống tùy chỉnh như site React hoặc Next.js qua webhook. Trò chuyện SEO của nó trả lời các câu hỏi về hiệu suất tìm kiếm của site bạn qua hội thoại.

Tóm lại: gửi HTML từ máy chủ, cho mỗi URL một tiêu đề, mô tả và canonical riêng, và dùng liên kết thật. Khi đó React xếp hạng như mọi site khác, và trợ lý AI có thể đọc nó. Để giữ site đó luôn có bài viết được viết cho Google và AI, xem các gói của Sorank, từ $49 mỗi tháng và có bản dùng thử miễn phí 3 ngày.
Không. React là thư viện giao diện người dùng, và SEO của nó phụ thuộc vào cách trang được dựng. Một ứng dụng một trang dựng phía client gửi HTML trống và dựa vào bước dựng của Google, điều này làm chậm việc lập chỉ mục và ẩn nội dung khỏi crawler AI. Cùng mã React đó được phục vụ bằng dựng phía máy chủ hoặc dựng trước tĩnh sẽ xếp hạng như một website cổ điển.
Có. Googlebot dựng JavaScript bằng một phiên bản Chromium gần đây, nên nó có thể lập chỉ mục nội dung mà ứng dụng React tạo ra trong trình duyệt. Việc dựng diễn ra sau khi thu thập và có thể bị trì hoãn hoặc thất bại nếu script lỗi hoặc API bị chặn. Kiểm tra HTML đã dựng bằng công cụ Kiểm tra URL trong Search Console sẽ cho thấy Google thấy gì.
Không cần trong các trường hợp cơ bản. React 19 render thẻ title, meta và link từ bất kỳ thành phần nào và đưa chúng lên phần đầu tài liệu. Các thư viện như react-helmet-async vẫn hữu ích khi bạn cần ghi đè giá trị mặc định của cả site theo từng route, hoặc hỗ trợ các phiên bản React cũ hơn.
HỌ ĐÃ THỬ SORANK TRƯỚC BẠN
