From 569be924f663ef5e5e9910cc5a2999d796160245 Mon Sep 17 00:00:00 2001 From: Wen Taichi Date: Mon, 30 Jun 2025 04:09:58 +0800 Subject: [PATCH] fix(goatcounter): properly count SPA page hits 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 5fdc5c27b..61e2ba858 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 });