From be8554c40778409d1c0ae21202f323bf7c4cc250 Mon Sep 17 00:00:00 2001 From: Wen Taichi Date: Tue, 8 Jul 2025 10:52:49 +0800 Subject: [PATCH] fix(goatcounter): properly count SPA page hits (#2035) 1. Should not create new instance after count.js, as it already setup an instance. 2. Script block would be removed when navigating with SPA, and it cause count.js can not find endpoint by query. The solution is to set endpoint manually. --- quartz/plugins/emitters/componentResources.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts index 5fdc5c2..61e2ba8 100644 --- a/quartz/plugins/emitters/componentResources.ts +++ b/quartz/plugins/emitters/componentResources.ts @@ -135,15 +135,19 @@ function addGlobalPageResources(ctx: BuildCtx, componentResources: ComponentReso `) } else if (cfg.analytics?.provider === "goatcounter") { componentResources.afterDOMLoaded.push(` + const goatcounterScriptPre = document.createElement('script'); + goatcounterScriptPre.textContent = \` + window.goatcounter = { no_onload: true }; + \`; + document.head.appendChild(goatcounterScriptPre); + + const endpoint = "https://${cfg.analytics.websiteId}.${cfg.analytics.host ?? "goatcounter.com"}/count"; const goatcounterScript = document.createElement('script'); goatcounterScript.src = "${cfg.analytics.scriptSrc ?? "https://gc.zgo.at/count.js"}"; goatcounterScript.defer = true; - goatcounterScript.setAttribute( - 'data-goatcounter', - "https://${cfg.analytics.websiteId}.${cfg.analytics.host ?? "goatcounter.com"}/count" - ); + goatcounterScript.setAttribute('data-goatcounter', endpoint); goatcounterScript.onload = () => { - window.goatcounter = { no_onload: true }; + window.goatcounter.endpoint = endpoint; goatcounter.count({ path: location.pathname }); document.addEventListener('nav', () => { goatcounter.count({ path: location.pathname });