Astro è il più facile di questi su cui installare e ha un dettaglio controintuitivo: il tag va nel <head>, non prima del tag </body> di chiusura come dicono le istruzioni generali. Non è una preferenza. È quello che fa sopravvivere il tag a una navigazione lato client, e la ragione è in fondo a questa pagina.

Vai prima a prendere lo snippet dalla tua dashboard. Ha questo aspetto, con il tuo identificativo di sito nel percorso:

<script src="https://t.skomi.com/s/your-site-id.js" defer></script>

Mettilo nel layout condiviso

In qualunque layout usino tutte le pagine (di solito src/layouts/Layout.astro), dentro il <head>:

---
// src/layouts/Layout.astro
---
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <slot name="head" />
    <script is:inline defer src="https://t.skomi.com/s/your-site-id.js"></script>
  </head>
  <body>
    <slot />
  </body>
</html>

is:inline conta. Astro elabora i tag <script> (li mette in pacchetti, li converte in moduli, compila il TypeScript) per qualunque tag il cui unico attributo sia src. is:inline gli dice di rendere il tag dentro l'HTML esattamente com'è scritto, che è quello che vuoi per uno script servito dal dominio di qualcun altro. (Anche qualunque altro attributo aggiunge implicitamente is:inline, quindi il defer qui sopra lo farebbe da solo; scriverlo dice quello che intendevi.)

Se usi <ClientRouter />

Astro di serie è un'applicazione a più pagine: ogni navigazione è un caricamento di pagina vero, e non c'è altro a cui pensare.

Aggiungi <ClientRouter /> (le transizioni di vista) e diventa un router lato client. Skomi se ne occupa senza nessun aiuto: il router naviga con history.pushState (e con replaceState, dove un collegamento glielo chiede), e lo script di Skomi li avvolge tutti e due e ascolta popstate, quindi ogni navigazione è una pagina vista. La pagina che si sta lasciando viene chiusa per prima, quindi il suo tempo sulla pagina appartiene a lei invece che alla successiva.

Non aggiungere data-astro-rerun a questo tag. Quell'attributo esiste per costringere uno script in linea a girare di nuovo dopo ogni transizione, che qui vuol dire avviare il tracker una seconda, una terza e una quarta volta, e contare ogni visita altrettante volte. Lascialo perdere.

Perché l'intestazione, e non prima di </body>

La documentazione di Astro è precisa su che cosa una transizione di vista fa al documento, e le due metà sono trattate al contrario:

  • Il <body> viene sostituito del tutto con il corpo della pagina nuova.
  • Nel <head>, «gli script restano se esistono sulla pagina nuova».

Quindi un tag alla fine del corpo viene tolto e reinserito a ogni singola navigazione (cosa che lo fa girare di nuovo), mentre lo stesso tag nell'intestazione di un layout condiviso da tutte le pagine viene riconosciuto come già presente e lasciato stare. Gira una volta, al primo caricamento, e da lì continua a funzionare.

Su un sito senza <ClientRouter /> le due posizioni si comportano in modo identico, quindi l'intestazione è la risposta giusta in entrambi i casi e non c'è niente da cambiare se aggiungi le transizioni di vista più avanti.

Controlla che funzioni

Carica una pagina sul dominio vero, naviga verso una seconda pagina, e poi torna alla prima. Dovresti vedere tre pagine viste, una per navigazione, non sei. Sei vuol dire che il tag viene rieseguito, che vuol dire che sta nel corpo o che porta data-astro-rerun.

Se non arriva proprio niente, vedi che cosa controllare quando lo snippet non funziona.

Due cose che sembreranno rotte e non lo sono

Da localhost non si raccoglie niente. Il tuo indirizzo di sviluppo non è il dominio che hai registrato, quindi i registri che arrivano da lì sono rifiutati dalla verifica dell'origine. Pubblica sul dominio vero, o su un suo sottodominio, e guarda lì.

Una Content Security Policy lo blocca finché non le dici di no. Lo script e i dati che manda usano un solo host:

script-src  https://t.skomi.com
connect-src https://t.skomi.com