From 7253557d2c5e3ee6ff2f093068cd6beac6defe6d 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 });