Metricum Lab

JavaScript SEO · Rendering · Діагностика індексації

JavaScript SEO: діагностика rendering та індексації для SPA, SSR і hybrid-сайтів

Я рекомендую спочатку визначити та переконатися на якому рівні / етапі контент сторінки розходиться з очікуваним контентом. Порівняйте HTTP response, browser-rendered DOM і Google-rendered evidence; виправляйте найперший шар, де губиться критичний контент, посилання або індексаційний сигнал.

Yurii Pekach Founder, Metricum LabОпублікованоОновлено34 хв читання
Схема JavaScript SEO: порівняння server HTML, browser-rendered DOM і Google-rendered HTML між етапами crawl, render та index.

Коротка відповідь

Не варто починати з питання чи вміє Google виконувати код вашого framework. Візьміть один репрезентативний URL і порівняйте три артефакти: raw HTTP response, DOM після виконання JavaScript у браузері та Google-rendered evidence з URL Inspection або Rich Results Test. Перший шар, де зникає критичний контент, links, canonical/robots або коректна status behavior, визначає наступний тест.

3

Етапи обробки Google

Google описує JavaScript processing як crawling, rendering та indexing — це не один синхронний fetch.

200

Типовий статус для render queue

За документацією Google, сторінки з HTTP 200 потрапляють у rendering queue, якщо robots directive не блокує indexing; для non-200 rendering може бути пропущений.

<a href>

Надійний crawlable-link primitive

Google зазвичай парсить посилання як anchor element з href; script-only псевдопосилання не є надійною заміною.

15 MB

Default limit crawling infrastructure

Crawling infrastructure Google за замовчуванням обробляє перші 15 MB файлу, але окремі краулери та типи файлів можуть мати інші ліміти. Це інфраструктурна межа, а не універсальний Googlebot HTML threshold.

01 · Локалізуйте проблему

Почніть із трьох станів сторінки, а не з діагнозу framework

JavaScript SEO проблему простіше локалізувати, якщо зберегти три артефакти одного URL: server HTML, browser-rendered DOM і Google-rendered output.

Порожній view-source: сам по собі не доводить, що сторінка не може бути проіндексована. Так само ідеальна сторінка у вашому браузері не доводить, що Google отримав той самий контент. Моя базова модель — порівняння трьох станів. Стан 1 — HTTP response до client JavaScript. Стан 2 — DOM після виконання scripts та data fetch у браузері. Стан 3 — HTML і resource evidence з Google rendering tools. Виправляйте найраніший стан, де зникає потрібний сигнал: наступні симптоми часто є лише наслідком.

02 · Побудуйте модель pipeline

Розділіть crawling, rendering та indexing до того, як інтерпретувати симптом

У JavaScript pipeline Google є окремі етапи та черги. Discovery failure — не те саме, що render failure, а успішний render не гарантує indexing.

Google Search описує три основні фази для JavaScript pages: crawling → rendering → indexing. Googlebot спочатку отримує URL, якщо robots.txt дозволяє crawl, і витягує links із response. Сторінки з HTTP 200 потім потрапляють у rendering queue, якщо robots directive не забороняє indexing; очікування може тривати секунди або довше. Headless evergreen Chromium виконує JavaScript, після чого Google ще раз аналізує rendered HTML для links і використовує цей output під час indexing. Тому «Google fetched URL» і «Google indexed rendered content» — різні твердження.

Кастомна схема

Evidence pipeline для JavaScript SEO

Один URL створює різні докази на crawl, render та index stages. Кожен етап може мати окрему failure mode і потребує свого артефакту.

Evidence pipeline для JavaScript SEOОдин URL створює різні докази на crawl, render та index stages. Кожен етап може мати окрему failure mode і потребує свого артефакту.1. CrawlHTTP + links + robots2. RenderWRS + JS + data3. Indexcontent + signalsЗбережіть evidenceserver → browser → Googleresponserendered HTML
Діагностична модель Metricum Lab на основі опису Google Search Central crawl → render → index.

Спочатку класифікуйте симптом

  • Discovery/crawl: URL або потрібні ресурси не завантажуються, internal links не є crawlable або robots.txt блокує доступ.
  • Rendering: HTTP response є, але JavaScript, API data, hydration чи resource loading завершується помилкою до появи critical DOM content.
  • Indexation: rendered content присутній, але canonical, robots, duplicate/quality або інші сигнали не дають обрати потрібний URL для індексації.

03 · Зафіксуйте baseline

Перевірте HTTP response до того, як JavaScript змінить сторінку

Server response — це контрольний зразок. Зафіксуйте status, directives, canonical, ключовий контент і crawlable links до аналізу client-side app.

Baseline server response

  1. 1

    Зафіксуйте status і headers

    Запитайте точний canonical URL без залежності від browser state. Збережіть фінальний status після redirects і перевірте robots-related HTTP headers.

    ШляхTerminal → curl -I https://example.com/path

    КритерійПотрібний indexable URL приходить на очікуваний final URL із коректним HTTP status; немає неочікуваного X-Robots-Tag, що блокує indexing.

  2. 2

    Збережіть raw HTML body

    Збережіть response body, щоб пізніше порівняти його з rendered output. Перевірте title, canonical, robots meta, H1/primary content і кілька representative internal links.

    ШляхTerminal → curl -sS https://example.com/path -o server.html

    КритерійSEO-сигнали, які архітектура має віддати через server rendering, дійсно присутні та коректні в server.html.

  3. 3

    Звірте main document у DevTools

    Відкрийте сторінку з уже активним DevTools, щоб cache не приховав first-load behavior. Виберіть main document і перегляньте Headers та Response.

    ШляхChrome DevTools → Network → reload → [main document] → Headers / Response

    КритерійDevTools показує той самий final status та очікуваний initial HTML, що й незалежний curl capture.

  4. 4

    За потреби повторіть із cold cache

    Для intermittent hydration/bundle issues форсуйте first-load request замість діагностики кешованого успіху.

    ШляхChrome DevTools → Network → long-press Reload → Empty Cache And Hard Reload

    КритерійDocument, scripts і data успішно завантажуються на cold load без нового critical blocking failure.

Мінімальний capture server response

URL='https://example.com/products/42'

curl -sS -L -D response-headers.txt "$URL" -o server.html

printf '\nStatus chain and headers saved to response-headers.txt\n'
printf 'Raw response HTML saved to server.html\n'

# Spot checks; вони не замінюють повний аналіз HTML.
grep -i -m1 '<title' server.html || true
grep -i -m1 'rel="canonical"' server.html || true
grep -i -m1 'name="robots"' server.html || true

Потрібні curl і стандартні shell tools. Це capture evidence, а не DOM parser: client-generated content тут не з'явиться. Висновки треба звірити з rendered DOM і Google-rendered output.

04 · Відтворіть у браузері

Простежте, що саме було потрібно браузеру для побудови фінального DOM

Rendered DOM може виглядати коректно, але залежати від крихких API calls, state, blocked resources або script-only navigation. Зберігайте dependency chain разом із DOM evidence.

Browser-render checklist

  1. 1

    Перевірте final DOM, а не тільки View Source

    Знайдіть distinctive phrase з primary content, canonical link і кілька representative internal links після завершення роботи app.

    ШляхChrome DevTools → Elements → Ctrl/Cmd+F

    КритерійCritical content і SEO elements існують у rendered DOM та не приховані за наступною user action.

  2. 2

    Знайдіть request, що приніс відсутній контент

    Якщо контенту немає в server HTML, але він з'являється пізніше, визначте API/data request та його Initiator. Перевірте status, response payload і залежність від auth, cookies чи client state.

    ШляхChrome DevTools → Network → Fetch/XHR → [request] → Headers / Response / Initiator

    КритерійRequired data request успішний на clean load і не потребує state, недоступного crawler-у.

  3. 3

    Прочитайте runtime errors до зміни rendering architecture

    Hydration mismatch, uncaught exception або blocked module можуть зупинити app до створення critical subtree.

    ШляхChrome DevTools → Console

    КритерійНемає uncaught error або failed critical dependency, що блокує main content, metadata чи links.

  4. 4

    Відкрийте deep route як перший request

    Не тестуйте тільки переходом із home. Завантажте deep URL напряму, адже краулери відкривають URL незалежно один від одного.

    ШляхNew Incognito window → paste deep URL → open DevTools → reload

    КритерійDeep route повертає коректний content/status без залежності від попереднього SPA state, localStorage чи cookies.

WRS не зберігає localStorage, sessionStorage та HTTP cookies між page loads. Якщо route стає повним лише після попереднього in-app переходу, звичайна browser session може приховувати crawler-visible bug. Representative routes потрібно тестувати як незалежні entry points.

05 · Звірте Google evidence

Перевірте Google-rendered output через URL Inspection і Rich Results Test

Browser parity необхідна, але недостатня. Google's rendering tools дають rendered HTML, resource evidence та JavaScript failures.

Перевірка Google render

  1. 1

    Спочатку зафіксуйте indexed state

    URL Inspection допомагає зрозуміти збережений/indexed стан і canonical/indexability signals для точного URL у вашій Search Console property.

    ШляхSearch Console → URL Inspection → inspect URL

    КритерійЗафіксовані indexed state, last crawl evidence та canonical/indexability result до запуску fresh test.

  2. 2

    Запустіть current live render

    Запустіть live test і відкрийте tested-page evidence. Порівняйте distinctive content phrase, link targets, canonical/robots, screenshot та failed resources із browser baseline.

    ШляхSearch Console → URL Inspection → Test Live URL → View tested page → HTML / Screenshot

    КритерійGoogle live render містить critical content і crawlable links, а required first-party resources завантажуються без помилок.

  3. 3

    Якщо немає property access — використайте Rich Results Test

    Google у JavaScript troubleshooting guide рекомендує Rich Results Test як інший спосіб перевірити loaded resources, console output і rendered DOM. Structured data — не єдина причина застосовувати його під час rendering diagnosis.

    ШляхRich Results Test → URL → Test URL → rendered-page details

    КритерійPublic Google render відтворює expected critical DOM або показує resource/console failure для подальшої перевірки.

06 · Локалізуйте root cause

Зіставте перше розходження з конкретною JavaScript SEO failure mode

Кожна причина має бути falsifiable hypothesis. Корисне питання не «JavaScript поганий для SEO?», а «який сигнал відсутній, на якому шарі і чому?».

Кастомна схема

Three-layer diff: де саме зник сигнал?

Порівняйте один critical signal у server HTML, browser DOM і Google-rendered HTML. Перший missing layer звужує набір можливих причин і визначає наступний тест.

Three-layer diff: де саме зник сигнал?Порівняйте один critical signal у server HTML, browser DOM і Google-rendered HTML. Перший missing layer звужує набір можливих причин і визначає наступний тест.Server HTMLstatus · head · links · contentBrowser DOMJS · API · hydrationGoogle renderrendered HTML · resourcesВідсутнє тут?server / routing / statusЗникає тут?JS / data / hydrationЛише тут?WRS / resources / signalsВиправляйте найраніший шар, де потрібний signal перестає бути надійним.
Діагностична модель Metricum Lab. Зелений стан означає, що signal присутній; перший gap — межа для root-cause analysis.
Типові JavaScript SEO symptoms, tests та fixes
СимптомЙмовірна причинаТестРекомендований fixВалідація
У server HTML лише app shell; у browser content єCSR залежить від JavaScript + data fetchПорівняти server.html, Elements і Google-rendered HTMLЗробити critical content надійно renderable; якщо dependency крихка — SSR/prerender/hybridCritical content є у Google-rendered HTML на representative routes
Links працюють по click, але crawler не знаходить destinationsScript-only navigation або anchor без hrefПеревірити rendered DOM на <a href>Віддавати реальні crawlable anchors; client routing — enhancementDestination URLs присутні як href у rendered HTML
Browser page indexable; Google render показує noindexInitial robots meta або X-Robots-Tag відрізняєтьсяПеревірити raw response + headers до JSВіддавати потрібний robots directive у initial responseServer і Google-rendered directives збігаються
Після hydration неправильний або multiple canonicalClient code мутує/додає conflicting canonicalПорівняти source head і rendered headPrefer stable HTML canonical; якщо потрібен JS — лише одне стабільне значенняУ rendered HTML рівно один intended canonical
Missing product повертає 200 app shellClient-side soft 404Direct request до missing route + URL InspectionMeaningful server status або real 404/noindex error stateMissing URL більше не виглядає як звичайна 200 content page
Below-fold content відсутній у Google renderLazy loading чекає scroll/clickGoogle-rendered HTML + browser test без interactionЗавантажувати relevant content, коли він visible; не вимагати explicit user actionContent з'являється без click/scroll dependency
Deep route працює після навігації, але не direct loadApp залежить від попередніх cookies/storage/sessionВідкрити deep URL у fresh IncognitoPublic crawlable content має бути self-contained для кожного URLFresh direct load рендерить той самий critical content
Google render ніби використовує старий JSAggressive crawler/WRS caching + assets без fingerprintПорівняти requested asset URLs і deployed hashesContent fingerprinting для versioned JS/CSSGoogle test завантажує current asset version

07 · Оберіть architecture свідомо

Оберіть CSR, SSR, prerendering або hybrid rendering із моделі failure

Rendering strategy — trade-off, а не ranking switch. Для SEO потрібен стабільний crawlable/indexable output; продукт також має latency, cacheability, server cost та interactivity constraints.

Google і далі радить server-side або pre-rendering, оскільки це швидше для users/crawlers і не всі bots виконують JavaScript. У документації dynamic rendering bot-specific rendering уже названий workaround, а не long-term solution; замість нього рекомендовані SSR, static rendering або hydration. Для hybrid app я б віддавав search-critical route state через SSR або prerendering, де це можливо, а client-side залишав hydration та enhancement.

Кастомна схема

Decision model для rendering strategy

Почніть із search-critical content та freshness requirements, а потім оберіть найпростішу модель, що робить initial route надійним і не ламає product constraints.

Decision model для rendering strategyПочніть із search-critical content та freshness requirements, а потім оберіть найпростішу модель, що робить initial route надійним і не ламає product constraints.Search-critical route?content · links · metadata · statusStable / buildablePrerender / SSGRequest-time / freshSSRHydrate / enhance on clientCSR where search-critical output is not required
Framework-neutral модель; Angular terminology використана лише як implementation example.

Практична модель trade-offs

  • CSR: прийнятний, коли critical routes/content надійно рендеряться й indexation постійно перевіряється; server-side частина може бути простішою, але більше роботи переноситься у browser.
  • SSR: доречний для public content, що часто змінюється або формується request-time, якщо server може повернути повний route state.
  • Prerender/SSG: сильний варіант для public routes, які можна згенерувати build-time або revalidate за контрольованим cadence.
  • Hybrid route-level rendering: high-value search routes можуть мати SSR/prerender, а app-only/authenticated zones залишатися client-rendered.
  • Hydration: має коректно повторно використовувати server DOM; framework hydration mismatch — engineering problem і потенційний ризик availability content.

09 · Закрийте validation loop

Перевірте fix на representative routes і перетворіть його на release regression test

One-URL live test недостатній для template-level change. Валідуйте різні route types, зберігайте artifacts і контролюйте ті самі invariants після releases.

Release acceptance sequence

  1. 1

    Повторіть тест на URL, де був failure

    Запустіть той самий server capture, browser DOM check і Google live render, якими було доведено initial failure. За можливості змінюйте одну hypothesis за раз.

    Шляхcurl + Chrome DevTools + Search Console URL Inspection

    КритерійРаніше missing critical signal присутній на всіх required layers і не з'явився новий directive/status mismatch.

  2. 2

    Візьміть sample кожного rendering/template class

    Перевірте хоча б один fresh direct URL для кожного суттєво іншого route mode/template: SSR, prerendered, CSR-only, parameterized та error routes, якщо вони є.

    ШляхRelease QA matrix → route class → representative URLs

    КритерійКожен route class проходить однакові content, link, status, canonical і robots acceptance rules.

  3. 3

    Моніторте crawl/indexation після release

    Використовуйте Search Console crawl/indexation reporting і, якщо доступно, verified server/edge logs. Client analytics сам по собі не є повним журналом Googlebot/WRS activity.

    ШляхSearch Console → Settings → Crawl stats; Page indexing; server/edge logs

    КритерійУ monitored segment немає release-linked spike у fetch errors, unintended exclusions або втрати discovery priority routes.

Практичний принцип: rendering вважається перевіреним, коли один search-critical contract витримує independent HTTP fetch, clean browser render і Google render — а не коли framework demo виглядає правильно. Якщо три стани збігаються, переходьте до indexation та quality signals. Якщо ні — збережіть diff і виправляйте найраніший failing layer.

Першоджерела та документація

Джерела

Кожне змінне твердження про пошукову систему, браузер, інтерфейс або технічну поведінку в матеріалі прив’язане до актуального першоджерела.

  1. Google Search Central Основи JavaScript SEO (відкриється в новій вкладці)Актуальна документація Google; оновлено 4 березня 2026 року.
  2. Google Search Central Діагностика JavaScript-проблем у Google Search (відкриється в новій вкладці)
  3. Google Search Central Вимоги Google до crawlable links (відкриється в новій вкладці)
  4. Google Search Central Коректне lazy-loading для Google Search (відкриється в новій вкладці)
  5. Google Search Central Dynamic rendering як workaround (відкриється в новій вкладці)
  6. Google Search Console Help URL Inspection tool (відкриється в новій вкладці)Назви елементів інтерфейсу варто повторно перевіряти перед майбутніми оновленнями статті.
  7. Google Crawling Infrastructure Огляд crawler/fetcher інфраструктури Google (відкриється в новій вкладці)Актуальна документація crawling infrastructure; оновлено 12 червня 2026 року.
  8. Chrome for Developers Inspect network activity (відкриється в новій вкладці)
  9. Chrome for Developers Get started with viewing and changing the DOM (відкриється в новій вкладці)
  10. Chrome for Developers Console overview (відкриється в новій вкладці)
  11. Angular Server-side and hybrid-rendering (відкриється в новій вкладці)
  12. Angular Hydration (відкриється в новій вкладці)

Потрібна допомога з діагностикою та впровадженням?

Перетворіть rendering symptom на відтворюваний engineering backlog

Metricum Lab може простежити crawl, server-response, rendering та indexation evidence для representative route types і перетворити findings на пріоритизовані fixes з acceptance criteria та post-release verification.

Переглянути Technical SEO services