Naar de inhoud springen
ArchiLinks
ArchiLinksAanmelden

JavaScript-SEO: zorg dat links het renderen overleven

Google render JavaScript met een evergreen Chromium. Het probleem is zelden het renderen zelf. Het gaat om links die nooit tot anchors worden, en pagina’s die afhankelijk zijn van state die een crawler niet heeft.

ArchiLinks onderzoeksteam ·

Een brug die stenen funderingen verbindt met glazen structuren die link survival voorstellen

Wat een crawler ziet

Googlebot gebruikt sinds mei 2019 een evergreen Chromium. Dat heeft de vraag of het moderne JavaScript kan uitvoeren, definitief beantwoord.

De praktische risico’s zijn ouderwets: rendering gebeurt na het crawlen en kan vertraagd zijn, content achter klikken of inloggen verschijnt nooit, en een link die uit een onclick-handler op een div komt, is geen link. Voordat u backlinks controleert op website-pagina’s die u recentelijk naar een React-frontend hebt verplaatst, bevestig dan dat die pagina’s hun content tonen in de ruwe response of in de gerenderde HTML.

SSR, SSG, CSR: wat verandert er voor links

BenaderingContent in eerste responseInterne links als anchorsGeschikt voor
SSR (Next.js, Nuxt)JaJa, als u echte anchors gebruiktPublieke pagina’s met wisselende data
SSG of prerenderenJaJaDocs, blogs, marketingpagina’s
CSR single-page appNee, lege shellPas na renderingDashboards achter een login
Hybride (SSR home, CSR app)Per routePer routeDe meeste producten met een publieke kant

Test één: ruwe HTML versus gerenderde HTML

Als de belangrijkste links in de eerste response verschijnen, is de vraag besloten. Zo niet, vergelijk dan met een headless render.

bash
# raw response: are the links there?
curl -s https://new-shop.com/guides/ | grep -o '<a [^>]*href="[^"]*"' | head -20

# rendered DOM with headless Chrome
chrome --headless --dump-dom https://new-shop.com/guides/ | grep -c '<a '
Een tuinder die boomwortels inspecteert die externe backlink health checks voorstellen

Waar externe links binnenkomen

Een rendering-bug verbergt uw content. Hij verwijdert niet de links die andere sites u al hebben gegeven.

Na een verhuizing naar Next.js, Vite of een headless CMS, voer toppages uit voor de host en test de 20 meest gelinkte URL’s op status, canonical en zichtbare content. Doe dit eerst. Als een pagina met 40 linking domains een lege shell of een client-side 404 retourneert, los het dan eerst op, want daar komt uw authority terecht. De interne versus externe equity-pagina laat zien hoe u die lijst vergelijkt met uw interne links, en de migratiechecklist plaatst de test binnen een lanceringplan.

Frameworks zijn minder belangrijk dan discipline. Express met een template engine, een WordPress-thema en een Next.js app router kunnen allemaal crawlbare links serveren. Elk kan ook falen als een team anchors levert die pas bestaan na een klik.

Link- en renderingchecklist

  • Navigatie en paginering gebruiken <a href>, geen click-handlers op andere elementen.
  • Elke route retourneert een echte statuscode. Soft 404-schermen moeten 404 retourneren.
  • Een noindex of canonical ingevoerd door JavaScript komt overeen met die in de serverresponse.
  • Fallback-content in de eerste response is de echte pagina, geen spinner die Google kan indexeren.
  • Auth-code leidt geen crawlers om op publieke routes.
  • CSS- en JS-bestanden die nodig zijn voor rendering zijn niet geblokkeerd in robots.txt.
  • Lazy loading gebruikt IntersectionObserver of native loading-attributen, geen scroll-events.

Het Search Console-bewijs lezen

Search Console beantwoordt de meeste renderingvragen als u het juiste rapport vraagt. Gebruik URL Inspection, dan View crawled page.

Vergelijk drie dingen: de HTML die Google heeft opgehaald, de screenshot en de page resources die niet zijn geladen. Een pagina die in uw browser compleet lijkt, maar leeg in de screenshot, is meestal geblokkeerd door een scriptfout of een verboden resource, en de oplossing zit in uw build, niet in uw content.

Houd rekening met de vertraging. Een wijziging die u vandaag deployt, verschijnt in de inspection tool pas nadat Google de URL opnieuw heeft gecrawld, wat enkele dagen kan duren.

Wanneer SSR de moeite waard is

Publieke pagina’s die moeten ranken: ja. Dashboards: nee.

Als een route organisch verkeer moet genereren, serveer dan de content in de eerste response. Als deze achter een login zit, sla de complexiteit over. Kies per route en niet per project, en documenteer de beslissing zodat de volgende ontwikkelaar deze niet ongedaan maakt.

  • Gebruik de Rich Results test en URL Inspection om de gerenderde output te vergelijken.
  • Test met de live test van Search Console na elke framework-upgrade.
Twee huizen op een heuvel die prerendering versus client-side rendering tonen

Is server rendering vereist, of is prerenderen genoeg?

Server rendering is optioneel. Het is een manier om de eerste response te laten bevatten wat een crawler nodig heeft. Veel publieke sites bereiken dit met prerenderen, een statische build of een server render voor de pagina’s die ertoe doen, en laten de ingelogde delen met rust.

Stel dat uw productpagina’s en docs publiek zijn, terwijl het dashboard achter een login zit. Prerender de eerste groep. Laat het dashboard client-side. De publieke pagina’s dragen dan hun links in de eerste response, en het dashboard kan zo complex zijn als het nodig is.

Alleen de home page prerenderen

Het prerenderen van de home page lost de eerste crawl op, maar laat elke andere route wachten op de browser. Als de home page linkt naar client-gerenderde categoriepagina’s, zijn de links op die pagina’s nog steeds afhankelijk van rendering. Controleer elke template die u beheert, niet alleen de voordeur.

Houd een korte lijst bij van publieke routes met hun rendermethode. De lijst laat sneller gaten zien dan een crawlrapport.

Verandert server rendering de lokale zichtbaarheid

Server rendering kan veranderen hoe snel de eerste content verschijnt, en lezers merken dat. Het maakt een pagina niet automatisch relevant voor een lokale query. Die signalen komen van de paginacontent, de bedrijfsgegevens en de links die er naartoe wijzen.

Behandel rendering als de manier waarop die signalen leesbaar worden voor een crawler, en meet de links apart met de API.

Vite- en React-apps die één shell serveren

Een Vite-build die één HTML-shell voor elk pad serveert, verplaatst alle werk naar de client. Zo’n app kan nog steeds ranken voor sommige queries, maar elke publieke route heeft een plan nodig: prerender het, render het op de server, of accepteer het verlies en schrijf het op.

Voordat u backlinks controleert op website-routes na een rebuild, besluit hoe elke publieke route zijn content krijgt. Anders toont de linkdata externe links die op pagina’s zonder inhoud landen.

Testen of een route zijn links toont

Twee tests beantwoorden de meeste vragen. De ruwe response toont wat een crawler krijgt voordat een script draait. Het gerenderde DOM toont wat een browser daarna bouwt. Een link die alleen in de tweede verschijnt, is nog steeds een link, maar hij is afhankelijk van goed gaande rendering.

De live test in Search Console lezen

Voer de live test uit vanuit URL Inspection op één route tegelijk. Kijk naar de gerenderde HTML, en daarna naar de lijst met resources die niet zijn geladen. Een geblokkeerd script kan een hele navigatieblok verwijderen, en de pagina lijkt dun zonder een zichtbare fout te tonen.

Herhaal de test na een framework-upgrade, omdat een nieuwe default kan veranderen of links renderen voordat of nadat een script draait. De gids pages not indexed behandelt wat u moet doen als een gerenderde pagina toch buiten blijft.

Wanneer een route renderen maar de content een spinner is

De fallback in de eerste response is belangrijker dan de meeste teams verwachten. Een spinner of een lege container betekent dat de pagina op dat moment geen tekst draagt voor de crawler. Zet de titel, de intro en de belangrijkste links in de eerste response, ook als een gedetailleerde lijst later laadt.

Een fallback die de echte pagina is, kan eenvoudig blijven. Zijn enige taak is de content vasthouden tot de rest aankomt.

Een client-side site verplaatsen zonder zijn links te verliezen

01

Lijst de routes met externe links

Voer toppages uit voor de host en noteer de top 50 URL’s. Test die routes eerst, voordat de code verandert, zodat u weet wat de rebuild moet behouden.

02

Vergelijk ruwe en gerenderde output

Controleer voor elke route de ruwe HTML en het gerenderde DOM in de oude en de nieuwe build. Noteer elke link die in de ene wel en in de andere niet bestaat.

03

Vervang click-handlers door anchors

Maak navigatie tot echte anchors met een correct adres. Snelheidswerk kan een sprint wachten, terwijl een ontbrekende anchor de route zijn weg in de site kost.

04

Herhaal de test na release

Een week na de release, voer de live test uit op dezelfde routes en vergelijk de resultaten met de eerdere. Verschillen tonen waar de rebuild de output heeft veranderd.

Statuscodes en redirects in een client-side app

Een single-page app toont vaak een not-found-scherm terwijl de server status 200 retourneert. Google kan zo’n pagina behandelen als een soft 404, en de externe links die naar de ontbrekende URL wijzen, doen dan weinig voor u. De oplossing zit op de server.

Onbekende routes die nog steeds 200 retourneren

Retourneer een echte 404 van de server voor elke route die niet bestaat, en houd de in-app not-found-scherm aan voor bezoekers die via een client-side route aankomen. Waar een vervanging bestaat, stuur dan een 301.

Controleer een paar verzonnen adressen op de live host na elke release. De response code is wat u moet lezen, niet de pagina die u in de browser ziet.

Redirects die in de browser draaien

Een redirect die afvuurt nadat de pagina is geladen, bijvoorbeeld door een URL-parameter te lezen binnen een component, is iets anders dan een serverredirect. Een crawler kan de eerste response indexeren voordat de redirect draait. Waar een route voor goed is verplaatst, retourneer dan een 301 van de server en houd de parameters die content veranderen. De redirect map recipe laat zien hoe u die regels test.