Come funziona questo controllo
Scanaris scarica l'HTML della tua pagina così come lo serve il server, senza eseguire JavaScript, gli toglie script, stili, tag noscript, template e SVG, e misura quanto testo visibile resta nel body. Apre un rilievo, di gravità media, solo se si verificano due condizioni insieme: quel testo ha meno di 250 caratteri e l'HTML contiene un contenitore vuoto di single-page app, cioè un <div> con id root, app, __next, __nuxt o q-app senza nulla dentro. Un sito con rendering lato server o generazione statica ha testo nell'HTML iniziale e non viene mai segnalato; un sito con poco contenuto ma senza contenitore SPA nemmeno. La soglia è deliberatamente bassa per non dare falsi positivi.
Perché è importante
Googlebot esegue JavaScript, ma in un secondo passaggio che può richiedere giorni e con un budget limitato. I crawler degli assistenti IA (GPTBot, ClaudeBot, PerplexityBot) in genere non lo eseguono affatto: leggono l'HTML che ricevono e basta. Se il tuo HTML è un <div id="root"></div> e uno script, per loro il tuo sito è vuoto. Non possono indicizzare ciò che non vedono né citare ciò che non leggono, quindi quando qualcuno chiede a ChatGPT della tua categoria di prodotto, tu non esisti. È il problema più comune dei siti fatti con strumenti di IA che generano un'applicazione React o Vue puramente client, e il più invisibile, perché nel browser tutto appare perfetto.
Come risolvere
- Attiva il rendering lato server. In Nuxt è attivo di default (
ssr: true); se l'hai disattivato, riattivalo. In Next.js, l'App Router renderizza sul server a meno che tu non marchi il componente con'use client'in cima. In Vite con React o Vue puri non c'è SSR: passa a Next.js, Remix, Nuxt o Astro, oppure genera le pagine pubbliche come HTML statico. - Se migrare non è un'opzione, prerenderizza: genera l'HTML delle rotte pubbliche al momento del build (Nuxt
nitro.prerender, export statico di Next.js, Astro di default) o usa un servizio di prerendering che serva HTML renderizzato ai bot. - Come minimo, metti il contenuto essenziale nell'HTML: il titolo, la descrizione di cosa fai e i link principali, anche se l'applicazione li sostituisce al caricamento. È ciò che vedranno i bot.
- Controlla le pagine che contano, non solo la home: il blog e le pagine prodotto sono quelle che gli assistenti citano.
Verifica che sia risolto
curl -s https://tuodominio.it | sed -e 's/<script[^>]*>.*<\/script>//g' -e 's/<[^>]*>/ /g' | tr -s ' \n' ' ' | wc -c
Se il risultato si ferma a qualche decina di caratteri, il contenuto lo disegna JavaScript. Dovrebbe contarne migliaia. Un altro modo: nel browser, disattiva JavaScript negli strumenti per sviluppatori e ricarica; ciò che vedi è ciò che vedono i bot.
Domande frequenti
Google mi indicizza bene. Perché dovrebbe importarmi?
Perché sempre più persone chiedono a un assistente invece di cercare, e quegli assistenti non eseguono il tuo JavaScript. E perché anche su Google, il rendering differito ritarda di giorni l'indicizzazione delle tue modifiche. I numeri e i motivi sono in perché le app fatte con l'IA sono invisibili all'IA.
La mia app è un pannello privato dietro login. Mi riguarda?
No: ciò che sta dietro autenticazione non deve essere indicizzato. Questo controllo conta per le pagine pubbliche, quelle che vuoi far apparire. Se il tuo sito è solo il pannello più una landing, fa' che la landing sia HTML.
Ho SSR e comunque esce poco testo.
Allora l'HTML porta struttura ma poco contenuto reale, e conviene verificare che la landing racconti qualcosa. Le intestazioni che organizzano quel contenuto le guarda intestazioni.