SEO JavaScript
Jak Upewnij się wyszukiwarki może crawlowanie, renderować, i indeks Treści zależne od JavaScript — prawdziwe linki, parity, lazy-loading, infinite scroll, soft-404s, i testing.
Języki
1 sygnał dowodowy na tej stronie
- Powiązane działające narzędzieRaw vs. Rendered HTML Checker
SEO JavaScript jest o whether wyszukiwarki może crawlowanie, renderować, i indeks treść że depends na JavaScript. Google może uruchamiać JS — the awaria modes są więcej konkretny: parity (raw vs wyrenderowany), interaction (Google nie scroll lub click), state (the renderer jest stateless), i timing. Keep linki jako rzeczywisty anchors, Nie block JS/CSS, prefer SSR/prerendering dla treść że musi rank, i watch infinite scroll — a tall renderować viewport może uzyskać dwa strony zindeksowany jako jeden.
TL;DR — SEO JavaScript jest o jeden question: może wyszukiwarki widzieć twój treść? Modern witryny build a lot z strona w przeglądarce z JavaScript. Jeśli twój ważny text i linki tylko pokazywać up po scripts uruchamiać, ty trzeba confirm Google nadal może reach them. Google zwykle może — the trouble jest w details.
Co SEO JavaScript jest
Lots z witryny build part (lub wszystkie) z strona w twój przeglądarka z JavaScript. The serwer wysyła niektóre HTML, a następnie scripts uruchamiać do fill w treść, load więcej items, lub swap views bez pełnego przeładowania strony. SEO JavaScript jest the practice z making sure wyszukiwarki nadal może crawlowanie, renderować, i indeks że treść.
Here’s the order things happen w dla Google:
- Crawlowanie — Google downloads the surowy HTML z twój URL.
- Renderować — Google uruchamia strona’s JavaScript w a przeglądarka do build the finished strona (the rendering step).
- Indeks — Google czyta że finished strona i pliki do away.
Google documents te jako the trzy main phases dla 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 basicsJeśli twój treść tylko appears po JavaScript uruchamia, Google musi renderować strona successfully przed do może widzieć do. Most z time do does. Gdy do nie, twój treść może quietly go missing z search.
Dobra wiadomość pierwszy
JavaScript jest nie zły dla SEO. Google uruchamia an up-do-date version z Chrome i może execute do samo JavaScript twój visitors do. The stary fear — “Google może’t czytać JavaScript” — just isn’t true anymore.
Co może go błędny jest więcej konkretny:
- Twój treść potrzebuje a click lub a scroll do load, i Google nie click lub 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
- Twój linki aren’t prawdziwe linki (oni’re buttons lub click handlers), więc Google może’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
- Ty accidentally blocked twój JavaScript lub CSS pliki w
robots.txt, więc Google może’t renderować strona properly. - Strona wygląda fine w twój przeglądarka, ale the treść never pokazuje up w Google’s wyrenderowany view.
The prosty checklist
- Compare twój surowy HTML (właściwy-click → View Źródło) z wyrenderowany HTML (Google Search Console’s URL Inspection narzędzie). Jeśli ważny treść jest missing z the wyrenderowany widok, że’s twój problem.
- Upewnij się linki są rzeczywisty
<a href>linki, nie click handlers na a<div>. - Nie block twój JavaScript lub CSS pliki w
robots.txt. - Jeśli a feature potrzebuje a click lub scroll do load treść, Upewnij się że treść jest także reachable niektóre other way.
- Dla treść że absolutely musi rank, prefer renderowanie po stronie serwera lub a statyczny/prerendered build, gdzie the treść jest już w surowy HTML. 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
Want the deeper version — the rzeczywisty awaria modes, the infinite-scroll trap że otrzymuje dwa strony zindeksowany jako jeden, i Jak test wyrenderowany HTML? Switch do Advanced tab. Dla jak Google’s renderer itself działa i który renderowanie setup do choose, widzieć the rendering strona.
TL;DR — Google może uruchamiać twój JavaScript, więc “może Google czytać JS?” jest the błędny question. The awaria modes są parity (raw vs. wyrenderowany DOM), interaction (Google nie scroll lub click), state (the renderer jest stateless), i timing. Keep linki jako rzeczywisty
<a href>anchors, Nie block JS/CSS, lazy-load na viewport nie interaction, zwracać rzeczywisty statuses dla klient-side 404s, i remember a rawnoindexmay prevent renderowanie przed JavaScript może remove do. Combine directives że przezły faktycznie processed, ale nie assume a universal raw/wyrenderowany winner. Watch infinite scroll zwłaszcza: a tall renderować viewport może trigger the loader i merge dwa URLs do jeden zindeksowany strona. Dla renderer internals i który renderowanie mode do pick, widzieć rendering.
Może Google czytać JavaScript? Tak — że’s nie the question
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 processes JavaScript apps w trzy phases: “Google processes JavaScript web apps w trzy main phases: 1. Crawlowanie 2. Renderowanie 3. Indeksowanie.” The middle phase uruchamia twój JS w an evergreen, headless Chrome do build the DOM że otrzymuje zindeksowany. “Renderowanie jest ważny ponieważ websites często rely na JavaScript do bring treść do strona, i bez renderowanie Google might nie widzieć że treść.”
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 basicsWięc Google może uruchamiać twój JavaScript. The useful questions są więcej konkretny:
- Parity — does the wyrenderowany DOM faktycznie contain co ty think do does?
- Interaction — does anything require a scroll/click Google won’t perform?
- State — są ty relying na cookies/localStorage the stateless renderer clears?
- Timing — jest critical treść deferred behind slow lub late JavaScript?
Na timing specifically: Google queues a crawled strona (jeden że returned a 200) dla
renderowanie, i “strona may stay na ten queue dla a few seconds, ale do może podejmować
longer niż że.” There’s nie published fixed delay lub timeout — i strona że
zwraca a non-200 status, lub że starts out z a noindex directive, może skip the
renderować queue rather niż wait dla JavaScript do change do.
The mechanics z jak Google renders — the Web Renderowanie Service, statelessness, caching, the “dwa waves” myth — działający na rendering strona. Here I’ll focus na practical problemy i fixes.
Linki musi przezć rzeczywisty <a href> anchors
Ten jest the single most wspólny JS-SEO bug. “Google może tylko odkrywać twój linki jeśli
oni są <a> HTML elements z an href attribute.” A clickable <div> z an
onclick handler jest invisible do Google jako a link — do won’t przezć followed, i strony
że depend na do dla discovery może go uncrawled. Do’s perfectly fine do inject
linki z JavaScript, jako long jako oni end up jako rzeczywisty <a href> anchors w
wyrenderowany DOM. Te wyrenderowany anchors są parsed po JavaScript uruchamia, though —
landing w wyrenderowany DOM sprawia a link discoverable, do’s nie a promise że the
URL otrzymuje crawled, zindeksowany, lub treated do samo jako a link present w surowy HTML.
Lazy-loaded i interaction-gated treść
The renderer nie behave like a curious user: “Google Search nie interact z twoja strona.” Nie scrolling, nie clicking, nie hovering. Więc dowolny treść że tylko loads na jeden z te events won’t przezć seen.
Google’s guidance: load treść gdy do enters the viewport, nie gdy the user acts —
“Upewnij się że twój lazy-loading implementation loads wszystkie relevant treść whenever
do jest visible w viewport,” i “Nie add lazy-loading do treść że jest
likely do przezć immediately visible gdy a user opens strona.” Używać IntersectionObserver
lub native loading="lazy" dla images — never a scroll lub click handler — więc the
treść loads podczas a normal renderować.
Infinite scroll: gdy dwa strony uzyskać zindeksowany jako jeden
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 ·
Ten jest the jeden almost nobody explains, i do’s worth the whole section.
Googlebot może renderować w a viewport considerably taller niż a typical przeglądarka window. Google nie publish an dokładny renderować viewport size — i do może change — więc Nie design against a konkretny number; test twój own implementation zamiast. Co matters jest the mechanism: jeśli twój infinite-scroll loader fires based na scroll position lub viewport height, a taller-niż-expected renderowanie viewport może trigger the loader podczas renderowanie itself — i next article lub product strona’s treść otrzymuje appended do do samo DOM. Now dwa distinct URLs’ treść has been wyrenderowany together, i Google może indeks them jako jeden strona. W my own experience, “occasionally, dwa strony uzyskać zindeksowany jako jeden” — I’ve had strony reported jako “nie zindeksowany” że przezły faktycznie zindeksowany jako part z another strona (zwykle the previous post w feed), ponieważ “gdy Google resized the viewport do przezć longer … do triggered the infinite scroll i loaded another article w gdy do przezł renderowanie.” Confirm whether twój own setup does ten przez checking URL Inspection’s wyrenderowany HTML dla strona ty’d expect do stop short — Nie assume a size i Nie assume ty’re safe.
Są dwa layers do getting ten właściwy.
Sprawić infinite scroll search-friendly w pierwszy place. Support paginated loading
underneath the infinite scroll. Każdy chunk należy have “jego own persistent, unique
URL,” the treść na każdy URL należy stay do samo każdy time do loads, Należy
avoid relative parameters like ?date=yesterday, Należy “link sequentially do
the individual URLs więc że wyszukiwarki może odkrywać the URLs w a paginated set,”
i gdy a nowy chunk loads na scroll Należy “update the displayed URL używając the
History API.” Używać rzeczywisty <a href> pagination linki i unique URLs — “Nie używać URL
fragment identifiers” (the part po a #) dla strona numbers, ponieważ Google ignores
them. Jako I say w my JavaScript SEO guide, “jeśli ty have an infinite scroll setup, I nadal recommend a
paginated strona version więc że Google nadal może crawlowanie properly.”
Jeśli a buggy loader jest actively merging strony, the fastest fix jest blunt: “block the JavaScript plik że handles the infinite scrolling więc the functionality może’t trigger.” Jeśli the loader może’t uruchamiać podczas renderować, do może’t append the next strona’s treść, i każdy URL renders jako itself again.
Soft-404s po klient-side routing
Single-strona apps może swap treść bez changing the HTTP status code, więc a
“nie found” view nadal może zwracać 200. Google may classify że odpowiedź jako a
soft 404 po evaluating the returned treść, ale a statyczny fetch alone nie może prove
że Google has zrobiony że classification. Dwa fixes:
navigate z History API, i dla a genuine nie-found state either route do a
URL że zwraca a rzeczywisty 404 status lub add a noindex tag. I Nie lean na URL
fragments dla routing — “the AJAX-crawlowanie scheme has been deprecated since 2015, więc
Możesz’t rely na URL fragments do działać z Googlebot.”
A klient-side redirect musi samo evidence problem: the initial odpowiedź może remain
200 until JavaScript uruchamia. Google supports JavaScript redirects only as a fallback
gdy serwer-side lub meta-refresh redirects są nie possible. Report the statyczny status
i observed wyrenderowany navigation separately; nie rewrite the HTTP status w
audit lub wywołanie każdy wyrenderowany URL change a redirect.
Nie block JavaScript lub CSS w robots.txt
Google won’t renderować JavaScript z blocked pliki lub na blocked strony. A
robots.txt reguła że disallows twój bundle (lub /_next/, /static/, /assets/
directory do lives w) może break renderowanie entirely — Google fetches the shell, może’t
uruchamiać the scripts, i indexes an empty strona. Check URL Inspection’s strona zasoby
dla anything blocked.
DOM parity i stage-aware robots directives
Compare twój surowy HTML (View Źródło) against the wyrenderowany HTML (URL Inspection). Treść że tylko exists w wyrenderowany HTML nadal indexes — jeśli do renders. Treść w neither nie exist do Google.
There’s jeden stage-order ryzyko Google documents directly: “Gdy Google encounters the
noindex tag, do may skip renderowanie i JavaScript execution, który means używając
JavaScript do change lub remove the robots znacznik meta z noindex may nie działać jako
expected.” Jeśli twój surowy HTML ships an initial noindex ty meant do swap out z
JavaScript, Google może act na że raw noindex i never uruchamiać the script że przez
have removed do.
Nie turn ten do a universal “wyrenderowany wins” reguła. Reconciliation jest field-konkretny:
| Field | Co the raw/wyrenderowany comparison może establish |
|---|---|
| Main treść i linki | Google może używać treść i rzeczywisty <a href> linki produced podczas renderowanie jeśli renderowanie succeeds. Raw availability reduces że dependency. |
| Title i description | Google może process JavaScript-set metadata, ale title linki i snippets są selected z several źródła. Pokazywać both states; nie claim the wyrenderowany, pierwszy, lub ostatni value jest guaranteed. |
| Robots directives | A raw noindex may cause Google do skip renderowanie, więc JavaScript removal may never przezć seen. Adding restrictions later jest nie evidence że an earlier restriction przezł cancelled. |
| Canonical | Google’s JavaScript guidance says nie do set jeden value w źródło a następnie change do z JavaScript. Używać jeden method i verify jeden wyrenderowany-head declaration. |
| HTTP status i redirect | JavaScript nie może change the odpowiedź status już received. Record the statyczny status i dowolny observed wyrenderowany navigation jako separate facts. |
Że matrix jest dlaczego an auditor należy keep źródło, wyrenderowany, odpowiedź-nagłówek, i observed-search state distinct rather niż collapsing them do jeden “effective” value.
Pick a renderowanie mode że puts treść w DOM
Most JS-SEO ryzyko comes down do jak the HTML jest produced. The short version: SSR, statyczny/prerendering, i hydration wszystkie put treść w (lub quickly do) the DOM, który reduces jak much twój visibility depends na renderer succeeding; full klient-side renderowanie leaves więcej riding na renderowanie completing correctly, na time, każdy time. Dynamiczny renderowanie jest a workaround, nie a peer option — jako z Google’s guidance ostatni updated December 2025, do describes dynamiczny renderowanie jako a workaround rather niż a long-term solution i recommends renderowanie po stronie serwera, statyczny renderowanie, lub hydration zamiast. Jako I put do w my JavaScript SEO guide, “dowolny kind z SSR, statyczny renderowanie, i prerendering setup jest going do przezć fine dla wyszukiwarki.” The full menu — CSR, SSR, SSG, hydration, ISR, edge, streaming, i dynamiczny renderowanie — z a trade-off table jest na rendering strona. Google separately describes renderowanie po stronie serwera lub pre-renderowanie jako a dobry idea dla users i crawlery. 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
Jak test
URL Inspection w Search Console jest the źródło z truth: uruchamiać a działający test, wtedy wyglądać w the wyrenderowany HTML, the screenshot, i strona zasoby / console messages do widzieć co loaded i co failed. The Rich Results Test daje a quick wyrenderowany-HTML check. Na dużą skalę, używać a crawler że executes JavaScript (Ahrefs Witryna Audit, Screaming Frog w JS-renderowanie mode) do diff raw vs. wyrenderowany across witryna.
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 jest nie zły dla SEO, i do’s nie evil. Do’s just różny z co wiele SEOs są używany do. Działać z twój developers, uzyskać twój ważny treść do the DOM, i let Google’s own narzędzia — nie twój assumptions — przezć the arbiter z co wyrenderowany.
Gdzie do go next: the SEO JavaScript cluster
Ten hub jest mapą. Każdy z poniższych tematów to osobne pogłębione omówienie:
Renderowanie i architecture
- SEO dla a headless CMS — jak decoupled frontends affect crawlowanie, renderowanie, metadata, sitemaps, i canonical tags; który renderowanie mode do pick; i headless-konkretny awaria modes ty trzeba know.
Framework-konkretny guides
- React SEO — dlaczego CSR-pierwszy React tworzy indeksowanie ryzyko, jak Google renders React apps, React Router i History API, react-helmet-async dla meta tags, i gdy do reach dla Next.js.
- Angular SEO — Angular’s SPA defaults,
@angular/ssr(Angular Universal’s successor), the built-w Title i Meta services, prerendering, i incremental hydration w modern Angular. - Next.js SEO — Strony Router vs App Router, the Metadata API,
next/imagei CWV, ISR timing i Googlebot, sitemaps, i most wspólny Next.js SEO mistakes. - Nuxt SEO — SSR domyślnie,
useSeoMeta(), Nuxt’s renderowanie modes, the@nuxtjs/seomodule ecosystem, i jak Nuxt compares do zwykły Vue dla indexability. - Vue SEO — Vue 3’s CSR default i co że means dla crawlery,
createWebHistory(),@unhead/vue, prerendering options bez a meta-framework, i gdy Nuxt jest the właściwy wywołanie. - Svelte SEO — Svelte vs SvelteKit, SSR domyślnie w SvelteKit,
<svelte:head>, theadapter-static+ssr: falsetrap, adapter choices, i AI crawler implications. - Astro SEO — zero-JS domyślnie, islands architecture,
@astrojs/sitemap,astro:assets, View Transitions i History API, Serwer Islands fallback behavior, i Astro’s Core Web Vitals advantages.
AI summary
Skrócona wersja karty Advanced:
- “Może Google czytać JS?” jest the błędny question — do może. The awaria modes są parity (raw vs. wyrenderowany), interaction (Google nie scroll/click), state (stateless renderer), i timing.
- Timing has nie fixed delay — Google queues a
200strona dla renderowanie i may wait “a few seconds” lub longer, z nie published timeout; a non-200 status lub an initialnoindexmoże skip the renderować queue entirely. - Linki musi przezć rzeczywisty
<a href>anchors —onclickna a<div>jest invisible jako a link. Injecting linki z JS jest fine jeśli oni end up jako anchors, ale wyrenderowany anchors są parsed po JS uruchamia — discoverable, nie a crawlowanie/indeks guarantee. - Lazy-load na viewport, nie interaction — Google “nie interact z twój strona.” Używać IntersectionObserver / native lazy-load; Nie gate treść behind scroll lub click.
- Infinite scroll może merge dwa strony do jeden — Googlebot może renderować w a taller
viewport niż a typical przeglądarka (nie dokładny published size — test twój own setup),
i że gap może trigger the loader i append the next strona’s treść. Fix:
paginated URLs + rzeczywisty
<a href>linki + History API; jeśli a loader jest merging strony, block jego JS plik. - Soft-404s po klient-side routing — zwracać a rzeczywisty
404lubnoindex; Nie indeks empty shells; Nie rely na URL fragments (AJAX-crawlowanie deprecated 2015). - Nie block JS/CSS w robots.txt — Google won’t renderować z blocked pliki.
noindexmoże block jego own removal — Google may skip renderowanie gdy do widzi an initialnoindex, więc JS meant do remove do may never uruchamiać.- DOM parity + stage order (robots meta tags) — diff raw vs. wyrenderowany, ale remember
an initial raw
noindexmay stop renderowanie. Apply combination reguły tylko do directives faktycznie processed; test canonical parity pod jego own reguły. - Renderowanie mode changes dependency, nie outcome — SSR/statyczny/prerender/hydration put treść w DOM sooner, reducing reliance na renderowanie; full CSR relies na do most; dynamiczny renderowanie jest a dated Google workaround, nie a peer option. Full breakdown na renderowanie strona.
- Test z URL Inspection (wyrenderowany HTML + screenshot + console), Rich Results Test, i a JS-renderowanie crawler.
Official documentation
Dokumentacja źródłowa wyszukiwarek.
- Understand the JavaScript SEO basics — the trzy phases, crawlable linki, i testing wyrenderowany HTML.
- Fix Search-related JavaScript problems — soft-404 handling, the History API, i renderer constraints.
- Fix lazy-loaded content — load na viewport (nie interaction), i search-friendly infinite scroll.
- Ecommerce pagination and incremental page loading — unique URLs,
<a href>linki, i dlaczego Google ignores fragment identifiers. - In-Depth Guide to How Google Search Works — gdzie renderowanie sits w crawlowanie → indeks → serve.
Bing / Microsoft
- bingbot Series: JavaScript, Dynamic Rendering, and Cloaking. Oh My! — Bing’s podejmować na renderowanie JS i dynamiczny renderowanie.
Cytaty ze źródła
Na-the-record statements z Google (plus a few z my own writing). Każdy search-engine link jest a deep link że jumps do quoted passage na źródło strona.
Google — renderowanie & linki
- “Google processes JavaScript web apps w trzy main phases: 1. Crawlowanie 2. Renderowanie 3. Indeksowanie.” Jump to quote
- “Google może tylko odkrywać twój linki jeśli oni są <a> HTML elements z an href attribute.” Jump to quote
- “Renderowanie jest ważny ponieważ websites często rely na JavaScript do bring treść do strona, i bez renderowanie Google might nie widzieć że treść.” Jump to quote
- “Strona may stay na ten queue dla a few seconds, ale do może podejmować longer niż że.” — na renderować-queue timing, nie fixed delay published. Jump to quote
- “Gdy Google encounters the noindex tag, do may skip renderowanie i JavaScript execution, który means używając JavaScript do change lub remove the robots znacznik meta z noindex may nie działać jako expected.” Jump to quote
Google — interaction, lazy-load & infinite scroll
- “Google Search nie interact z twoja strona.” Jump to quote
- “…loads wszystkie relevant treść whenever do jest visible w viewport.” Jump to quote
- “Dawać każdy chunk jego own persistent, unique URL.” — search-friendly infinite scroll. Jump to quote
- “Nie używać URL fragment identifiers (the text po a # w a URL) dla strona numbers w a collection. Google ignores fragment identifiers.” Jump to quote
Google — soft-404 & routing
- “My recommend używając the History API do load różny views.” Jump to quote
Patrick Stox (my own działać — JavaScript SEO: A Definitive Guide)
- Na meta robots tags specifically: “Z meta robots tags, Google jest always going do podejmować the most restrictive option do widzi — nie matter the location… Google będzie choose the most restrictive statements między HTML i wyrenderowany version z strona.”
- “Jeśli ty have an infinite scroll setup, I nadal recommend a paginated strona version więc że Google nadal może crawlowanie properly.”
- Na merge: “occasionally, dwa strony uzyskać zindeksowany jako jeden” — caused gdy “Google resized the viewport do przezć longer … do triggered the infinite scroll i loaded another article w gdy do przezł renderowanie.” The fix: “block the JavaScript plik że handles the infinite scrolling więc the functionality może’t trigger.”
JavaScript-SEO checklist
A quick pass do confirm Google może renderować i indeks twój JS-dependent treść:
- Ważny treść appears w wyrenderowany HTML (check URL Inspection, nie just View Źródło).
- Linki są rzeczywisty
<a href>anchors — nieonclickhandlers na<div>/<span>. - JavaScript i CSS pliki są nie blocked w
robots.txt. - Nie treść jest gated behind a click, scroll, lub hover (Google nie
interact); lazy-load na viewport via IntersectionObserver lub
loading="lazy". - Above-the-fold treść jest nie lazy-loaded.
- Robots directives match między raw i wyrenderowany HTML (nie JS injecting
noindex) — Google podejmuje the most restrictive. - Klient-side route changes że hit a missing zasób zwracać a rzeczywisty
404lubnoindex(nie soft-404 shells). - Infinite scroll has a paginated version z unique
<a href>URLs i History API updates — i isn’t merging strony w a tall viewport. - Treść że musi rank używa SSR / statyczny / prerendering, nie full CSR (widzieć the renderowanie strona).
- Ty’ve spot-checked the wyrenderowany screenshot i console błędy w URL Inspection’s działający test.
Modele myślowe
1. “Może Google uruchamiać my JS?” jest the błędny question. Do może. The rzeczywisty questions są o parity, interaction, state, i timing:
- Parity — does the wyrenderowany DOM contain co ty think do does?
- Interaction — does anything require a scroll/click Google won’t perform?
- State — są ty relying na cookies/localStorage the stateless renderer clears?
- Timing — jest critical treść deferred behind slow/late JS?
2. Jeśli do’s nie w wyrenderowany DOM, do nie exist. View Źródło pokazuje the surowy HTML; URL Inspection pokazuje the wyrenderowany DOM. Indeks decisions są zrobiony na wyrenderowany DOM — więc że’s the artifact do check, każdy time.
3. Prawdziwe linki lub nie linki.
Discovery rides na <a href> anchors. Click handlers, buttons, i JS navigation że
never produces an anchor są dead ends dla crawlowanie.
4. Design dla a bot że never touches strona. Nie scroll, nie click, nie hover. Jeśli treść potrzebuje an działanie do appear, assume Google won’t widzieć do — load do na viewport zamiast.
5. Test dla tall-viewport trap w infinite scroll. Googlebot może renderować w a viewport taller niż a typical przeglądarka (nie fixed size jest published, więc Nie design against a konkretny number), więc a scroll/height-triggered loader może fire podczas renderować i merge the next strona w. Design dla do: paginated URLs + prawdziwe linki + History API; jeśli do’s actively merging, block the loader’s JS.
6. Let the narzędzia arbitrate. Twój przeglądarka jest nie Googlebot. URL Inspection’s wyrenderowany HTML, screenshot, i console są the źródło z truth — nie “do wygląda fine na my machine.”
JavaScript-SEO gotchas — cheat sheet
| Thing | Co faktycznie się dzieje |
|---|---|
robots.txt blocks twój JS/CSS | Google won’t renderować z blocked pliki — może break the whole strona |
Raw index + JS-injected noindex | Google obeys the most restrictive → noindex wins |
Link jako onclick na a <div> | Nie discoverable — musi przezć <a href> |
| Treść loads na scroll/click | Nie loaded — Google nie interact; używać viewport lazy-load |
URL fragment (#page=2) dla pagination | Ignored — używać a rzeczywisty unique URL |
Klient-side 404 z 200 status | Soft-404 ryzyko — zwracać rzeczywisty 404 lub noindex |
| Infinite scroll w a tall viewport | Może merge dwa URLs do jeden zindeksowany strona — paginate + block loader jeśli needed |
Który renderowanie mode? (dependency na renderowanie succeeding)
| Mode | Dependency |
|---|---|
| Statyczny / prerender (SSG) | Lowest — treść jest już w HTML |
| Renderowanie po stronie serwera (SSR) | Low — treść jest w HTML per żądanie |
| Hydration (isomorphic) | Low — treść lands w DOM quickly |
| Full klient-side renderowanie (CSR) | Highest — treść tylko exists po renderowanie succeeds |
| Dynamiczny renderowanie | Workaround tylko — Google wywołania ten a stopgap, nie a fix |
Ten isn’t a guarantee z outcome — SSR/SSG/hydration nadal trzeba renderować correctly i pass każdy other check w ten article. Full breakdown (ISR, edge, streaming, dynamiczny renderowanie, i trade-offs) na rendering strona.
Widzieć co Googlebot widzi
Renderowanie bugs hide w gap między the surowy HTML (co serwer wysyła) i wyrenderowany HTML (co exists po JS uruchamia). A few quick command-line checks przed ty reach dla a full crawler.
Fetch the surowy HTML (co comes back przed dowolny JS uruchamia)
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"Jeśli the text jest missing z raw.html ale visible w twój przeglądarka, do’s being added
przez JavaScript — więc do depends na renderowanie. (Dla wyrenderowany HTML, używać URL
Inspection’s “View Crawled Strona → wyrenderowany HTML,” lub a headless-Chrome crawler — a
zwykły curl może’t uruchamiać JS.)
Confirm ty aren’t blocking JS/CSS w 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)"A Disallow że matches twój JavaScript lub CSS means Google może’t renderować strona
properly — almost always a mistake. (URL Inspection lists blocked strona zasoby too;
the grep just catches the obvious ones fast.)
Narzędzia dla debugging SEO JavaScript
Widzieć the difference między surowy HTML i co Google renders z Render Gap:
- Paste the full URL z strona ty want do test — a JavaScript-heavy template strona pokazuje the most.
- Clear the anti-abuse check i press Test strona; do fetches the surowy HTML pierwszy i tylko renders w headless Chrome gdy że HTML wygląda like an empty shell.
- Czytać the colour-coded verdict, wtedy scan the Initial HTML vs Wyrenderowany DOM table dla rows flagged changed.
- Switch do Raw vs wyrenderowany diff tab do widzieć line-przez-line co JavaScript added lub removed.
- URL Inspection (Google Search Console) — the źródło z truth. Uruchamiać a działający test, wtedy view the wyrenderowany HTML, the screenshot, the strona zasoby (co loaded vs. co przezł blocked), i JavaScript console messages.
- Rich Results Test — a fast way do check wyrenderowany HTML i dane strukturalne dla a URL bez verifying witryna.
- Chrome DevTools — compare View Źródło (surowy HTML) z Elements panel (wyrenderowany DOM); the Console surfaces JS błędy że może blank out treść.
- JavaScript-renderowanie crawlery — Ahrefs Witryna Audit i Screaming Frog SEO Spider (JS-renderowanie mode) execute JS więc Możesz diff raw vs. wyrenderowany na dużą skalę.
- View-wyrenderowany-źródło narzędzia — przeglądarka extensions że pokazywać the wyrenderowany DOM side-przez-side z surowy HTML dla quick spot checks.
- Serwer log analysis — confirm Googlebot jest faktycznie fetching twój JS/CSS zasoby (widzieć log file analysis).
Prompty dla SEO JavaScript diagnosis
Compare raw i wyrenderowany HTML
Paste the raw odpowiedź i wyrenderowany DOM dla do samo URL. Remove customer dane i tokens pierwszy.
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 a 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 a SEO JavaScript change
Prove route treść exists przed JavaScript
Test do uruchamiać: Fetch representative routes z curl i inspect the odpowiedź
body. Expected result: Każdy odpowiedź contains jego unique title, primary heading,
copy, i crawlable linki. Awaria interpretation: The deployment nadal serves a
shared app shell. Monitoring window: Immediate. Rollback trigger: A formerly
serwer-visible route becomes dependent na renderowanie.
Prove directives agree across processing stages
Test do uruchamiać: Compare surowy HTML z URL Inspection’s wyrenderowany HTML dla robots i
canonical tags. Expected result: Jeden intended directive set appears w both, z
nie więcej-restrictive value w raw shell. Awaria interpretation: JavaScript jest
trying do overwrite an indeksowanie signal too late. Monitoring window: Immediate w
local renderowanie; po recrawl w Search Console. Rollback trigger: noindex lub
an incorrect canonical appears w either stage.
Prove linki remain crawlable
Test do uruchamiać: Disable JavaScript i inspect navigation do representative routes.
Expected result: Destinations remain w rzeczywisty anchor href attributes. Awaria
interpretation: Klient handlers, nie linki, own discovery. Monitoring window:
Immediate. Rollback trigger: Ważny routes disappear z link graph gdy
scripts fail.
Zasługujące na uwagę źródła
My related writing
- JavaScript SEO: A Definitive Guide — my full guide do renderowanie, DOM parity, the most-restrictive-directive reguła, infinite scroll, i dwa-strony-jako-jeden problem. Ten article jest the condensed, źródło-linked version.
- The Beginner’s Guide to Technical SEO — gdzie SEO JavaScript fits w bigger picture.
Moje wystąpienia
- How Search Works (SlideShare) — moje omówienie crawlowania, renderowania, indeksowania i rankingów. (Obowiązuje moje stałe zastrzeżenie: “This is my understanding of systems… not going to be 100% complete or accurate.”)
Z others
- r/TechSEO — the community dla debugging renderować/indeks problemy.
- web.dev — Rendering on the Web — the canonical explainer z renderowanie trade-offs z Chrome team.
- Google Search Central — JavaScript SEO — official primary-źródło docs na trzy-phase process, crawlable linki, i testing wyrenderowany HTML.
- Onely — JavaScript SEO hub — deep techniczny posts na renderowanie, dwa-waves indeksowanie, i JS SEO auditing z a specialist agency.
- Martin Splitt’s JavaScript SEO playlist — the official Google video series walking przez każdy JS SEO concept, produced przez Google’s web ecosystem team.
- Search Engine Journal — JavaScript SEO coverage — industry news i practitioner guides na JS renderowanie issues jako oni emerge.
Podcasts
- Search Off the Record (Google Search Relations) — Martin Splitt, John Mueller, i Gary Illyes regularly cover SEO JavaScript i renderowanie z inside. Listen
Videos
- Google Search Central (YouTube) — Martin Splitt’s SEO JavaScript series jest the best official video walkthrough z jak Google handles twój JS. Channel
Statystyki, które warto cytować
- Bieżący official framing: nie fixed delay. Google’s own documentation (updated
2026-03-04) says a crawled
200strona “may stay na ten queue dla a few seconds, ale do może podejmować longer niż że” — there’s nie published fixed delay lub timeout, i strony że zwracać a non-200 status lub start out znoindexmay skip renderowanie entirely. Jump to quote - Historical dane point (dated) — ~5 second median renderować delay. W earlier conference remarks, Google staff (Martin Splitt i Tom Greenaway) described strony reaching the renderer w a median z ~5 seconds, z 90th percentile w minutes — nie the “weeks” the stary fear implied. I cite ten w my JavaScript SEO guide. Treat do jako a historical dane point z że talk, nie a bieżący published metric — Google hasn’t republished do jako an ongoing figure, i queue-timing quote above jest the bieżący official framing.
- “Dwa waves z indeksowanie” jest fading, per Martin Splitt (2019 remarks). W an August 2019 conversation z John Mueller, Splitt said dwa-wave indeksowanie “play[s] mniej i mniej z a role” jako renderowanie otrzymuje cheaper i crawlowanie, renderowanie, i indeksowanie converge — z nie timeline given dla gdy do might stop entirely. Coverage Ten jest Splitt’s characterization z że konkretny conversation, nie a dated, citable Google spec — używać do jako directional context, nie a bieżący guarantee 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.
Ryzyko zignorowania: 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.
Zapytaj swój zespół: What do our top revenue templates return before JavaScript runs, and have we verified their content and links in rendered output before release?
Google processes JavaScript apps przez crawlowanie, renderowanie, i indeksowanie.
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 Do generally crawls linki gdy oni
są anchors z href attributes. 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 describes renderowanie po stronie serwera lub pre-renderowanie jako a dobry idea dla users i
crawlery. 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 także
nie interact z strona do trigger treść. 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
Dziennik zmian
Zaktualizowano 27 lip 2026.
Podsumowanie redakcyjne i zapisane szczegóły zmian.Szczegóły zmian
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
Pełne porównanie jest niedostępne — dla tej wersji nie zarchiwizowano wcześniejszej migawki.
Zaktualizowano 18 lip 2026.
Podsumowanie redakcyjne i zapisane szczegóły zmian.Szczegóły zmian
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
Pełne porównanie jest niedostępne — dla tej wersji nie zarchiwizowano wcześniejszej migawki.