O Astro é o mais fácil destes para instalar e tem um pormenor contraintuitivo: a etiqueta vai no <head>, e não antes da etiqueta </body> de fecho como dizem as instruções gerais. Isto não é uma preferência. É o que faz a etiqueta sobreviver a uma navegação do lado do cliente, e a razão está no fim desta página.

Vai buscar primeiro o fragmento ao teu painel. Tem este aspeto, com o teu próprio identificador de sítio no caminho:

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

Põe-no no layout partilhado

No layout que todas as páginas usam (normalmente o src/layouts/Layout.astro), dentro do <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>

O is:inline importa. O Astro processa as etiquetas <script> (junta-as num pacote, converte-as em módulos, compila TypeScript) em qualquer etiqueta cujo único atributo seja o src. O is:inline diz-lhe para apresentar a etiqueta no HTML exatamente como está escrita, que é o que queres para um script servido a partir do domínio de outra pessoa. (Qualquer outro atributo também acrescenta implicitamente o is:inline, portanto o defer acima já o faria sozinho; escrevê-lo diz o que querias dizer.)

Se usas o <ClientRouter />

O Astro é de origem uma aplicação de várias páginas: todas as navegações são um carregamento de página verdadeiro, e não há mais nada em que pensar.

Acrescenta o <ClientRouter /> (transições de vista) e passa a ser um encaminhador do lado do cliente. A Skomi trata disso sem ajuda nenhuma: o encaminhador navega com history.pushState (e replaceState, quando uma ligação lho pede), e o script da Skomi embrulha os dois e escuta o popstate, portanto cada navegação é uma página vista. A página que se está a deixar é fechada primeiro, portanto o tempo nela pertence-lhe a ela em vez de à seguinte.

Não acrescentes data-astro-rerun a esta etiqueta. Esse atributo existe para forçar um script embutido a correr outra vez depois de cada transição, o que aqui quer dizer arrancar o rastreador uma segunda, terceira e quarta vez, e contar todas as visitas outras tantas vezes. Deixa-o de fora.

Porquê o cabeçalho, e não antes do </body>

A documentação do Astro é precisa quanto ao que uma transição de vista faz ao documento, e as duas metades são tratadas ao contrário uma da outra:

  • O <body> é completamente substituído pelo corpo da página nova.
  • No <head>, "os scripts ficam se existirem na página nova".

Portanto uma etiqueta no fim do corpo é removida e reinserida em cada navegação (o que a faz correr de novo), enquanto a mesma etiqueta no cabeçalho de um layout que todas as páginas partilham é reconhecida como já presente e deixada em paz. Corre uma vez, no primeiro carregamento, e continua a funcionar a partir daí.

Num sítio sem <ClientRouter /> as duas posições comportam-se de forma idêntica, portanto o cabeçalho é a resposta certa em qualquer dos casos e não há nada para mudar se acrescentares transições de vista mais tarde.

Confirma que está a funcionar

Carrega uma página no domínio verdadeiro, navega para uma segunda página, e depois volta à primeira. Devias ver três páginas vistas, uma por navegação, não seis. Seis quer dizer que a etiqueta está a ser executada de novo, o que quer dizer que está no corpo ou que traz data-astro-rerun.

Se não chegar rigorosamente nada, vê o que verificar quando o fragmento não funciona.

Duas coisas que vão parecer partidas e não estão

Não se recolhe nada do localhost. O teu endereço de desenvolvimento não é o domínio que registaste, portanto os registos vindos dali são recusados pela verificação de origem. Publica no domínio verdadeiro, ou num subdomínio dele, e olha lá.

Uma Política de Segurança de Conteúdo bloqueia-o enquanto não lhe disseres que não. O script e os dados que ele envia usam um único anfitrião:

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