SEO per JavaScript

Come assicurarsi che i motori di ricerca possano eseguire la scansione, il rendering e l'indicizzazione dei contenuti che dipendono da JavaScript: link reali, parità, caricamento differito, scorrimento infinito, soft 404 e test.

Prima pubblicazione: 23 giu 2026 · Ultimo aggiornamento: 2 set 2026 · Avanzato
1 segnale di evidenza in questa pagina

La JavaScript SEO riguarda la capacità dei motori di ricerca di eseguire la scansione, il rendering e l'indicizzazione dei contenuti che dipendono da JavaScript. Google può eseguire JS: le modalità di errore sono più specifiche, ovvero parità tra versione grezza e renderizzata, interazione, stato e tempistica. Mantieni i link come veri elementi anchor, non bloccare JS o CSS, preferisci SSR o prerendering per i contenuti che devono posizionarsi e controlla lo scorrimento infinito: una viewport di rendering alta può far indicizzare due pagine come una sola.

TL;DR — Google può eseguire il tuo JavaScript, quindi “Google può leggere JS?” è la domanda sbagliata. Le modalità di errore sono parità (DOM grezzo vs. renderizzato), interazione (Google non scorre né clicca), stato (il renderer è senza stato) e tempistica. Mantieni i link come veri anchor <a href>, non bloccare JS/CSS, carica in modo differito sul viewport non sull’interazione, restituisci stati reali per i 404 lato client e ricorda che un noindex grezzo può impedire il rendering prima che JavaScript possa rimuoverlo. Combina direttive che sono state effettivamente elaborate, ma non assumere un vincitore universale grezzo/renderizzato. Osserva lo scorrimento infinito in particolare: un viewport di rendering alto può attivare il loader e unire due URL in una sola pagina indicizzata. Per i dettagli interni del renderer e su quale modalità di rendering scegliere, vedi rendering.

Google è in grado di leggere JavaScript? Sì — non è questa la domanda

Google può eseguire il tuo JavaScript: i rischi reali sono parità, interazione, stato e tempistica. Fonte: /technical-seo/javascript-seo/

Tre fasi procedono da sinistra a destra: scansione, rendering e indicizzazione. La fase di rendering si dirama in quattro modalità di errore: parità, quando il DOM renderizzato può non corrispondere alle aspettative; interazione, quando il contenuto richiede uno scorrimento o un clic; stato, quando il contenuto dipende da cookie o archiviazione cancellati dal renderer; e tempistica, quando il contenuto è rinviato da JavaScript lento.

© Patrick Stox LLC · CC BY 4.0 ·

Google elabora le app JavaScript in tre fasi: “Google elabora le app web JavaScript in tre fasi principali: 1. Scansione 2. Rendering 3. Indicizzazione.” La fase intermedia esegue il tuo JS in una versione sempre aggiornata di Chrome headless per costruire il DOM che viene indicizzato. “Il rendering è importante perché i siti web spesso si affidano a JavaScript per portare contenuti alla pagina, e senza rendering Google potrebbe non vedere quel contenuto.”

Prova a sostegno di questa affermazione Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Ambito: Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Attendibilità: alta · Verificato: Google Search Central: Understand the JavaScript SEO basics

Quindi Google può eseguire il tuo JavaScript. Le domande utili sono più specifiche:

  • Parità — il DOM renderizzato contiene davvero ciò che pensi che contenga?
  • Interazione — qualcosa richiede uno scorrimento o un clic che Google non eseguirà?
  • Stato — stai facendo affidamento su cookie/localStorage che il renderer senza stato cancella?
  • Tempistica — il contenuto critico è rimandato dietro JavaScript lento o tardivo?

Per quanto riguarda i tempi nello specifico: Google mette in coda una pagina scansionata (che ha restituito un 200) per il rendering, e “la pagina potrebbe rimanere in questa coda per alcuni secondi, ma può volerci più tempo di così.” Non esiste un ritardo o un timeout fisso pubblicato — e una pagina che restituisce uno stato non-200, o che inizia con una direttiva noindex, può saltare la coda di rendering invece di attendere che JavaScript la modifichi.

Prova a sostegno di questa affermazione Google queues crawled pages with a 200 response for rendering; the page may stay in that queue for a few seconds but can take longer, with no published fixed delay or timeout, and non-200 or initial noindex responses may skip rendering. Ambito: Google Search's documented render-queue behavior; not a guaranteed or universal timing figure. Attendibilità: alta · Verificato: Google Search Central: Understand the JavaScript SEO basics

I meccanismi di come Google esegue il rendering — il Web Rendering Service, l’assenza di stato, la cache, il mito delle “due ondate” — sono trattati nella pagina rendering. Qui mi concentrerò sui problemi pratici e sulle soluzioni.

Questo è il bug JS-SEO singolo più comune. “Google può scoprire i tuoi link solo se sono elementi HTML <a> con un attributo href.” Un <div> cliccabile con un handler onclick è invisibile a Google come link — non verrà seguito, e le pagine che dipendono da esso per la scoperta possono rimanere non scansionate. È perfettamente accettabile iniettare link con JavaScript, purché finiscano come ancore <a href> reali nel DOM renderizzato. Quelle ancore renderizzate vengono analizzate dopo l’esecuzione di JavaScript, però — finire nel DOM renderizzato rende un link scopribile, ma non è una promessa che l’URL venga scansionato, indicizzato o trattato allo stesso modo di un link presente nell’HTML grezzo.

Prova a sostegno di questa affermazione Google can reliably discover links only when they are HTML anchor elements with an href attribute. Ambito: Link discovery by Google Search; this does not claim that every discovered URL will be crawled or indexed. Attendibilità: alta · Verificato: Google Search Central: Make your links crawlable

Contenuti con caricamento differito e subordinati all’interazione

Il renderer non si comporta come un utente curioso: “Google Search non interagisce con la tua pagina.” Nessuno scorrimento, nessun clic, nessun passaggio del mouse. Quindi qualsiasi contenuto che si carica solo su uno di questi eventi non verrà visto.

Linee guida di Google: carica il contenuto quando entra nel viewport, non quando l’utente agisce — “assicurati che la tua implementazione del caricamento differito carichi tutto il contenuto rilevante ogni volta che è visibile nel viewport,” e “non aggiungere il caricamento differito a contenuti che potrebbero essere immediatamente visibili quando un utente apre una pagina.” Usa IntersectionObserver o il nativo loading="lazy" per le immagini — mai un gestore di scorrimento o clic — così il contenuto viene caricato durante un rendering normale.

Prova a sostegno di questa affermazione Google Search does not interact with a page, so lazy-loaded content should load when it becomes visible in the viewport rather than requiring user interaction. Ambito: Google Search's documented rendering behavior for lazy-loaded content; other crawlers can behave differently. Attendibilità: alta · Verificato: Google Search Central: Fix lazy-loaded content

Scorrimento infinito: quando due pagine vengono indicizzate come una sola

La viewport di rendering alta di Google può attivare un caricatore a scorrimento infinito e unire due pagine in un solo URL indicizzato. Fonte: /technical-seo/javascript-seo/

Una normale viewport del browser si ferma dopo la prima pagina, mentre la viewport di rendering di Google si estende molto più in basso. L'estensione raggiunge un trigger dello scorrimento infinito, avvia il caricatore senza un vero scorrimento dell'utente e aggiunge la pagina successiva allo stesso DOM. Google indicizza quindi il contenuto di entrambe le pagine sotto un unico URL.

© Patrick Stox LLC · CC BY 4.0 ·

Questo è il punto che quasi nessuno spiega, e vale l’intera sezione.

Googlebot può eseguire il rendering con un viewport considerevolmente più alto rispetto a una finestra del browser tipica. Google non pubblica una dimensione esatta del viewport di rendering — e può cambiare — quindi non progettare in base a un numero specifico; testa invece la tua implementazione. Ciò che conta è il meccanismo: se il tuo loader di scorrimento infinito si attiva in base alla posizione di scorrimento o all’altezza del viewport, un viewport di rendering più alto del previsto può attivare il loader durante il rendering stesso — e il contenuto del prossimo articolo o della pagina prodotto viene aggiunto nello stesso DOM. Ora il contenuto di due URL distinti è stato renderizzato insieme, e Google può indicizzarli come una pagina. Nella mia esperienza, “a volte, due pagine vengono indicizzate come una” — ho avuto pagine segnalate come “non indicizzate” che erano in realtà indicizzate come parte di un’altra pagina (di solito il post precedente nel feed), perché “quando Google ha ridimensionato il viewport per renderlo più lungo … ha attivato lo scorrimento infinito e ha caricato un altro articolo durante il rendering.” Conferma se la tua configurazione fa questo controllando l’HTML renderizzato nell’URL Inspection per una pagina che ti aspetteresti si fermi prima — non assumere una dimensione e non dare per scontato di essere al sicuro.

Ci sono due livelli per fare questo nel modo giusto.

Rendi lo scorrimento infinito indicizzabile fin dall’inizio. Supporta il caricamento paginato sotto lo scorrimento infinito. Ogni blocco dovrebbe avere “il proprio URL univoco e persistente,” il contenuto su ciascun URL dovrebbe rimanere lo stesso a ogni caricamento, dovresti evitare parametri relativi come ?date=yesterday, dovresti “collegare in sequenza agli URL individuali così che i motori di ricerca possano scoprire gli URL in un set paginato,” e quando un nuovo blocco viene caricato durante lo scorrimento dovresti “aggiornare l’URL visualizzato usando la History API.” Usa veri link di paginazione <a href> e URL univoci — “non usare identificatori di frammento URL” (la parte dopo un #) per i numeri di pagina, perché Google li ignora. Come dico nella mia guida SEO per JavaScript, “se hai una configurazione con scorrimento infinito, consiglio comunque una versione paginata della pagina così che Google possa ancora eseguire la scansione correttamente.”

Se un loader difettoso sta attivamente unendo le pagine, la soluzione più rapida è drastica: “blocca il file JavaScript che gestisce lo scorrimento infinito così la funzionalità non può attivarsi.” Se il loader non può eseguire durante il rendering, non può aggiungere il contenuto della pagina successiva, e ogni URL viene renderizzato come sé stesso di nuovo.

Soft-404 dopo il routing lato client

Le app a pagina singola possono sostituire i contenuti senza modificare il codice di stato HTTP, quindi una vista “non trovato” può comunque restituire 200. Google potrebbe classificare quella risposta come soft 404 dopo aver valutato il contenuto restituito, ma un fetch statico da solo non può dimostrare che Google abbia effettuato quella classificazione. Due soluzioni: naviga con l’History API e, per uno stato di non trovato reale, instrada verso un URL che restituisce un vero codice 404 oppure aggiungi un tag noindex. E non affidarti ai frammenti URL per il routing — “lo schema di scansione AJAX è stato deprecato dal 2015, quindi non puoi contare sui frammenti URL per funzionare con Googlebot.”

Un reindirizzamento lato client presenta lo stesso problema di evidenza: la risposta iniziale può rimanere 200 finché JavaScript non viene eseguito. Google supporta i reindirizzamenti JavaScript solo come fallback quando i reindirizzamenti lato server o meta-refresh non sono possibili. Segnala separatamente lo stato statico e la navigazione renderizzata osservata; non riscrivere lo stato HTTP nell’audit né chiamare ogni modifica dell’URL renderizzato un reindirizzamento.

Non bloccare JavaScript o CSS in robots.txt

Google non eseguirà il rendering di JavaScript da file bloccati o su pagine bloccate. Una regola robots.txt che disallowa il tuo bundle (o la directory /_next/, /static/, /assets/ in cui risiede) può compromettere completamente il rendering — Google recupera la shell, non riesce a eseguire gli script e indicizza una pagina vuota. Controlla le risorse della pagina nell’URL Inspection per qualsiasi elemento bloccato.

Parità DOM e direttive robots sensibili allo stadio

Confronta il tuo HTML grezzo (Visualizza sorgente) con l’HTML renderizzato (Ispezione URL). I contenuti presenti solo nell’HTML renderizzato vengono comunque indicizzati — se vengono renderizzati. I contenuti assenti in entrambi non esistono per Google.

C’è un rischio legato all’ordine delle fasi che Google documenta direttamente: “Quando Google incontra il tag noindex, può saltare il rendering e l’esecuzione di JavaScript, il che significa che usare JavaScript per modificare o rimuovere il tag robots meta da noindex potrebbe non funzionare come previsto.” Se il tuo HTML grezzo include un noindex iniziale che intendevi sostituire con JavaScript, Google può agire su quel noindex grezzo e non eseguire mai lo script che lo avrebbe rimosso.

Non trasformare questo in una regola universale del tipo “vince il rendering”. La riconciliazione è specifica per campo:

CampoCosa può stabilire il confronto tra HTML grezzo e renderizzato
Contenuto principale e linkGoogle può utilizzare contenuti e link reali <a href> prodotti durante il rendering se questo riesce. La disponibilità nell’HTML grezzo riduce tale dipendenza.
Titolo e descrizioneGoogle può elaborare metadati impostati tramite JavaScript, ma i link del titolo e gli snippet vengono selezionati da più fonti. Mostra entrambi gli stati; non affermare che il valore renderizzato, il primo o l’ultimo sia garantito.
Direttive robotsUn noindex nell’HTML grezzo può indurre Google a saltare il rendering, quindi la rimozione tramite JavaScript potrebbe non essere mai vista. Aggiungere restrizioni successivamente non è prova che una restrizione precedente sia stata annullata.
CanonicalLe linee guida su JavaScript di Google sconsigliano di impostare un valore nella sorgente e poi modificarlo con JavaScript. Usa un unico metodo e verifica una sola dichiarazione nell’head renderizzato.
Stato HTTP e reindirizzamentoJavaScript non può modificare lo stato della risposta già ricevuto. Registra lo stato statico e qualsiasi navigazione renderizzata osservata come fatti separati.

Questa matrice è il motivo per cui un revisore dovrebbe mantenere distinti lo stato di origine, quello renderizzato, quello delle intestazioni di risposta e quello osservato nella ricerca, invece di comprimerli in un unico valore “effettivo”.

Scegli una modalità di rendering che inserisca i contenuti nel DOM

La maggior parte del rischio SEO legato a JavaScript dipende da come viene prodotto l’HTML. In breve: SSR, rendering statico/pre-rendering e idratazione inseriscono i contenuti nel DOM (o li inseriscono rapidamente), riducendo quanto la tua visibilità dipenda dal successo del renderer; il rendering completamente lato client lascia più peso al completamento corretto e puntuale del rendering, ogni volta. Il rendering dinamico è una soluzione temporanea, non un’opzione equivalente — secondo le linee guida di Google aggiornate a dicembre 2025, viene descritto come un espediente anziché come una soluzione a lungo termine, e Google raccomanda invece rendering lato server, rendering statico o idratazione. Come ho scritto nella mia guida SEO su JavaScript, “qualsiasi configurazione con SSR, rendering statico e pre-rendering andrà bene per i motori di ricerca.” Il menu completo — CSR, SSR, SSG, idratazione, ISR, edge, streaming e rendering dinamico — con una tabella dei compromessi è nella pagina rendering. Google descrive separatamente il rendering lato server o il pre-rendering come una buona idea per utenti e crawler. Prova a sostegno di questa affermazione Google describes server-side rendering or pre-rendering as a good idea because it makes a website faster for users and crawlers. Ambito: Google Search guidance for JavaScript sites; the source does not prescribe one framework or guarantee indexing. Attendibilità: alta · Verificato: Google Search Central: Understand the JavaScript SEO basics

Come testare

L’ispezione URL in Search Console è il riferimento principale: esegui un test in tempo reale, poi esamina l’HTML renderizzato, lo screenshot e le risorse della pagina / messaggi della console per vedere cosa è stato caricato e cosa ha fallito. Il Rich Results Test offre un rapido controllo dell’HTML renderizzato. Su larga scala, usa un crawler che esegue JavaScript (Ahrefs Site Audit, Screaming Frog in modalità rendering JS) per confrontare l’HTML grezzo con quello renderizzato su tutto il sito.

Un confronto del rendering è diagnostico, non un punteggio: indaga gli elementi essenziali che compaiono solo dopo JavaScript o scompaiono dopo il rendering.

Una pagina illustrativa ha 1 titolo sia nell'HTML grezzo sia in quello renderizzato, 18 intestazioni nell'HTML grezzo e 19 nel renderizzato, 42 link interni nell'HTML grezzo e 71 nel renderizzato, 0 descrizioni di prodotto nell'HTML grezzo e 12 nel renderizzato, e 6 tag canonical nell'HTML grezzo ma solo 1 nel renderizzato. Questi conteggi sono sintetici.

JavaScript non è dannoso per la SEO, e non è nemmeno malvagio. È solo diverso da ciò a cui molti specialisti SEO sono abituati. Collabora con i tuoi sviluppatori, porta i tuoi contenuti importanti nel DOM, e lascia che siano gli strumenti di Google — non le tue supposizioni — a decidere cosa viene renderizzato.

Dove andare dopo: il cluster SEO per JavaScript

Questo hub è la mappa. Ogni argomento qui sotto è un approfondimento a sé:

Rendering e architettura

  • SEO per un CMS headless — come i frontend disaccoppiati influenzano la scansione, il rendering, i metadati, le sitemap e i tag canonical; quale modalità di rendering scegliere; e le modalità di errore specifiche delle architetture headless che devi conoscere.

Guide specifiche per framework

  • SEO per React — perché React con CSR-first crea rischi di indicizzazione, come Google esegue il rendering delle app React, React Router e History API, react-helmet-async per i meta tag e quando passare a Next.js.
  • SEO per Angular — le impostazioni predefinite SPA di Angular, @angular/ssr (il successore di Angular Universal), i servizi integrati Title e Meta, il prerendering e l’idratazione incrementale in Angular moderno.
  • SEO per Next.js — Pages Router vs App Router, Metadata API, next/image e CWV, tempistiche ISR e Googlebot, sitemap e gli errori SEO più comuni con Next.js.
  • SEO per Nuxt — SSR per impostazione predefinita, useSeoMeta(), le modalità di rendering di Nuxt, l’ecosistema di moduli @nuxtjs/seo e come Nuxt si confronta con Vue semplice per l’indicizzabilità.
  • SEO per Vue — l’impostazione predefinita CSR di Vue 3 e cosa significa per i crawler, createWebHistory(), @unhead/vue, opzioni di prerendering senza meta-framework e quando Nuxt è la scelta giusta.
  • SEO per Svelte — Svelte vs SvelteKit, SSR per impostazione predefinita in SvelteKit, <svelte:head>, la trappola adapter-static + ssr: false, scelte degli adapter e implicazioni per i crawler AI.
  • SEO per Astro — zero-JS per impostazione predefinita, architettura a isole, @astrojs/sitemap, astro:assets, View Transitions e History API, comportamento di fallback delle Server Islands e vantaggi di Astro per i Core Web Vitals.

Aggiungi una nota dell’esperto

Fissa una citazione dell’esperto

Persona nuova? Crea il suo profilo non rivendicato in /admin/experts/ → Fissa una citazione dell’esperto prima.