Migrarea unui site fără pierderi SEO: planul în 9 pași
Migrare site SEO fără pierderi de trafic: inventar, hartă de redirecturi 301, teste pe staging, lansare, monitorizare și greșelile care costă cel mai mult.
Pe scurt
JavaScript SEO înseamnă să te asiguri că Google poate vedea conținutul și linkurile unui site care se construiește în browser, nu pe server. Google poate randa JavaScript, dar o face într-o etapă separată, după crawlare, ceea ce adaugă întârzieri și riscuri. Regula practică: tot ce trebuie indexat (text, titluri, linkuri, canonical) să fie disponibil cât mai devreme, de preferat direct în HTML.
Documentația Google descrie trei faze: crawlare, randare, indexare.
<a href>. Dacă pagina e permisă și returnează un cod 200, urmează randarea.De aici decurg două consecințe. Prima: ce nu apare în HTML-ul randat nu există pentru Google. A doua: totul care depinde de randare ajunge mai târziu în index decât ce este deja în HTML. Pentru un blog care publică zilnic sau un magazin cu stoc în schimbare, întârzierea poate conta.
Un detaliu util: Googlebot folosește un Chromium actualizat continuu, deci suportă API-urile moderne din browser. Problemele nu vin de la „Google nu știe JavaScript”, ci de la modul în care e scris site-ul. De aceea, randarea face parte din SEO-ul tehnic, alături de indexare, viteză și coduri de status.
Alegerea modelului este decizia care influențează cel mai mult comportamentul în căutare. Explicații mai detaliate despre fiecare găsești în materialele web.dev.
| Model | Cine construiește HTML-ul | Pentru SEO | Exemplu de utilizare |
|---|---|---|---|
| Client-side rendering (CSR) | Browserul, după încărcarea scripturilor | Riscant: HTML-ul inițial e aproape gol | Aplicații în spatele unui cont, panouri de administrare |
| Server-side rendering (SSR) | Serverul, la fiecare cerere | Bun: conținutul e în HTML | Magazine, pagini cu conținut care se schimbă des |
| Generare statică (SSG) | La build, o singură dată | Foarte bun și rapid | Bloguri, site-uri de prezentare, documentație |
| Hidratare / randare hibridă | Serverul trimite HTML, apoi browserul îl „activează” | Bun, dacă HTML-ul conține conținutul real | Aplicații moderne cu pagini publice |
Pe scurt: pentru paginile care trebuie să fie găsite în Google, alege SSR sau SSG. CSR pur rămâne potrivit pentru zonele care nu au rost în căutare.
Servirea unei versiuni pre-randate doar pentru roboți (dynamic rendering) a fost un ocol popular. Documentația actuală o tratează ca soluție temporară de ocolire, nu ca practică recomandată pe termen lung, pentru că adaugă complexitate și riscul ca boții și oamenii să vadă lucruri diferite.
Googlebot descoperă adresele din elementele <a> cu atribut href. Un buton sau un <span> cu onclick nu este urmat.
<!-- Corect: crawlerul poate urma linkul -->
<a href="/servicii/audit">Audit complet</a>
<!-- Greșit: nu există adresă de descoperit -->
<span onclick="navigate('/servicii/audit')">Audit complet</span>
<!-- Greșit pentru indexare: fragmentul nu identifică o pagină separată -->
<a href="#/servicii/audit">Audit complet</a>Pentru aplicații cu o singură pagină folosește History API, nu fragmente (#). Schema veche de crawlare AJAX (cu #!) este considerată depășită de Google încă din 2015.
Googlebot nu dă clic, nu derulează și nu completează formulare. Dacă textul important apare doar după un clic pe „Citește mai mult” sau după derulare, riști ca el să lipsească din randare. Pentru încărcarea la derulare (lazy loading) folosește mecanisme recomandate, precum IntersectionObserver sau atributul nativ loading="lazy", nu evenimente de scroll care presupun un utilizator real.
Poți adăuga sau modifica titlul, canonical-ul și meta robots cu JavaScript, dar cu limite:
noindex în HTML-ul inițial, Google poate să nu mai randeze pagina, deci nu te baza pe ștergerea lui din JavaScript;Un SPA întoarce adesea 200 pentru orice adresă, iar aplicația afișează „Pagina nu a fost găsită”. Google vede un 200 și poate trata pagina ca soft 404. Soluții: întoarce un cod 404 real de la server pentru adresele inexistente, sau redirecționează către o pagină care returnează 404, ori adaugă dinamic noindex pe pagina de eroare. Motivele frecvente de excludere din index sunt explicate în ghidul despre paginile neindexate.
Dacă robots.txt blochează fișierele JavaScript sau CSS de care depinde afișarea, Google nu poate randa corect pagina. Nu bloca directoarele de scripturi. Verifică fișierul cu generatorul de robots.txt și testează cu instrumente de inspecție.
Googlebot nu păstrează între pagini stocarea locală, de sesiune sau cookie-urile. Dacă pagina depinde de ele ca să afișeze conținutul, va apărea goală pentru Google. Nu condiționa conținutul indexabil de permisiuni (cameră, locație): Googlebot le refuză.
Orice audit de JavaScript SEO începe cu o comparație: ce trimite serverul versus ce rezultă după randare.
Ctrl+U) și caută o propoziție din conținutul principal. Dacă o găsești, conținutul e în HTML. Dacă nu, el apare doar după randare.Când o pagină construită dinamic nu se comportă cum te aștepți în Google, tabelul de mai jos te ajută să pornești de la simptom, nu de la presupuneri.
| Simptom în Search Console sau în căutare | Cauză probabilă | Prima verificare |
|---|---|---|
| Pagina e indexată, dar fragmentele din rezultate sunt goale sau generice | Textul apare doar după randare sau titlul se setează târziu | Compară codul sursă cu HTML-ul randat din inspecția URL-ului |
| „Descoperită, neindexată în prezent” pe multe adrese noi | Linkurile interne apar târziu sau lipsesc din HTML | Caută <a href> în codul sursă și în sitemap |
| „Soft 404” pe pagini care ar trebui să existe | Conținutul nu se încarcă la randare sau aplicația afișează o eroare | Testul live și consola de erori |
| Paginile inexistente apar ca indexate | Aplicația răspunde 200 la orice adresă | Răspunsul HTTP real pentru o adresă inventată |
| Imaginile nu apar în căutare | Încărcare la derulare implementată doar prin evenimente de scroll | Folosește loading="lazy" sau IntersectionObserver |
Un exemplu de verificare în trei pași, pe o pagină de produs sau de serviciu: (1) cere URL-ul cu un client simplu, fără JavaScript, și vezi dacă numele produsului, descrierea și linkul către categorie sunt în răspuns; (2) deschide același URL în inspecția Search Console și compară HTML-ul randat; (3) schimbă o literă din adresă și verifică dacă serverul întoarce 404. Dacă oricare dintre cele trei pică, ai găsit prioritatea.
Pentru site-uri mari, merită o strategie pe șabloane: nu verifici o mie de pagini, ci un tip de pagină la un moment dat (acasă, categorie, produs, articol). Dacă șablonul e corect, mii de pagini sunt corecte; dacă e greșit, mii de pagini au aceeași problemă.
Google acceptă JSON-LD injectat prin JavaScript, dar documentația recomandă testarea atentă. Mai sigur, include-l în HTML-ul trimis de server. Dacă lucrezi cu un framework, generează blocul JSON-LD la randarea pe server. Exemple și validări găsești în ghidul de date structurate.
Googlebot are o limită de dimensiune pentru fiecare fișier descărcat, aplicată pe datele necomprimate. Documentația actuală menționează primii 2 MB pentru fișierele obișnuite (limita pentru PDF-uri este mai mare, de 64 MB), iar limita se aplică separat fiecărei resurse referite (HTML, JavaScript, CSS). Ce depășește limita nu mai este luat în considerare la indexare. Practic: un bundle JavaScript imens, de ordinul megabiților, e problematic și pentru utilizatori, nu doar pentru Google. Împarte codul, încarcă la cerere ce nu e critic și folosește nume de fișiere cu amprentă (fingerprinting), pentru că Googlebot poate păstra fișierele în cache, iar o amprentă în nume forțează reîncărcarea lor când se schimbă conținutul.
Googlebot execută JavaScript, dar nu orice crawler face la fel. Pentru boții care alimentează căutarea cu AI nu am găsit o garanție oficială generală că randează scripturile, așa că nu presupune că o fac. Dacă vrei ca textul tău să fie citat acolo, cea mai sigură cale este ca el să fie în HTML-ul inițial. Despre cum le permiți sau le blochezi accesul, vezi articolul despre boții AI și robots.txt.
<div id="root"> și tot conținutul adus prin scripturi.href sau cu fragmente în loc de adrese reale.Nu orice problemă de indexare vine din scripturi. Înainte să refaci arhitectura, exclude cauzele simple: pagini blocate, noindex rămas din testare, canonical greșit, conținut slab sau duplicat. De asemenea:
JavaScript nu este un dușman al SEO-ului, dar cere disciplină. Pași concreți:
<a href> cu adrese reale, fără fragmente.Dacă ai un site dinamic care nu se indexează cum ar trebui, serviciul de SEO tehnic începe cu exact aceste verificări. Mai multe ghiduri găsești pe blog.
Întrebări frecvente
Da, Googlebot folosește un Chromium actualizat și execută JavaScript. Dar succesul depinde de implementare: dacă linkurile sunt reale, URL-urile distincte, iar conținutul apare fără interacțiune, se indexează de obicei bine. Fără aceste condiții, paginile pot rămâne goale sau nedescoperite.
Nu ca soluție de lungă durată. Google a prezentat-o ca o soluție temporară de ocolire, nu ca practică recomandată, deoarece adaugă complexitate și poate produce diferențe între ce văd boții și ce văd oamenii. Randarea pe server, generarea statică sau hidratarea sunt alternative mai solide.
Folosește inspecția URL-ului din Search Console și testul live: compară HTML-ul randat și captura de ecran cu ce vezi în browser. Mai poți căuta în Google o propoziție exactă din pagină. Dacă textul lipsește din HTML-ul randat, scriptul nu a rulat complet sau a fost blocat.
Da. Dacă blochezi scripturile sau stilurile de care depinde afișarea paginii, Google nu o poate randa corect și poate înțelege greșit conținutul sau aspectul. Lasă accesibile resursele necesare randării, iar robots.txt folosește-l pentru zone fără valoare de căutare, cum ar fi coșul sau căutarea internă.
Da, ajută la descoperirea adreselor, mai ales când linkurile interne se generează târziu. Nu rezolvă însă problemele de randare: dacă pagina randată este goală sau are un cod de status greșit, sitemapul nu o salvează. Folosește-l ca plasă de siguranță, nu ca înlocuitor al linkurilor reale.
Serviciul asociat
Citește și
Migrare site SEO fără pierderi de trafic: inventar, hartă de redirecturi 301, teste pe staging, lansare, monitorizare și greșelile care costă cel mai mult.
Date structurate schema.org în JSON-LD: ce tipuri merită, exemple de cod pentru firmă, articol și produs, cum validezi și ce a retras Google în 2026.
Core Web Vitals explicate pe înțeles: pragurile LCP, INP și CLS, cât contează pentru poziții, cum măsori corect și ce repari mai întâi.
Trimite-ne adresa site-ului și îți răspundem cu o analiză inițială gratuită și o strategie concretă de optimizare SEO — fără obligații.