Hướng dẫn về JavaScript SEO
Cách hãy bảo đảm các công cụ tìm kiếm có thể crawl, render, và chỉ mục JavaScript-phụ thuộc nội dung — real links, parity, lazy-loading, infinite scroll, soft-404s, và kiểm thử.
Ngôn ngữ
1 tín hiệu bằng chứng trên trang này
- Công cụ trực tuyến liên quanRaw vs. Rendered HTML Checker
JavaScript SEO là về liệu các công cụ tìm kiếm có thể crawl, render, và chỉ mục nội dung đó phụ thuộc vào JavaScript. Google có thể chạy JS — đó các chế độ lỗi là hơn cụ thể: parity (thô so với được kết xuất), interaction (Google không scroll hoặc nhấp), state (đó renderer là stateless), và timing. Giữ links as real anchors, không block JS/CSS, ưu tiên SSR/prerendering cho nội dung đó phải xếp hạng, và watch infinite scroll — một tall render viewport có thể nhận hai các trang được lập chỉ mục as một.
Tóm tắt — JavaScript SEO là về một câu hỏi: có thể các công cụ tìm kiếm see của bạn nội dung? Modern các trang xây dựng lot của trang trong trình duyệt với JavaScript. nếu của bạn quan trọng text và links chỉ hiển thị lên sau khi scripts chạy, bạn cần xác nhận Google có thể vẫn reach them. Google thường có thể — trouble là trong details.
Điều gì JavaScript SEO là
Lots của các trang xây dựng part (hoặc all) của trang trong của bạn trình duyệt với JavaScript. máy chủ gửi some HTML, và sau đó scripts chạy để fill trong nội dung, load nhiều hơn items, hoặc đổi views không có đầy đủ trang reload. JavaScript SEO là practice của đang làm sure các công cụ tìm kiếm có thể vẫn crawl, render, và chỉ mục đó nội dung.
Ở đây order điều happen trong cho Google:
- Crawl — Google downloads thô HTML của bạn URL.
- Render — Google chạy trang JavaScript trong trình duyệt để xây dựng finished trang ( kết xuất step).
- chỉ mục — Google đọc đó finished trang và files nó away.
Google documents những điều này as three main phases cho processing JavaScript web apps.
Evidence for this claim Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Scope: Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basicsnếu của bạn nội dung chỉ xuất hiện sau khi JavaScript chạy, Google có để render trang successfully trước khi nó có thể see nó. phần lớn của time nó làm. Khi nó không, của bạn nội dung có thể âm thầm go bị thiếu từ tìm kiếm.
good news đầu tiên
JavaScript không phải bad cho SEO. Google chạy an lên-để-date version of Chrome và có thể execute đó giống nhau JavaScript của bạn khách truy cập làm. Đó old fear — “Google can’t read JavaScript” (bản dịch) «Google không thể đọc JavaScript» — chỉ không đúng anymore.
Điều gì có thể go sai là nhiều hơn cụ thể:
- của bạn nội dung cần nhấp hoặc scroll để load, và Google không nhấp hoặc scroll. Evidence for this claim Google Search does not interact with a page, so lazy-loaded content should load when it becomes visible in the viewport rather than requiring user interaction. Scope: Google Search's documented rendering behavior for lazy-loaded content; other crawlers can behave differently. Confidence: high · Verified: Google Search Central: Fix lazy-loaded content
- của bạn links không phải thực links (họ’re buttons hoặc nhấp handlers), so Google có thể’t follow them. Evidence for this claim Google can reliably discover links only when they are HTML anchor elements with an href attribute. Scope: Link discovery by Google Search; this does not claim that every discovered URL will be crawled or indexed. Confidence: high · Verified: Google Search Central: Make your links crawlable
- bạn accidentally blocked của bạn JavaScript hoặc CSS files trong
robots.txt, so Google có thể’t render trang properly. - trang looks fine trong của bạn trình duyệt, nhưng nội dung không bao giờ hiển thị lên trong Google được kết xuất view.
đơn giản checklist
- So sánh của bạn thô HTML (right-nhấp → View Nguồn) với được kết xuất HTML (Google Search Console’s URL Inspection tool). nếu quan trọng nội dung là bị thiếu từ được kết xuất view, đó của bạn vấn đề.
- hãy đảm bảo links là thực
<a href>links, không nhấp handlers on<div>. - không block của bạn JavaScript hoặc CSS files trong
robots.txt. - nếu feature cần nhấp hoặc scroll để load nội dung, hãy đảm bảo đó nội dung là cũng reachable some khác way.
- cho nội dung đó absolutely phải xếp hạng, ưu tiên máy chủ-side kết xuất hoặc static/prerendered xây dựng, nơi nội dung là đã trong thô HTML.
Muốn deeper version — thực thất bại modes, infinite-scroll trap đó nhận hai các trang được lập chỉ mục as một, và Cách kiểm thử được kết xuất HTML? Chuyển để Nâng cao tab. cho Cách Google renderer itself hoạt động và mà kết xuất setup để chọn, see kết xuất trang.
TL;DR — Google có thể chạy của bạn JavaScript, so “can Google read JS?” (bản dịch) «có thể Google đọc JS?» là đó sai câu hỏi. Đó các chế độ lỗi là parity (thô so với. được kết xuất DOM), interaction (Google không scroll hoặc nhấp), state (đó renderer là stateless), và timing. Giữ links as real
<a href>anchors, không block JS/CSS, lazy-load on viewport không interaction, trả về real statuses cho client-side 404s, và remember một thônoindexcó thể ngăn kết xuất trước JavaScript có thể xóa điều này. Combine directives đó đã là thực ra processed, nhưng không assume một universal thô/được kết xuất winner. Watch infinite scroll especially: một tall render viewport có thể trigger đó loader và hợp nhất hai URLs vào một được lập chỉ mục trang. Cho đó renderer internals và mà kết xuất chế độ để pick, see kết xuất.
có thể Google đọc JavaScript? Có — đó không câu hỏi
Three stages run left to right: crawl, render, and index. The render stage branches into four failure modes: parity, where the rendered DOM may not match expectations; interaction, where content requires a scroll or click; state, where content relies on cookies or storage that the renderer clears; and timing, where content is deferred behind slow JavaScript.
© Patrick Stox LLC · CC BY 4.0 ·
Google xử lý JavaScript apps trong three phases: “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” (bản dịch) «Google xử lý JavaScript web apps trong three main phases: 1. Crawling 2. Kết xuất 3. Lập chỉ mục.» Đó middle phase chạy của bạn JS trong an evergreen, headless Chrome để xây dựng đó DOM đó nhận được lập chỉ mục. “Rendering is important because websites often rely on JavaScript to bring content to the page, and without rendering Google might not see that content.” (bản dịch) «Kết xuất là quan trọng vì websites thường rely on JavaScript để bring nội dung để đó trang, và không có kết xuất Google có thể không see đó nội dung.»
Evidence for this claim Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Scope: Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basicsSo Google có thể chạy của bạn JavaScript. hữu ích các câu hỏi là nhiều hơn cụ thể:
- Parity — làm được kết xuất DOM thực ra contain Điều gì bạn think nó làm?
- Interaction — làm bất cứ điều gì require scroll/nhấp Google sẽ không perform?
- State — là bạn relying on cookies/localStorage stateless renderer clears?
- Timing — là cốt yếu nội dung deferred behind chậm hoặc muộn JavaScript?
On timing cụ thể: Google queues một được crawl trang (một đó đã trả về một 200) cho
kết xuất, và “the page may stay on this queue for a few seconds, but it can take
longer than that.” (bản dịch) «đó trang có thể stay on này queue cho vài seconds, nhưng điều này có thể take lâu hơn đó.» có không published fixed delay hoặc timeout — và một trang đó
trả về một non-200 status, hoặc đó bắt đầu out với một noindex directive, có thể skip đó
render queue thay vì chờ cho JavaScript để thay đổi điều này.
mechanics của Cách Google renders — Web Kết xuất Service, statelessness, bộ nhớ đệm, “hai waves” myth — trực tiếp on kết xuất trang. Ở đây I’ll focus on practical các vấn đề và các cách sửa.
Links phải là thực <a href> anchors
Này là đó single hầu hết phổ biến JS-SEO bug. “Google can only discover your links if
they are <a> HTML elements with an href attribute.” (bản dịch) «Google có thể chỉ discover của bạn links nếu they là <một> HTML elements với an href thuộc tính.» MỘT clickable <div> với an
onclick handler là invisible để Google as một link — điều này sẽ không là followed, và các trang
đó phụ thuộc on điều này cho phát hiện có thể go uncrawled. đây là perfectly fine để inject
links với JavaScript, miễn là they end lên as real <a href> anchors trong đó
được kết xuất DOM. Những được kết xuất anchors là parsed sau JavaScript chạy, though —
landing trong đó được kết xuất DOM làm một link discoverable, đây là không một promise đó
URL nhận được crawl, được lập chỉ mục, hoặc treated đó giống nhau as một link present trong đó thô HTML.
Lazy-loaded và interaction-gated nội dung
Đó renderer không behave như một curious người dùng: “Google Search does not interact with your page.” (bản dịch) «Google Search không interact với trang của bạn.» Không scrolling, không clicking, không hovering. So bất kỳ nội dung đó chỉ loads on một of những events sẽ không là seen.
Google hướng dẫn: load nội dung khi điều này enters đó viewport, không khi người dùng acts —
“make sure that your lazy-loading implementation loads all relevant content whenever
it is visible in the viewport,” (bản dịch) «hãy bảo đảm đó của bạn lazy-loading implementation loads all relevant nội dung bất cứ khi nào điều này là visible trong đó viewport,» và “don’t add lazy-loading to content that is
likely to be immediately visible when a user opens a page.” (bản dịch) «không thêm lazy-loading để nội dung đó có khả năng là immediately visible khi một người dùng opens một trang.» Dùng IntersectionObserver
hoặc native loading="lazy" cho images — không bao giờ một scroll hoặc nhấp handler — so đó
nội dung loads during một thông thường render.
Infinite scroll: Khi hai các trang nhận được lập chỉ mục as một
A normal browser viewport stops after the first page, but Google's render viewport expands much taller. The expansion reaches an infinite-scroll trigger, fires the loader without a real user scroll, and appends the next page into the same DOM. Google then indexes both pages' content under one URL.
© Patrick Stox LLC · CC BY 4.0 ·
Đây là một gần như không ai giải thích, và nó worth toàn bộ section.
Googlebot có thể render tại một viewport considerably taller hơn một typical trình duyệt window. Google không publish an chính xác render viewport size — và điều này có thể thay đổi — so không design so với một cụ thể number; kiểm thử của bạn own implementation thay vì. Điều gì matters là đó mechanism: nếu của bạn infinite-scroll loader fires dựa trên scroll position hoặc viewport height, một taller-hơn-dự kiến kết xuất viewport có thể trigger đó loader during kết xuất itself — và đó tiếp theo bài viết hoặc sản phẩm trang nội dung nhận appended vào đó giống nhau DOM. Hiện tại hai distinct URLs’ nội dung đã được kết xuất together, và Google có thể chỉ mục them as một trang. Trong my own experience, “occasionally, two pages get indexed as one” (bản dịch) «occasionally, hai các trang nhận được lập chỉ mục as một» — I’ve đã có các trang reported as “không được lập chỉ mục” đó đã là thực ra được lập chỉ mục as part of một sản phẩm khác trang (thường đó trước đó post trong đó feed), vì “when Google resized the viewport to be longer … it triggered the infinite scroll and loaded another article in when it was rendering.” (bản dịch) «khi Google thay đổi kích thước viewport thành dài hơn … thao tác đó đã kích hoạt infinite scroll và tải thêm một bài viết trong lúc kết xuất.» Xác nhận liệu của bạn own setup làm này by kiểm tra URL Inspection được kết xuất HTML cho một trang bạn’d expect để dừng ngắn — không assume một size và không assume bạn là safe.
có hai layers để getting điều này right.
Làm infinite scroll tìm kiếm-friendly ngay từ đầu. Hỗ trợ paginated loading
underneath đó infinite scroll. Mỗi chunk nên có “its own persistent, unique
URL,” (bản dịch) «của nó own persistent, unique URL,» đó nội dung on mỗi URL nên stay đó giống nhau mỗi time điều này loads, bạn nên
tránh relative parameters như ?date=yesterday, bạn nên “link sequentially to
the individual URLs so that search engines can discover the URLs in a paginated set,” (bản dịch) «link sequentially để đó riêng lẻ URLs so đó các công cụ tìm kiếm có thể discover đó URLs trong một paginated set,»
và khi một new chunk loads on scroll bạn nên “update the displayed URL using the
History API.” (bản dịch) «cập nhật đó displayed URL dùng đó History API.» Dùng real <a href> pagination links và unique URLs — “don’t use URL
fragment identifiers” (bản dịch) «không dùng URL fragment identifiers» (đó part sau một #) cho trang numbers, vì Google bỏ qua
them. As I chẳng hạn trong my JavaScript SEO hướng dẫn, “if you have an infinite scroll setup, I still recommend a
paginated page version so that Google can still crawl properly.” (bản dịch) «nếu bạn có an infinite scroll setup, I vẫn khuyến nghị một paginated trang version so đó Google có thể vẫn crawl properly.»
Nếu một buggy loader là actively merging các trang, đó fastest cách sửa là blunt: “block the JavaScript file that handles the infinite scrolling so the functionality can’t trigger.” (bản dịch) «block đó JavaScript tệp xử lý infinite scroll để chức năng đó không thể’t trigger.» Nếu đó loader không thể chạy during render, điều này không thể append đó tiếp theo trang nội dung, và mỗi URL renders as itself again.
Soft-404s sau khi client-side routing
Single-trang apps có thể đổi nội dung không có thay đổi đó HTTP mã trạng thái, so một
“không tìm thấy” view có thể vẫn trả về 200. Google có thể classify đó phản hồi as một
soft 404 sau evaluating đó đã trả về nội dung, nhưng một static fetch alone không thể prove
đó Google có đã làm đó classification. Hai các cách sửa:
navigate với đó History API, và cho một genuine không-được tìm thấy state either route để một
URL đó trả về một real 404 status hoặc thêm một noindex tag. Và không lean on URL
fragments cho routing — “the AJAX-crawling scheme has been deprecated since 2015, so
you can’t rely on URL fragments to work with Googlebot.” (bản dịch) «đó AJAX-crawling scheme đã được deprecated since 2015, so bạn không thể rely on URL fragments để hoạt động với Googlebot.»
client-side chuyển hướng có giống nhau evidence vấn đề: ban đầu phản hồi có thể vẫn
200 cho đến khi JavaScript chạy. Google hỗ trợ JavaScript các chuyển hướng chỉ as fallback
Khi máy chủ-side hoặc meta-refresh các chuyển hướng không phải có thể. Báo cáo static status
và observed được kết xuất navigation riêng; không rewrite HTTP status trong
audit hoặc call mỗi được kết xuất URL thay đổi chuyển hướng.
không block JavaScript hoặc CSS trong robots.txt
Google sẽ không render JavaScript từ blocked files hoặc on blocked các trang.
robots.txt rule đó disallows của bạn bundle (hoặc /_next/, /static/, /assets/
directory nó lives trong) có thể break kết xuất hoàn toàn — Google fetches shell, có thể’t
chạy scripts, và indexes trang rỗng. kiểm tra URL Inspection trang các tài nguyên
cho bất cứ điều gì blocked.
DOM parity và stage-aware robots directives
So sánh của bạn thô HTML (View Nguồn) so với được kết xuất HTML (URL Inspection). nội dung đó chỉ tồn tại trong được kết xuất HTML vẫn indexes — nếu nó renders. nội dung trong neither không exist để Google.
có một stage-order risk Google documents trực tiếp: “When Google encounters the
noindex tag, it may skip rendering and JavaScript execution, which means using
JavaScript to change or remove the robots meta tag from noindex may not work as
expected.” (bản dịch) «Khi Google encounters đó noindex tag, điều này có thể skip kết xuất và JavaScript execution, mà có nghĩa là dùng JavaScript để thay đổi hoặc xóa đó robots meta tag từ noindex có thể không hoạt động as dự kiến.» Nếu của bạn thô HTML ships an ban đầu noindex bạn meant để đổi out với
JavaScript, Google có thể act on đó thô noindex và không bao giờ chạy đó script đó sẽ
có đã xóa điều này.
Không turn này vào một universal “rendered wins” (bản dịch) «được kết xuất wins» rule. Reconciliation là trường-cụ thể:
| Trường | Điều gì thô/được kết xuất so sánh có thể establish |
|---|---|
| Main nội dung và links | Google có thể sử dụng nội dung và thực <a href> links produced during kết xuất nếu kết xuất succeeds. Thô availability reduces đó dependency. |
| Tiêu đề và mô tả | Google có thể xử lý JavaScript-đặt metadata, nhưng tiêu đề links và snippets là được chọn từ several sources. hiển thị cả hai trạng thái; không claim được kết xuất, đầu tiên, hoặc cuối cùng giá trị là guaranteed. |
| Robots directives | thô noindex có thể nguyên nhân Google để skip kết xuất, so JavaScript removal có thể không bao giờ là seen. Thêm restrictions sau đó không phải evidence đó trước đó restriction là cancelled. |
| Canonical | Google JavaScript hướng dẫn nói không để đặt một giá trị trong nguồn và sau đó thay đổi nó với JavaScript. sử dụng một phương thức và verify một được kết xuất-head declaration. |
| HTTP status và chuyển hướng | JavaScript không thể thay đổi phản hồi status đã nhận. Record static status và bất kỳ observed được kết xuất navigation as tách biệt facts. |
đó matrix là Vì sao auditor nên giữ nguồn, được kết xuất, phản hồi-header, và observed-tìm kiếm state distinct thay vì collapsing them vào một “effective” giá trị.
Pick kết xuất chế độ đó diễn đạt nội dung trong DOM
Hầu hết JS-SEO risk xuất hiện xuống để cách đó HTML là produced. Phiên bản ngắn gọn: SSR, static/prerendering, và hydration all put nội dung trong (hoặc quickly vào) đó DOM, mà reduces cách nhiều của bạn visibility phụ thuộc vào đó renderer succeeding; đầy đủ client-side kết xuất leaves hơn riding on kết xuất completing correctly, on time, mỗi khi. Dynamic kết xuất là một workaround, không một peer option — as of Google hướng dẫn cuối cùng đã cập nhật December 2025, điều này mô tả dynamic kết xuất as một workaround thay vì một dài-term giải pháp và khuyến nghị máy chủ-side kết xuất, static kết xuất, hoặc hydration thay vì. As I put điều này trong my JavaScript SEO hướng dẫn, “any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines.” (bản dịch) «bất kỳ kind of SSR, static kết xuất, và prerendering setup là going để là fine cho các công cụ tìm kiếm.» Đó đầy đủ menu — CSR, SSR, SSG, hydration, ISR, edge, streaming, và dynamic kết xuất — với một trade-off bảng là on đó kết xuất trang. Google riêng mô tả máy chủ-side kết xuất hoặc pre-kết xuất as một good ý tưởng cho người dùng và các crawler. Evidence for this claim Google describes server-side rendering or pre-rendering as a good idea because it makes a website faster for users and crawlers. Scope: Google Search guidance for JavaScript sites; the source does not prescribe one framework or guarantee indexing. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basics
Cách kiểm thử
URL Inspection trong Search Console là nguồn của truth: chạy trực tiếp kiểm thử, sau đó xem xét được kết xuất HTML, screenshot, và trang các tài nguyên / console messages để see Điều gì loaded và Điều gì thất bại. Rich Kết quả Kiểm thử cho nhanh được kết xuất-HTML kiểm tra. Tại quy mô, sử dụng crawler đó executes JavaScript (Ahrefs trang web Audit, Screaming Frog trong JS-kết xuất chế độ) để diff thô so với. được kết xuất trên trang web.
An illustrative page has 1 title in both raw and rendered HTML, 18 headings in raw HTML and 19 rendered, 42 internal links in raw HTML and 71 rendered, 0 product descriptions in raw HTML and 12 rendered, and 6 canonical tags in raw HTML but only 1 rendered. These counts are synthetic.
JavaScript không phải bad Đối với SEO, và nó không evil. nó chỉ khác từ Điều gì nhiều SEOs là được sử dụng để. Hoạt động với của bạn nhà phát triển, nhận của bạn quan trọng nội dung vào DOM, và let Google own tools — không của bạn assumptions — là arbiter của Điều gì được kết xuất.
nơi để go tiếp theo: JavaScript SEO cluster
điều này hub là map. mỗi topic dưới là của nó own deep dive:
Kết xuất và architecture
- SEO cho headless CMS — Cách decoupled frontends ảnh hưởng crawling, kết xuất, metadata, sitemaps, và canonical tags; mà kết xuất chế độ để pick; và headless-cụ thể thất bại modes bạn cần know.
Framework-cụ thể các hướng dẫn
- React SEO — Vì sao CSR-đầu tiên React tạo lập chỉ mục risk, Cách Google renders React apps, React Router và History API, react-helmet-async cho meta tags, và Khi để reach cho tiếp theo.js.
- Angular SEO — Angular SPA defaults,
@angular/ssr(Angular Universal successor), được xây dựng-trong Tiêu đề và Meta services, prerendering, và incremental hydration trong modern Angular. - tiếp theo.js SEO — các trang Router so với App Router, Metadata API,
next/imagevà CWV, ISR timing và Googlebot, sitemaps, và phần lớn phổ biến tiếp theo.js SEO mistakes. - Nuxt SEO — SSR theo mặc định,
useSeoMeta(), Nuxt kết xuất modes,@nuxtjs/seomodule ecosystem, và Cách Nuxt compares để đơn giản Vue cho indexability. - Vue SEO — Vue 3’s CSR default và Điều gì đó có nghĩ là cho các crawler,
createWebHistory(),@unhead/vue, prerendering options không có meta-framework, và Khi Nuxt là right call. - Svelte SEO — Svelte so với SvelteKit, SSR theo mặc định trong SvelteKit,
<svelte:head>,adapter-static+ssr: falsetrap, adapter choices, và AI crawler implications. - Astro SEO — zero-JS theo mặc định, islands architecture,
@astrojs/sitemap,astro:assets, View Transitions và History API, máy chủ Islands fallback behavior, và Astro Core Web Vitals advantages.
AI summary
condensed take on Nâng cao version:
- “Can Google read JS?” (bản dịch) «Có thể Google đọc JS?» là đó sai câu hỏi — điều này có thể. Đó các chế độ lỗi là parity (thô so với. được kết xuất), interaction (Google không scroll/nhấp), state (stateless renderer), và timing.
- Timing có không fixed delay — Google queues một
200trang cho kết xuất và có thể chờ “a few seconds” (bản dịch) «vài seconds» hoặc lâu hơn, với không published timeout; một non-200 status hoặc an ban đầunoindexcó thể skip đó render queue hoàn toàn. - Links phải được real
<a href>anchors —onclickon một<div>là invisible as một link. Injecting links với JS là fine nếu they end lên as anchors, nhưng được kết xuất anchors là parsed sau JS chạy — discoverable, không một crawl/chỉ mục bảo đảm. - Lazy-load on đó viewport, không interaction — Google “does not interact with your page.” (bản dịch) «không interact với trang của bạn.» Dùng IntersectionObserver / native lazy-load; không gate nội dung behind scroll hoặc nhấp.
- Infinite scroll có thể hợp nhất hai các trang vào một — Googlebot có thể render tại một taller
viewport hơn một typical trình duyệt (không chính xác published size — kiểm thử của bạn own setup),
và đó khoảng trống có thể trigger đó loader và append đó tiếp theo trang nội dung. Cách sửa:
paginated URLs + real
<a href>links + History API; nếu một loader là merging các trang, block của nó JS file. - Soft-404s sau client-side routing — trả về một real
404hoặcnoindex; không chỉ mục empty shells; không rely on URL fragments (AJAX-crawling deprecated 2015). - không block JS/CSS trong robots.txt — Google sẽ không render từ blocked files.
noindexcó thể block của nó own removal — Google có thể skip kết xuất khi điều này sees an ban đầunoindex, so JS meant để xóa điều này có thể không bao giờ chạy.- DOM parity + stage order (robots meta tags) — diff thô so với. được kết xuất, nhưng remember
an ban đầu thô
noindexcó thể dừng kết xuất. Apply combination rules chỉ để directives thực ra processed; kiểm thử canonical parity dưới của nó own rules. - Kết xuất chế độ thay đổi dependency, không outcome — SSR/static/prerender/hydration put nội dung trong đó DOM sooner, reducing reliance on kết xuất; đầy đủ CSR relies on điều này hầu hết; dynamic kết xuất là một dated Google workaround, không một peer option. Đầy đủ breakdown on đó kết xuất trang.
- Kiểm thử với URL Inspection (được kết xuất HTML + screenshot + console), Rich Kết quả Kiểm thử, và một JS-kết xuất crawler.
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 — three phases, crawlable links, và kiểm thử được kết xuất HTML.
- khắc phục Tìm kiếm-related JavaScript các vấn đề — soft-404 xử lý, History API, và renderer constraints.
- khắc phục lazy-loaded nội dung — load on viewport (không interaction), và tìm kiếm-friendly infinite scroll.
- Ecommerce pagination và incremental trang loading — unique các URL,
<a href>links, và Vì sao Google bỏ qua fragment identifiers. - 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
- bingbot Series: JavaScript, Dynamic Kết xuất, và Cloaking. Oh My! — Bing take on kết xuất JS và dynamic kết xuất.
Quotes từ nguồn
On—record statements từ Google (plus một vài từ my own writing). mỗi tìm kiếm-engine link là deep link đó jumps để quoted passage on nguồn trang.
Google — kết xuất & links
- “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” (bản dịch) «Google xử lý JavaScript web apps trong three main phases: 1. Crawling 2. Kết xuất 3. Lập chỉ mục.» Nhảy đến trích dẫn
- “Google can only discover your links if they are <a> HTML elements with an href attribute.” (bản dịch) «Google có thể chỉ discover của bạn links nếu they là <một> HTML elements với an href thuộc tính.» Nhảy đến trích dẫn
- “Rendering is important because websites often rely on JavaScript to bring content to the page, and without rendering Google might not see that content.” (bản dịch) «Kết xuất là quan trọng vì websites thường rely on JavaScript để bring nội dung để đó trang, và không có kết xuất Google có thể không see đó nội dung.» Nhảy đến trích dẫn
- “The page may stay on this queue for a few seconds, but it can take longer than that.” (bản dịch) «Đó trang có thể stay on này queue cho vài seconds, nhưng điều này có thể take lâu hơn đó.» — on render-queue timing, không fixed delay published. Nhảy đến trích dẫn
- “When Google encounters the noindex tag, it may skip rendering and JavaScript execution, which means using JavaScript to change or remove the robots meta tag from noindex may not work as expected.” (bản dịch) «Khi Google encounters đó noindex tag, điều này có thể skip kết xuất và JavaScript execution, mà có nghĩa là dùng JavaScript để thay đổi hoặc xóa đó robots meta tag từ noindex có thể không hoạt động as dự kiến.» Nhảy đến trích dẫn
Google — interaction, lazy-load & infinite scroll
- “Google Search does not interact with your page.” (bản dịch) «Google Search không interact với trang của bạn.» Nhảy đến trích dẫn
- “…loads all relevant content whenever it is visible in the viewport.” (bản dịch) «…loads all relevant nội dung bất cứ khi nào điều này là visible trong đó viewport.» Nhảy đến trích dẫn
- “Give each chunk its own persistent, unique URL.” (bản dịch) «Cho mỗi chunk của nó own persistent, unique URL.» — tìm kiếm-friendly infinite scroll. Nhảy đến trích dẫn
- “Don’t use URL fragment identifiers (the text after a # in a URL) for page numbers in a collection. Google ignores fragment identifiers.” (bản dịch) «không dùng URL fragment identifiers (đó text sau một # trong một URL) cho trang numbers trong một collection. Google bỏ qua fragment identifiers.» Nhảy đến trích dẫn
Google — soft-404 & routing
- “We recommend using the History API to load different views.” (bản dịch) «We khuyến nghị dùng đó History API để load khác nhau views.» Nhảy đến trích dẫn
Patrick Stox (my own hoạt động — JavaScript SEO: Definitive Hướng dẫn)
- On meta robots tags cụ thể: “With meta robots tags, Google is always going to take the most restrictive option it sees — no matter the location… Google will choose the most restrictive statements between HTML and the rendered version of a page.” (bản dịch) «Với meta robots tags, Google là luôn going để take đó hầu hết restrictive option điều này sees — không quan trọng đó location… Google sẽ chọn đó hầu hết restrictive statements giữa HTML và đó được kết xuất version of một trang.»
- “If you have an infinite scroll setup, I still recommend a paginated page version so that Google can still crawl properly.” (bản dịch) «Nếu bạn có an infinite scroll setup, I vẫn khuyến nghị một paginated trang version so đó Google có thể vẫn crawl properly.»
- On đó hợp nhất: “occasionally, two pages get indexed as one” (bản dịch) «occasionally, hai các trang nhận được lập chỉ mục as một» — gây ra khi “Google resized the viewport to be longer … it triggered the infinite scroll and loaded another article in when it was rendering.” (bản dịch) «Google thay đổi kích thước viewport thành dài hơn … thao tác đó đã kích hoạt infinite scroll và tải thêm một bài viết trong lúc kết xuất.» Đó cách sửa: “block the JavaScript file that handles the infinite scrolling so the functionality can’t trigger.” (bản dịch) «block đó JavaScript tệp xử lý infinite scroll để chức năng đó không thể’t trigger.»
JavaScript-SEO checklist
nhanh truyền để xác nhận Google có thể render và chỉ mục của bạn JS-phụ thuộc nội dung:
- quan trọng nội dung xuất hiện trong được kết xuất HTML (kiểm tra URL Inspection, không chỉ View Nguồn).
- Links là thực
<a href>anchors — khôngonclickhandlers on<div>/<span>. - JavaScript và CSS files là không blocked trong
robots.txt. - Không có nội dung là gated behind nhấp, scroll, hoặc hover (Google không
interact); lazy-load on viewport qua IntersectionObserver hoặc
loading="lazy". - Trên—fold nội dung là không lazy-loaded.
- Robots directives match giữa thô và được kết xuất HTML (không JS injecting
noindex) — Google takes phần lớn restrictive. - Client-side route thay đổi đó hit bị thiếu tài nguyên trả về thực
404hoặcnoindex(không soft-404 shells). - Infinite scroll có paginated version với unique
<a href>các URL và History API cập nhật — và không phải merging các trang tại tall viewport. - nội dung đó phải xếp hạng dùng SSR / static / prerendering, không đầy đủ CSR (see kết xuất trang).
- bạn’ve spot-checked được kết xuất screenshot và console các lỗi trong URL Inspection trực tiếp kiểm thử.
mental models
1. “Can Google run my JS?” (bản dịch) «Có thể Google chạy my JS?» là đó sai câu hỏi. Điều này có thể. Đó real các câu hỏi là về parity, interaction, state, và timing:
- Parity — làm đó được kết xuất DOM contain điều gì bạn think điều này làm?
- Interaction — làm bất cứ điều gì require một scroll/nhấp Google sẽ không perform?
- State — là bạn relying on cookies/localStorage đó stateless renderer clears?
- Timing — là cốt yếu nội dung deferred behind chậm/muộn JS?
2. nếu nó không trong được kết xuất DOM, nó không exist. View Nguồn hiển thị thô HTML; URL Inspection hiển thị được kết xuất DOM. chỉ mục decisions là đã làm on được kết xuất DOM — so đó artifact để kiểm tra, mỗi time.
3. thực links hoặc không links.
Phát hiện rides on <a href> anchors. Nhấp handlers, buttons, và JS navigation đó
không bao giờ produces anchor là dead ends cho crawling.
4. Design cho bot đó không bao giờ touches trang. Không scroll, không nhấp, không hover. nếu nội dung cần hành động để xuất hiện, assume Google sẽ không see nó — load nó on viewport thay vì.
5. Kiểm thử cho tall-viewport trap trong infinite scroll. Googlebot có thể render tại viewport taller hơn typical trình duyệt (không fixed size là published, so không design so với cụ thể number), so scroll/height-triggered loader có thể fire during render và hợp nhất tiếp theo trang trong. Design cho nó: paginated các URL + thực links + History API; nếu nó actively merging, block loader JS.
6. Let đó tools arbitrate. Trình duyệt của bạn không phải Googlebot. URL Inspection được kết xuất HTML, screenshot, và console là đó nguồn of truth — không “it looks fine on my machine.” (bản dịch) «điều này looks fine on my machine.»
JavaScript-SEO gotchas — bảng tra nhanh
| Điều | Điều gì thực ra happens |
|---|---|
robots.txt chặn của bạn JS/CSS | Google sẽ không render từ blocked files — có thể break toàn bộ trang |
Thô index + JS-injected noindex | Google obeys phần lớn restrictive → noindex wins |
Link as onclick on <div> | không discoverable — phải là <a href> |
| nội dung loads on scroll/nhấp | không loaded — Google không interact; sử dụng viewport lazy-load |
URL fragment (#page=2) cho pagination | Đã bỏ qua — sử dụng thực unique URL |
Client-side 404 với 200 status | Soft-404 risk — trả về thực 404 hoặc noindex |
| Infinite scroll tại tall viewport | có thể hợp nhất hai các URL vào một được lập chỉ mục trang — paginate + block loader nếu needed |
Mà kết xuất chế độ? (dependency on kết xuất succeeding)
| Chế độ | Dependency |
|---|---|
| Static / prerender (SSG) | Lowest — nội dung là đã trong HTML |
| máy chủ-side kết xuất (SSR) | Thấp — nội dung là trong HTML theo yêu cầu |
| Hydration (isomorphic) | Thấp — nội dung lands trong DOM quickly |
| đầy đủ client-side kết xuất (CSR) | Highest — nội dung chỉ tồn tại sau khi kết xuất succeeds |
| Dynamic kết xuất | Workaround chỉ — Google calls điều này stopgap, không khắc phục |
điều này không phải bảo đảm của outcome — SSR/SSG/hydration vẫn cần để render correctly và truyền mỗi khác kiểm tra trong điều này bài viết. đầy đủ breakdown (ISR, edge, streaming, dynamic kết xuất, và trade-offs) on kết xuất trang.
See Điều gì Googlebot sees
Kết xuất bugs hide trong khoảng trống giữa thô HTML (Điều gì máy chủ gửi) và được kết xuất HTML (Điều gì tồn tại sau khi JS chạy). một vài nhanh command-line kiểm tra trước khi bạn reach cho đầy đủ crawler.
Fetch thô HTML (Điều gì xuất hiện lại trước khi bất kỳ JS chạy)
macOS / Linux:
# Raw HTML as the server sends it — this is the "first fetch"
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
https://example.com/page/ -o raw.html
# Is your important text actually in the raw HTML? (empty result = JS-dependent)
grep -o "Your headline text" raw.htmlWindows (PowerShell):
$ua = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Invoke-WebRequest -Uri "https://example.com/page/" -UserAgent $ua -OutFile raw.html
Select-String -Path raw.html -Pattern "Your headline text"Nếu đó text là bị thiếu từ raw.html nhưng visible trong trình duyệt của bạn, đây là đang đã thêm
by JavaScript — so điều này phụ thuộc vào kết xuất. (Cho đó được kết xuất HTML, dùng URL
Inspection “View Crawled Page → rendered HTML,” (bản dịch) «View Được crawl Trang → được kết xuất HTML,» hoặc một headless-Chrome crawler — một
đơn giản curl không thể chạy JS.)
xác nhận bạn không phải blocking JS/CSS trong robots.txt
macOS / Linux:
curl -sL https://example.com/robots.txt | grep -iE "disallow.*\.(js|css)|Disallow:\s*/(_next|static|assets|dist)"Windows (PowerShell):
(Invoke-WebRequest "https://example.com/robots.txt").Content |
Select-String -Pattern "Disallow.*\.(js|css)","Disallow:\s*/(_next|static|assets|dist)"Disallow đó matches của bạn JavaScript hoặc CSS có nghĩ là Google có thể’t render trang
properly — gần như luôn mistake. (URL Inspection lists blocked trang các tài nguyên cũng;
grep chỉ catches obvious ones fast.)
Tools cho gỡ lỗi JavaScript SEO
See khác biệt giữa thô HTML và Điều gì Google renders với Render Khoảng trống:
- Paste đầy đủ URL của trang bạn muốn để kiểm thử — JavaScript-nặng template trang hiển thị phần lớn.
- Clear anti-abuse kiểm tra và press Kiểm thử trang; nó fetches thô HTML đầu tiên và chỉ renders trong headless Chrome Khi đó HTML looks như rỗng shell.
- đọc colour-coded verdict, sau đó scan Ban đầu HTML so với Được kết xuất DOM bảng cho các hàng flagged changed.
- Chuyển để Thô so với được kết xuất diff tab để see line-by-line Điều gì JavaScript đã thêm hoặc đã xóa.
- URL Inspection (Google Search Console) — nguồn của truth. Chạy trực tiếp kiểm thử, sau đó view được kết xuất HTML, screenshot, trang các tài nguyên (Điều gì loaded so với. Điều gì là blocked), và JavaScript console messages.
- Rich Kết quả Kiểm thử — fast way để kiểm tra được kết xuất HTML và dữ liệu có cấu trúc cho URL không có verifying trang web.
- Chrome DevTools — so sánh View Nguồn (thô HTML) với Elements panel (được kết xuất DOM); Console surfaces JS các lỗi đó có thể blank out nội dung.
- JavaScript-kết xuất các crawler — Ahrefs trang web Audit và Screaming Frog SEO Spider (JS-kết xuất chế độ) execute JS so Bạn có thể diff thô so với. được kết xuất tại quy mô.
- View-được kết xuất-nguồn tools — trình duyệt extensions đó hiển thị được kết xuất DOM side-by-side với thô HTML cho nhanh spot kiểm tra.
- máy chủ log analysis — xác nhận Googlebot là thực ra fetching của bạn JS/CSS các tài nguyên (see log file analysis).
Prompts cho JavaScript SEO diagnosis
So sánh thô và được kết xuất HTML
Paste thô phản hồi và được kết xuất DOM cho giống nhau URL. Xóa customer dữ liệu và tokens đầu tiên.
Act as a technical SEO reviewer. Compare RAW_HTML and RENDERED_HTML below. Report only
meaningful differences in title, meta robots, canonical, headings, body copy,
structured data, and crawlable <a href> links. For each difference, label its likely
indexing impact, show the exact conflicting snippets, and give a verification step.
Do not infer content that is not present.
RAW_HTML:
[paste]
RENDERED_HTML:
[paste]Triage route sample
Review this CSV of JavaScript routes with columns URL, HTTP_STATUS, RAW_TITLE,
RENDERED_TITLE, RAW_CANONICAL, RENDERED_CANONICAL, RAW_WORDS, RENDERED_WORDS. Group
failures into shared-shell duplicates, restrictive-directive conflicts, soft 404s,
and likely render timeouts. Rank groups by affected URL count. Return the exact rows
that support each conclusion and a test to confirm it; do not invent thresholds.
[paste CSV] Validate JavaScript SEO thay đổi
Prove route nội dung tồn tại trước khi JavaScript
Kiểm thử để chạy: Fetch representative routes với curl và inspect phản hồi
thân phản hồi. Dự kiến kết quả: mỗi phản hồi contains của nó unique tiêu đề, chính heading,
copy, và crawlable links. thất bại interpretation: deployment vẫn phục vụ
shared app shell. Monitoring window: Immediate. Rollback trigger: formerly
máy chủ-visible route becomes phụ thuộc on kết xuất.
Prove directives agree trên processing stages
Kiểm thử để chạy: So sánh thô HTML với URL Inspection được kết xuất HTML cho robots và
canonical tags. Dự kiến kết quả: Một dự kiến directive đặt xuất hiện trong cả hai, với
không nhiều hơn-restrictive giá trị trong thô shell. thất bại interpretation: JavaScript là
trying để overwrite lập chỉ mục tín hiệu cũng muộn. Monitoring window: Immediate trong
local kết xuất; sau khi recrawl trong Search Console. Rollback trigger: noindex hoặc
không đúng canonical xuất hiện tại either stage.
Prove links vẫn crawlable
Kiểm thử để chạy: Disable JavaScript và inspect navigation để representative routes.
Dự kiến kết quả: Destinations vẫn trong thực anchor href các thuộc tính. thất bại
interpretation: Client handlers, không links, own phát hiện. Monitoring window:
Immediate. Rollback trigger: quan trọng routes disappear từ link graph Khi
scripts fail.
các tài nguyên worth của bạn time
My related writing
- JavaScript SEO: Definitive Hướng dẫn — my đầy đủ hướng dẫn để kết xuất, DOM parity, phần lớn-restrictive-directive rule, infinite scroll, và hai-các trang-as-một vấn đề. điều này bài viết là condensed, nguồn-linked version.
- Người mới bắt đầu Hướng dẫn để kỹ thuật SEO — nơi 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ừ others
- r/TechSEO — community cho gỡ lỗi render/chỉ mục các vấn đề.
- web.dev — Kết xuất on Web — canonical explainer của kết xuất trade-offs từ Chrome team.
- Google Search Central — JavaScript SEO — chính thức chính-nguồn tài liệu on three-phase xử lý, crawlable links, và kiểm thử được kết xuất HTML.
- Onely — JavaScript SEO hub — deep kỹ thuật posts on kết xuất, hai-waves lập chỉ mục, và JS SEO auditing từ specialist agency.
- Martin Splitt JavaScript SEO playlist — chính thức Google video series walking qua mỗi JS SEO concept, produced by Google web ecosystem team.
- công cụ tìm kiếm Journal — JavaScript SEO coverage — ngành news và practitioner các hướng dẫn on JS kết xuất các vấn đề as họ emerge.
Podcasts
- Tìm kiếm Off Record (Google Search Relations) — Martin Splitt, John Mueller, và Gary Illyes regularly cover JavaScript SEO và kết xuất từ bên trong. Listen
Videos
- Google Search Central (YouTube) — Martin Splitt JavaScript SEO series là best chính thức video walkthrough của Cách Google xử lý của bạn JS. Channel
Số liệu worth citing
- Hiện tại chính thức cách diễn đạt: không fixed delay. Google own tài liệu (đã cập nhật
2026-03-04) says một được crawl
200trang “may stay on this queue for a few seconds, but it can take longer than that” (bản dịch) «có thể stay on này queue cho vài seconds, nhưng điều này có thể take lâu hơn đó» — có không published fixed delay hoặc timeout, và các trang đó trả về một non-200 status hoặc bắt đầu out vớinoindexcó thể skip kết xuất hoàn toàn. Nhảy đến trích dẫn - Lịch sử dữ liệu point (dated) — ~5 second median render delay. Trong trước đó conference remarks, Google nhân viên (Martin Splitt và Tom Greenaway) described các trang reaching đó renderer tại một median of ~5 seconds, với đó 90th percentile trong minutes — không đó “weeks” đó old fear implied. I cite này trong my JavaScript SEO hướng dẫn. Treat điều này as một lịch sử dữ liệu point từ đó talk, không một hiện tại published chỉ số — Google hasn’t republished điều này as an ongoing hình, và đó queue-timing quote trên là đó hiện tại chính thức cách diễn đạt.
- “Two waves of indexing” (bản dịch) «Hai waves of lập chỉ mục» là fading, theo Martin Splitt (2019 remarks). Trong an August 2019 conversation với John Mueller, Splitt đã nói hai-wave lập chỉ mục “play[s] less and less of a role” (bản dịch) «play[s] ít hơn và ít hơn of một role» as kết xuất nhận cheaper và crawling, kết xuất, và lập chỉ mục converge — với không timeline được cho khi điều này có thể dừng hoàn toàn. Coverage Này là Splitt characterization từ đó cụ thể conversation, không một dated, citable Google spec — dùng điều này as directional context, không một hiện tại bảo đảm either way.
Make rendering an architecture decision before launch: if revenue pages depend on JavaScript for primary content or links, verify what search engines receive instead of assuming the browser experience is enough.
- Client-side rendering, interaction-gated content, and nonstandard links are structural risks that cost more to correct after launch.
- Raw-versus-rendered parity testing shows whether important content, links, and status signals survive the crawl, render, and index process.
- Server-rendered or static primary content with JavaScript used only for enhancement may require no special remediation.
A short, template-level diagnostic before a build or replatform can prevent later re-architecture and focus spending on the routes with organic traffic at risk.
Rủi ro nếu bỏ qua: Search engines may miss primary content, interaction-gated elements, or internal links, leaving revenue pages under-indexed even though they work for users in a browser.
Hỏi nhóm của bạn: What do our top revenue templates return before JavaScript runs, and have we verified their content and links in rendered output before release?
Google xử lý JavaScript apps qua crawling, kết xuất, và lập chỉ mục.
Evidence for this claim Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Scope: Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basics nó generally crawl links Khi họ
là anchors với href các thuộc tính. Evidence for this claim Google can reliably discover links only when they are HTML anchor elements with an href attribute. Scope: Link discovery by Google Search; this does not claim that every discovered URL will be crawled or indexed. Confidence: high · Verified: Google Search Central: Make your links crawlable
Google mô tả máy chủ-side kết xuất hoặc pre-kết xuất as good ý tưởng cho người dùng và
các crawler. Evidence for this claim Google describes server-side rendering or pre-rendering as a good idea because it makes a website faster for users and crawlers. Scope: Google Search guidance for JavaScript sites; the source does not prescribe one framework or guarantee indexing. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basics Google Search cũng
không interact với trang để trigger nội dung. Evidence for this claim Google Search does not interact with a page, so lazy-loaded content should load when it becomes visible in the viewport rather than requiring user interaction. Scope: Google Search's documented rendering behavior for lazy-loaded content; other crawlers can behave differently. Confidence: high · Verified: Google Search Central: Fix lazy-loaded content
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 27 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.
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.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.