// 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 />
页面初始化时,window.oddmisc还没有执行完毕获取不到oddmisc导致后续逻辑不执行
建议如下
提供专属的事件订阅
在astro页面监听可以这样,不需要污染全局对象window