Kodėl SPA ir Google News – tai šiek tiek sudėtingas romanas
Jei esi dirbęs su naujienų svetaine, pastatyta ant React, Vue ar Angular, tikriausiai jau žinai tą jausmą – publikuoji straipsnį, žiūri į Google Search Console ir matai, kad indeksavimas vyksta kažkokiu savo tempu, kuris su realiu laiku turi mažai ką bendro. O Google News atveju tai ypač skaudu, nes ten aktualumas yra viskas. Pavėluotas indeksavimas = niekas to straipsnio nepamatys.
Problema ne ta, kad Google nemėgsta SPA. Problema ta, kad Googlebot JavaScript renderina kitaip nei tikras naršyklė, ir tas procesas turi savo eilę, savo laiką, savo kaprizus. Taigi reikia jam padėti.
Server-side rendering – ne mada, o būtinybė
Pirmas ir svarbiausias žingsnis – SSR arba bent jau statinis generavimas kritinėms puslapiams. Jei Googlebot ateidamas į straipsnio URL gauna tuščią <div id="app"></div>, tai jis gali tą puslapį įrašyti į eilę renderinimui, bet kada tas renderinimas įvyks – neaišku. Gali būti per kelias valandas, gali būti per kelias dienas.
Su Next.js tai sprendžiama per getServerSideProps arba ISR (Incremental Static Regeneration). Su Nuxt – analogiškai. Esmė paprasta: kai botas ateina, HTML jau turi būti paruoštas su visu turiniu – antrašte, tekstu, meta tagais. Jokio laukimo, jokio JavaScript vykdymo iš boto pusės.
Praktiškai tai atrodo taip – kiekvienas naujas straipsnis turi savo statinį HTML, kuris generuojamas arba publikavimo metu, arba pirmojo užklausos metu (ir tada kešuojamas). Google News botui nereikia nieko renderinti – jis gauna viską iš karto.
XML sitemap – bet ne bet koks
Google News reikalauja specialaus News Sitemap formato. Tai ne tas pats sitemap, kurį naudoji paprastam SEO. Čia yra specifiniai tagai:
<news:news>
<news:publication>
<news:name>Tavo leidinio pavadinimas</news:name>
<news:language>lt</news:language>
</news:publication>
<news:publication_date>2024-01-15T10:30:00+02:00</news:publication_date>
<news:title>Straipsnio antraštė</news:title>
</news:news>
Svarbu – į News Sitemap įtraukiami tik per paskutines 48 valandas publikuoti straipsniai. Jei bandysi kišti senesnius, Google tiesiog ignoruos. Ir tas sitemap turi būti atnaujinamas dinamiškai – kiekvieną kartą, kai publikuojamas naujas straipsnis, jis turi atsirasti sitemape per kelias minutes, ne per kelias valandas.
SPA kontekste tai reiškia, kad reikia backend endpoint’o, kuris generuoja šį XML realiu laiku iš duomenų bazės. Statinis sitemap čia neveiks.
IndexNow – tas dalykas, kurį daugelis pamiršta
Google oficialiai palaiko IndexNow protokolą (nors ir su tam tikrais niuansais – Bing jį priima greičiau). Bet esmė ta, kad kai publikuoji straipsnį, tu aktyviai pranešai paieškos sistemoms: „ei, šis URL pasikeitė, ateik pažiūrėk”.
Implementacija paprasta – HTTP POST užklausa su URL sąrašu į https://api.indexnow.org/indexnow. Tai galima integruoti tiesiai į publikavimo workflow. Straipsnis publikuotas → webhook → IndexNow pranešimas išsiųstas. Visas ciklas per sekundes.
Papildomai verta naudoti Google Search Console API, kad programiškai pateiktum URL indeksavimui. Tai ypač naudinga breaking news atveju, kai kiekviena minutė svarbi.
Canonical ir Open Graph – smulkmenos, kurios nesmulkmenos
SPA dažnai turi problemą su canonical tagais – jie arba generuojami klaidingai, arba visi rodo į root URL. Kiekvienas straipsnis privalo turėti unikalų, teisingą canonical, ir jis turi būti HTML <head> dalyje jau serverio atsakyme, ne po JavaScript vykdymo.
Tas pats su Open Graph tagais – og:title, og:description, og:image. Google News naudoja šiuos duomenis, kai rodo straipsnio peržiūrą. Jei jų nėra arba jie neteisingi, straipsnis gali būti indeksuotas, bet atrodys prastai arba visai neatsiras News sklaidos kanaluose.
Kai viskas sukonfigūruota, bet vis tiek neveikia
Čia reikia kalbėti apie render budget. Google turi ribotą resursų kiekį kiekvienai svetainei JavaScript renderinimui. Jei tavo SPA yra lėtas, sunkus, pilnas trečiųjų šalių skriptų – botas gali tiesiog nebaigti renderinimo arba gauti timeout’ą.
Patikrinimo būdas – Google Search Console „URL Inspection” įrankis. Jis parodo, kaip Googlebot mato puslapį po renderinimo. Jei matai, kad turinys neįkrautas arba yra JavaScript klaidų – tai tavo problema.
Sprendimas: agresyvus code splitting, lazy loading viskam, kas nėra kritinis pirmam ekranui, ir Core Web Vitals optimizavimas. LCP turi būti žemas, CLS – minimalus. Google News algoritmas vertina greičius.
Galiausiai – tai ne raketa, bet reikia dėmesio
Visas šis konfigūravimas nėra kažkas neįveikiamo. SSR + tinkamas News Sitemap + IndexNow + tvarkingi meta tagai – tai pakankamas minimumas, kad Google News indeksuotų straipsnius per kelias minutes po publikavimo, o ne per kelias dienas. Esminis dalykas, kurį reikia suprasti: Google News botas nėra tas pats kaip pagrindinis Googlebot. Jis lankosi dažniau, bet turi mažiau kantrybės su JavaScript. Todėl kuo mažiau jam reikia pačiam daryti – tuo geriau tau. Duok jam HTML ant lėkštutės, pranešk kai kažkas nauja pasirodo, ir turėk tvarkingus metaduomenis. Viskas kita – jau detalės.