Renderizare JS: cum te asiguri că Google citește
Framework-urile moderne sunt rapide pentru utilizatori, dar nu mereu clare pentru Google. Mai jos ai un ghid practic de seo javascript rendering: când e suficient CSR, când ai nevoie de SSR/ISR și cum eviți blocaje de crawl.
robots.txt
, folosește <link rel="canonical">
corect și verifică totul cu Inspectare URL în Search Console. Pentru o verificare cap-coadă: audit tehnic SEO.
Două etape pe scurt
- Crawl: ia HTML-ul inițial + resursele (JS/CSS/imagini).
- Render: rulează JS și reconstruiește pagina pentru a „vedea” conținutul final.
Dacă HTML-ul inițial e gol, iar JS e greu sau blocat, Google poate rata conținut.
Tipuri de randare (pe înțeles)
- CSR (doar client): serverul trimite un schelet, JS construiește conținutul.
- SSR (server): serverul trimite HTML-ul gata „de citit”.
- ISR (static re-generat): pagini pre-generate și reîmprospătate periodic.
Regulă simplă: paginile care trebuie să rankeze (landing-uri, blog, categorii) → SSR/ISR.
Semne că CSR nu ajunge
- „view-source” nu conține textul principal/produsele
- titlul/meta se setează doar din JS
- conținutul apare la 3–5 secunde după încărcare
SSR/ISR aduce
- HTML complet la primul răspuns
- titlu & descriere livrate în HTML (nu doar din JS)
- mai puține „retry-uri” la randare, indexare mai previzibilă
Check rapid în 3 pași (10 minute)
1) View-source
Deschide pagina → Click dreapta → „Vezi sursa”. Caută text unic din pagină.
Dacă lipsește, probabil ai nevoie de SSR/ISR sau pre-render.
2) Inspectare URL
În Search Console: „Testare URL live” → vezi HTML-ul randat și resursele blocate/erori.
3) Simulează Googlebot
curl -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" -I https://exemplu.ro/
Verifică 200 OK
, cache-control
, link rel="canonical"
.
Blocaje de crawl frecvente
robots.txt
blochează/static/
,/_next/
,/assets/
- erori CORS/CSP pe fișiere JS/CSS pentru Googlebot
- router bazat pe
#
(hash) fără URLs reale - infinite scroll fără linkuri „Următoarea pagină”
Meta & head „capcane”
<meta name="robots" content="noindex">
injectat din JS accidental- canonical către altă limbă/varianta filtrată
- redirect-uri client-side care „ascund” HTML-ul
Patron simplu pentru pagini care rankează
- Servește HTML cu conținut (SSR/ISR) + hidratează componentele pe client.
- Baza de navigație: linkuri reale
<a href>
, nu doar handlers JS. - Liste paginate: oferă linkuri către pag. 2, 3… (fallback la infinite scroll).
Optimizări de bun-simț
preload
pentru fonturi critice și CSS principaldefer
pentru JS non-critic,loading="lazy"
la imagini- dimensiuni declarate pentru imagini (stabilitate)
Head minimal „SEO-safe”
<!doctype html>
<html lang="ro">
<head>
<meta charset="utf-8">
<title>Titlu clar al paginii</title>
<meta name="description" content="Descriere scurtă și utilă.">
<link rel="canonical" href="https://exemplu.ro/pagina/">
<link rel="preload" href="/assets/styles.css" as="style">
<link rel="stylesheet" href="/assets/styles.css">
<script defer src="/assets/app.js"></script>
</head>
robots.txt — nu bloca resursele
User-agent: *
Disallow: /admin/
Allow: /assets/
Allow: /_next/
Sitemap: https://exemplu.ro/sitemap.xml
Verifică să nu blochezi folderele cu JS/CSS/imagini necesare randării.
Diagnoză rapidă: simptom → cauză → remediu
Simptom | Cauză probabilă | Remediu |
---|---|---|
„view-source” gol, dar Inspectare URL arată conținut | CSR pur; render întârziat | Mută paginile care rankează pe SSR/ISR; servește titlu/descriere în HTML |
Resurse „Blocked by robots.txt” | Foldere JS/CSS blocate | Allow pentru /assets , /_next etc.; re-testează |
Indexate URL-uri ciudate cu # |
Router cu hash | Treci pe History API (URL-uri reale) + rute server |
Canonical către altă pagină | Setare globală greșită | Canonical „self” pentru fiecare pagină |
„Alternative page with proper canonical” în rapoarte | Pagini SSR vs CSR dublate | Unifică rutarea; păstrează o singură versiune accesibilă |
Scroll infinit, doar 20 produse indexate | Fără linkuri către pag. următoare | Adaugă paginare cu linkuri HTML (fallback), vezi și articolul despre pagination |
Întrebări frecvente
E obligatoriu SSR pentru toate paginile?
Nu. Țintește SSR/ISR pentru paginile care trebuie să rankeze (landing-uri, categorii, articole). Pentru pagini pur aplicaționale, CSR e suficient.
„Dynamic rendering” mai e o idee bună?
Nu recomandăm să servești versiuni diferite pentru boți vs. oameni. Alege SSR/ISR sau pre-render — soluții stabile și curate.
Meta title/description din JS sunt ok?
Mai sigur este să fie servite în HTML-ul inițial. Dacă depinzi de JS, pot apărea întârzieri sau inconsistențe.
Ce fac cu filtrele infinite pe categorii?
Permite linkuri către paginile următoare (pag. 2, 3…) și păstrează o versiune „URL curat” indexabilă. JS poate îmbunătăți UX, dar să nu ascundă navigația.
Variază ancorele către pagina de serviciu (anti-canibalizare): „audit tehnic SEO”, „verificare renderizare JavaScript”, „blocaje de crawl”.