Skip to content

Astro中使用umami配置shareUrl后,页面使用<script is:inline> 存在script 加载顺序问题 #1

Description

@whynotsnow
// astro.config.mjs 配置
umami({
		shareUrl:
			"https://cloud.umami.is/analytics/us/share/xxxx",
	})
<script is:inline>
	async function fetchSiteStats() {
		const container = document.querySelector(".umami-stats-container");

		// oddmisc 未加载则隐藏
		if (!window.oddmisc) {
			container?.classList.add("hidden");
			return;
		}

		try {
			const stats = await window.oddmisc.getSiteStats();
			const pageViews = stats.pageviews || 0;
			const visits = stats.visits || 0;

			// 数据为 0 时隐藏
			if (pageViews === 0 && visits === 0) {
				container?.classList.add("hidden");
				console.warn("oddmisc on pageviews data", stats);
				return;
			}

			container?.classList.remove("hidden");
			document.querySelectorAll(".site-stats-display").forEach((el) => {
				el.textContent = generateStatsText(pageViews, visits);
			});
		} catch (error) {
			console.error("Error fetching site stats:", error);
			container?.classList.add("hidden");
		}
	}

if (document.readyState === "loading") {
	document.addEventListener("DOMContentLoaded", () => fetchSiteStats());
} else {
	fetchSiteStats();
}
<script />

页面初始化时,window.oddmisc还没有执行完毕获取不到oddmisc导致后续逻辑不执行
建议如下
提供专属的事件订阅

// https://github.com/yCENzh/oddmisc/blob/main/src/runtime/client.ts
export function initUmamiRuntime(config: UmamiRuntimeConfig): void {
  if (!config.shareUrl) {
    console.log('[oddmisc] shareUrl 未配置,跳过初始化');
    mountEmptyClient();
    return;
  }

  try {
    const client = new UmamiRuntimeClient(config);

    (window as any).oddmisc = (window as any).oddmisc || {};
    (window as any).oddmisc.umami = client;
    (window as any).oddmisc.getStats = (path?: string) => client.getStats(path);
    (window as any).oddmisc.getSiteStats = () => client.getSiteStats();
    (window as any).oddmisc.getPageStats = (path: string) => client.getPageStats(path);
    (window as any).oddmisc.clearCache = () => client.clearCache();

   // 新增专属订阅事件,并传入client
    window.dispatchEvent(
      new CustomEvent("oddmisc-ready", {
        detail: {
          client
        }
      })
    );
    
    console.log('[oddmisc] Umami runtime client initialized');
  } catch (error) {
    console.warn('[oddmisc] 初始化失败:', error instanceof Error ? error.message : error);
    mountEmptyClient();
  }
}

在astro页面监听可以这样,不需要污染全局对象window

<script is:inline>
    window.addEventListener("oddmisc-ready", (event) => {
      const e = event as OddmiscReadyEvent;
      const client = e.detail.client;
    
      client.getSiteStats().then(console.log);
    });
<script />

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions