Technical SEO

JavaScript SEO

Tối ưu hóa cách nội dung được tạo bởi JavaScript được crawler thu thập, render và lập chỉ mục đúng cách.

3 lượt xem Cập nhật: 30/05/2026

JavaScript SEO là gì?

JavaScript SEO là tập hợp các kỹ thuật tối ưu hóa giúp công cụ tìm kiếm (đặc biệt là Googlebot) thu thập, hiển thị (render), và lập chỉ mục đúng cách nội dung được tạo hoặc thay đổi bằng JavaScript — như nội dung tải động, SPA (Single Page Application), hoặc giao diện tương tác dùng React, Vue, Angular.

Tại sao quan trọng trong SEO?

Nhiều website hiện đại phụ thuộc nặng vào JavaScript để hiển thị nội dung chính: tiêu đề bài viết, mô tả sản phẩm, thẻ meta động, đường dẫn nội bộ… Nếu không xử lý đúng, crawler có thể thấy trang trắng, thiếu nội dung, hoặc đọc sai cấu trúc — dẫn đến không lập chỉ mục, xếp hạng kém hoặc mất toàn bộ lưu lượng organic.

Google đã hỗ trợ render JavaScript từ năm 2014, nhưng quá trình này chậm hơn thu thập HTML tĩnh, tốn tài nguyên hơn và dễ thất bại nếu có lỗi. Các công cụ tìm kiếm khác (Bing, Yandex) hỗ trợ render yếu hơn hoặc không hỗ trợ đầy đủ.

Cách hoạt động

Quá trình index trang dùng JavaScript gồm 3 giai đoạn:

  1. Thu thập (Crawling): Googlebot gửi yêu cầu HTTP, nhận file HTML ban đầu — thường chỉ chứa thẻ <script>, không có nội dung hiển thị.
  2. Render (Hiển thị): Googlebot chạy engine Chromium (tương tự Chrome 100–109 tùy thời điểm) để thực thi JavaScript, tạo DOM hoàn chỉnh, sau đó trích xuất nội dung và liên kết.
  3. Lập chỉ mục (Indexing): Nội dung đã render được phân tích như HTML tĩnh — nhưng chỉ khi không bị chặn bởi robots.txt, noindex, hoặc lỗi JS nghiêm trọng.

Lưu ý: Render không đồng nghĩa với index. Một trang render thành công vẫn có thể không được lập chỉ mục nếu thiếu tiêu đề, nội dung độc đáo, hoặc vi phạm hướng dẫn chất lượng.

Hướng dẫn thực hiện

Dưới đây là các bước thiết yếu để đảm bảo JavaScript SEO hiệu quả:

  • Cho phép thu thập tài nguyên: Đảm bảo robots.txt không chặn .js, .css, hoặc thư mục /dist/, /static/.
  • Sử dụng SSR (Server-Side Rendering) hoặc SSG (Static Site Generation): Với Next.js, Nuxt, Gatsby — nội dung được sinh sẵn trên máy chủ, giúp crawler đọc ngay mà không cần render.
  • Render sẵn (Prerendering): Dùng dịch vụ như Prerender.io hoặc Puppeteer để tạo bản HTML tĩnh cho các URL quan trọng — phù hợp khi không thể chuyển sang SSR/SSG.
  • Đảm bảo thẻ meta động hoạt động đúng: Kiểm tra qua URL Inspection Tool trong Google Search Console để xác nhận <title>, <meta name="description">, <link rel="canonical"> được render chính xác.
  • Không dùng document.write(): Hàm này gây treo render trên Chrome và bị Googlebot bỏ qua hoàn toàn.
  • Tối ưu tốc độ render: Tránh gọi API chậm, giảm kích thước bundle JS, loại bỏ code không dùng (tree-shaking), và trì hoãn tải script không cần thiết (defer hoặc async).

Lỗi thường gặp

Dưới đây là những vấn đề phổ biến và cách khắc phục:

Lỗi Dấu hiệu Cách khắc phục
JS bị chặn bởi robots.txt Google Search Console báo “Tài nguyên bị chặn”, nội dung không xuất hiện trong URL Inspection Sửa robots.txt để cho phép truy cập thư mục chứa JS/CSS
Nội dung tải sau khi render (lazy-load) không được crawl Chỉ thấy phần header/footer trong kết quả kiểm tra render, thiếu nội dung chính Chuyển nội dung quan trọng sang tải sớm (non-lazy), hoặc dùng SSR/Prerender cho các khối then chốt
Thẻ <title> hoặc <h1> thay đổi sau khi JS chạy Google hiển thị tiêu đề cũ hoặc không rõ ràng trong kết quả tìm kiếm Đặt tiêu đề gốc trong HTML tĩnh, cập nhật bằng JS chỉ khi cần — hoặc dùng history.pushState() + document.title đồng bộ
Liên kết nội bộ tạo bằng JS không được phát hiện Googlebot không khám phá các trang con, số URL được crawl thấp bất thường Thêm liên kết dạng HTML tĩnh trong <a href="..."> ở phần footer/sitemap, hoặc dùng rel="canonical"hreflang rõ ràng

Ví dụ thực tế

Một cửa hàng điện máy xây dựng website với React và routing động (react-router). Ban đầu, tất cả sản phẩm đều tải bằng fetch() sau khi trang load — dẫn đến Google chỉ lập chỉ mục trang chủ, còn 500+ sản phẩm không xuất hiện trong tìm kiếm.

Giải pháp áp dụng:

  • Chuyển sang Next.js với getStaticProps để sinh trang sản phẩm tĩnh theo danh mục.
  • Giữ lại trải nghiệm người dùng bằng SWR để cập nhật giá/tồn kho sau render.
  • Thêm <link rel="preload" as="fetch"> cho API sản phẩm quan trọng.

Kết quả sau 6 tuần: Số URL được lập chỉ mục tăng từ 12 lên 527, lưu lượng tìm kiếm tăng 210%, tỷ lệ nhấp (CTR) trung bình tăng 34%.

Câu hỏi thường gặp

Google có đọc được JavaScript không?

Có — Googlebot hỗ trợ render JavaScript bằng engine Chromium, nhưng khả năng này có giới hạn về thời gian (khoảng 5–10 giây mỗi URL), bộ nhớ và mức độ tương thích. Không phải mọi hàm JS đều được thực thi đúng — ví dụ: document.write(), WebAssembly chưa hỗ trợ đầy đủ, hoặc mã phụ thuộc vào localStorage trong môi trường không có cookie.

Có nên dùng client-side rendering (CSR) thuần cho website thương mại?

Không khuyến khích. CSR thuần làm chậm quá trình lập chỉ mục, tăng rủi ro mất nội dung, và khó kiểm soát thẻ meta động. Với website thương mại, SSR hoặc SSG luôn là lựa chọn ưu tiên — trừ khi ứng dụng mang tính tương tác cao (dashboard admin, tool cá nhân) và không cần xuất hiện trên tìm kiếm.

React/Vue/Angular có ảnh hưởng gì đến SEO?

Framework bản thân không gây hại cho SEO — vấn đề nằm ở cách triển khai. React với Next.js (SSR/SSG), Vue với Nuxt, Angular với Universal đều hỗ trợ SEO tốt. Ngược lại, React thuần với create-react-app và routing bằng react-router-dom v6 (CSR-only) sẽ gây rủi ro cao nếu không bổ sung render phía máy chủ hoặc prerender.