SEO Kỹ thuật / AEO

Công cụ Kiểm tra Rủi ro SEO khi Render JavaScript

Dán toàn bộ mã nguồn HTML của trang (kết quả View Page Source / Ctrl+U) để xem chính xác những gì một crawler không thực thi JavaScript nhìn thấy — bao gồm mọi AI answer engine crawler — so với những gì chỉ xuất hiện sau khi framework của bạn hoàn tất hydration trang.

Dùng "View Page Source" (Ctrl+U), không phải panel Elements của DevTools — Elements hiển thị DOM SAU KHI JavaScript đã chạy, làm mất ý nghĩa của việc kiểm tra này. Không có gì được gửi đi đâu ngoài máy chủ của chúng tôi cho lần phân tích một lần này.

Công cụ này kiểm tra gì

Googlebot cuối cùng sẽ thực thi JavaScript, nhưng chỉ trong đợt render thứ hai bị giới hạn ngân sách tài nguyên, có thể trễ nhiều ngày hoặc bị bỏ qua hoàn toàn trên các trang có crawl budget thấp. Hầu hết các crawler quan trọng khác hiện nay — Bingbot ở quy mô nhỏ hơn, và gần như mọi AI crawler (GPTBot, ClaudeBot, PerplexityBot, CCBot) cùng các bot xem trước mạng xã hội (Twitterbot, facebookexternalhit, LinkedInBot) — không bao giờ thực thi JavaScript. Công cụ này phân tích HTML tĩnh bạn dán vào bằng một trình phân tích DOM thực sự và báo cáo xem title, meta description, thẻ canonical, H1, dữ liệu có cấu trúc, và nội dung body thực tế có tồn tại trong markup tĩnh đó hay chỉ xuất hiện sau khi framework JS của bạn hydrat hóa trang.

Cách phân tích hoạt động

HTML được dán vào sẽ được phân tích thành một DOM thực sự (không phải quét regex đơn giản), sau đó được kiểm tra dựa trên chính xác các tín hiệu mà một crawler không render sử dụng để hiểu và lập chỉ mục trang.

Sự hiện diện của thẻ SEO tĩnh

Title, meta description, và rel="canonical" được đọc trực tiếp từ markup đã phân tích. Một framework chèn các thẻ này qua JavaScript (mẫu router phổ biến của React/Vue) sẽ hiển thị là thiếu tại đây — đúng như những gì một crawler không render nhìn thấy.

Nội dung body so với kích thước tài liệu

Nội dung script, style và noscript bị loại bỏ, sau đó văn bản hiển thị còn lại được đo so với tổng kích thước tài liệu. Một trang chủ yếu chỉ có bundle <script> bao quanh một body gần như trống rỗng là dấu hiệu kinh điển của client-side rendering (CSR).

Phát hiện root container của framework

Các điểm mount SPA phổ biến — #root, #app, #__next, #__nuxt, #___gatsby, #svelte, ng-version của Angular, data-reactroot của React — được xác định và đo văn bản bên trong. Root container trống cùng với body gần như trống là bằng chứng mạnh mẽ cho thấy toàn bộ trang được xây dựng phía client sau khi tải.

Chất lượng nội dung dự phòng noscript

Khối <noscript> được kiểm tra xem có nội dung dự phòng thực sự hay chỉ là thông báo chung chung "vui lòng bật JavaScript", vì khối đó thực sự là thứ duy nhất mà khách truy cập hoặc crawler không thực thi JS sẽ thấy ngoài HTML thô.

Crawler nào thực sự thực thi JavaScript

Đây chính là lý do thực sự tại sao các tín hiệu SEO tĩnh, hiển thị từ máy chủ vẫn quan trọng vào năm 2026 — hầu hết các crawler quyết định trích dẫn AI-answer và xem trước mạng xã hội không bao giờ chạy script nào cả.

Googlebot Trì hoãn Thực thi JavaScript, nhưng chỉ trong đợt render thứ hai bị giới hạn ngân sách tài nguyên — việc lập chỉ mục nội dung chỉ phụ thuộc JS có thể trễ nhiều ngày hoặc bị bỏ qua trên các trang bị giới hạn crawl budget.
Bingbot Hạn chế Render JavaScript ở quy mô nhỏ hơn và ngân sách chặt chẽ hơn Google. Nội dung tĩnh là lựa chọn an toàn hơn.
GPTBot / ChatGPT-User (OpenAI) Không Chỉ lấy HTML thô. Nội dung chỉ xuất hiện sau khi JavaScript chạy sẽ vô hình với nó — ảnh hưởng trực tiếp đến việc ChatGPT có thể trích dẫn trang của bạn hay không.
ClaudeBot (Anthropic) Không Chỉ lấy HTML thô, cùng giới hạn như các AI crawler khác — ảnh hưởng trực tiếp đến việc Claude có thể trích dẫn trang của bạn hay không.
PerplexityBot Không Chỉ lấy HTML thô — điều này ảnh hưởng trực tiếp đến khả năng được trích dẫn AI-answer trên Perplexity.
CCBot (Common Crawl) Không Cung cấp dữ liệu cho nhiều tập dữ liệu huấn luyện AI; chỉ thu thập HTML thô, không thực thi JavaScript.
facebookexternalhit / Twitterbot / LinkedInBot Không Bản xem trước liên kết mạng xã hội (Facebook, Twitter/X, LinkedIn) được xây dựng hoàn toàn từ các thẻ meta tĩnh được lấy về mà không thực thi JavaScript.
Most SEO / backlink crawlers Không Hầu hết các crawler SEO/backlink (Ahrefs, Semrush và tương tự) chỉ phân tích HTML thô, vì lý do tốc độ và chi phí.

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

Trang web của tôi dùng Next.js/Nuxt với server-side rendering — công cụ này có đánh dấu là rủi ro không?

Không. Server-side rendering (SSR) và static generation (SSG) xuất title, thẻ meta, H1, và nội dung body trực tiếp vào phản hồi HTML, nên công cụ này sẽ đọc chúng là có tồn tại, và root container của framework sẽ chứa văn bản thực thay vì một lớp vỏ trống. Công cụ này đặc biệt đánh dấu rendering chỉ phía client (CSR), nơi phản hồi HTML ban đầu là một lớp vỏ gần như trống và chỉ được lấp đầy sau khi bundle JavaScript được tải về và chạy.

Tại sao "View Page Source" quan trọng hơn panel Elements của DevTools ở đây?

Panel Elements hiển thị DOM trực tiếp sau khi trình duyệt của bạn đã thực thi mọi script — nó luôn trông hoàn chỉnh, ngay cả trên một trang CSR thuần túy, vì trình duyệt của bạn vừa render nó. "View Page Source" (hoặc một lần lấy curl/wget đơn giản) hiển thị các byte thực tế mà một crawler không render nhận được, trước khi bất kỳ JavaScript nào chạy. Đó là góc nhìn duy nhất khớp với những gì GPTBot, ClaudeBot, Twitterbot, và hầu hết các crawler SEO thực sự thấy.

Google có thực sự không thấy đúng nội dung được render bằng JavaScript của tôi không?

Googlebot nhìn chung có render JavaScript, nhưng trong một đợt render riêng biệt, bị trễ, với ngân sách tài nguyên thực sự có giới hạn — chính Google cũng đã ghi nhận tình trạng trễ lập chỉ mục và đôi khi render thất bại đối với các trang nặng JS. Đối với nội dung bạn cần được lập chỉ mục một cách đáng tin cậy và nhanh chóng, và đối với mọi crawler AI-answer hoặc xem trước mạng xã hội hoàn toàn không render JavaScript, sự hiện diện của HTML tĩnh mới thực sự đảm bảo khả năng hiển thị.

Công cụ này có lưu trữ hay chia sẻ HTML tôi đã dán không?

HTML bạn dán vào được gửi một lần, qua HTTPS, đến máy chủ của chúng tôi để chạy việc phân tích một lần này (cần thiết để giữ logic phân tích DOM nhất quán và không bị lộ dưới dạng mã client có thể sao chép), và không được lưu trữ sau yêu cầu đó.