動態

詳情 返回 返回

在 Astro 博客中優雅使用 51.la 統計數據 - 動態 詳情

作為老牌網站流量統計服務商,51.la 提供每月高達 1000 萬次的免費統計額度,非常適合個人博客或小型網站使用。不過,51.la 默認的統計展示是通過嵌入 JS 文件自動渲染的,這種展示方式對美觀性和自定義性有限,對於追求頁面整潔或者想要自己設計展示風格的博主來説不太方便。

我之所以想自己處理 51.la 的統計,是因為我希望更直觀地看到有多少人訪問我的博客,瞭解訪客的訪問情況,從而改進內容和佈局。經過嘗試,我找到了一個方法:解析 51.la 的 widget JS 數據,自行在 Astro 中渲染統計數據,既保留統計功能,又可以完全控制展示效果。下面分享我的完整經驗。


配置文件管理

在 Astro 中,一般會有一個全局配置文件,用來集中管理各種配置。我們可以把 51.la 的相關信息放在一起,示例:

export const metrics: { enable: boolean; sdk: string; id: string; ck: string; widget: string } = {
  // 51.la 統計開關
  enable: true,
  // 統計網站的配置信息,在後台獲取
  // See: https://v6.51.la/report/setup/params/statistics
  sdk: 'https://sdk.51.la/js-sdk-pro.min.js',
  id: 'xxxxxxxxxxxxxxxx',
  ck: 'xxxxxxxxxxxxxxxx',
  // 數據掛件 javascript 地址
  // See: https://v6-widget.51.la/v6/xxxxxxxxxxxxxxxx/quote.js
  widget: 'https://v6-widget.51.la/v6/xxxxxxxxxxxxxxxx/quote.js'
}

如果你的項目中沒有配置文件,可以在 src 下創建一個 TS 文件,然後在 tsconfig.jsonpaths 中添加,例如:

"@/site-config": ["src/site.config.ts"]

這樣,在 Astro 頁面中就可以直接引入:

---
import { metrics } from '@/site-config'
---
集中管理配置的好處是,一旦需要修改統計信息,只需改一處即可,方便維護。

在入口加載統計

為了統計用户訪問情況,我們需要在頁面入口加載 51.la 的 SDK。不同主題的入口文件可能不同,Astro 默認的入口是 src/layouts/Layout.astro。如果不確定,可以從 pages/index.astro 開始反推去找包含完整 HTML 結構的佈局文件。在佈局文件的 <head> 中加入:

{metrics.enable && <script is:inline src={metrics.sdk} />}
<script is:inline type='module' data-astro-rerun define:vars={{ metrics: metrics }}>
  if (metrics.enable) {
    LA.init({ id: metrics.id, ck: metrics.ck })
  }
</script>
注意:對應的文件頂部需要引入配置:import { metrics } from '@/site-config'

這樣,每次用户訪問頁面時都會觸發 51.la 的統計,後台就能記錄訪客數據。


創建數據展示組件

為了美觀,我們可以自己在 components 裏創建一個組件(例如 Metrics.astro)來展示數據,這樣就不依賴 51.la 默認的 JS 渲染。示例:

---
import { metrics } from '@/site-config'
---

<div id='widget'>
  加載中...
</div>

<script is:inline type='module' data-astro-rerun define:vars={{ metrics: metrics }}>
  if (metrics.enable && metrics.widget) {
    fetch(metrics.widget)
      .then((res) => res.text())
      .then((data) => {
        let num = data.match(/(<\/span><span>).*?(\/span><\/p>)/g)
        if (!num) {
          console.warn('51.la 數據匹配失敗')
          return
        }
        num = num.map((el) => el.replace(/(<\/span><span>|<\/span><\/p>)/g, ''))
        const titles = [
          '最近活躍',
          '今日人數',
          '今日訪問',
          '昨日人數',
          '昨日訪問',
          '本月訪問',
          '總訪問量'
        ]
        const container = document.getElementById('widget')
        let html = ''
        for (let i = 0; i < num.length; i++) {
          html += `<div>標題:${titles[i]}</div>`
          html += `<div>內容:${num[i]}</div>`
        }
        container.innerHTML = html
      })
      .catch((err) => {
        console.error('51.la 數據獲取失敗:', err)
        document.getElementById('widget').innerHTML = '加載失敗'
      })
  }
</script>
樣式可以根據自己的需求進行美化,例如網格佈局、卡片樣式等。這裏的重點是把數據準確展示出來,讓訪客統計信息可視化。

總結

通過這種方式,你可以:

  • 保留 51.la 的統計功能,無需自己搭建後端統計系統。
  • 自定義統計數據顯示方式,讓數據展示更美觀、更符合博客風格。
  • 在 Astro 項目中簡單集成,配置和組件化管理清晰。

我之所以選擇自己解析 widget 數據,是希望在博客上直觀看到訪客情況,瞭解每天有多少人訪問、哪些內容更受歡迎。這樣可以更有針對性地優化博客內容,同時也享受了 51.la 提供的免費統計額度。

注意:如果 51.la 的 widget JS 結構有改動,正則匹配可能需要更新。但在目前版本下,這種方法非常穩妥。

這樣,你就可以既“白嫖” 51.la 免費流量統計,又能自由控制數據展示效果,同時清楚瞭解自己的博客訪問情況。

可以來我的博客查看效果:hejunjie.life

user avatar motianlun_5d0766992e67a 頭像 yanwushu 頭像 vistart 頭像 dadebinglin 頭像 ahfuzhang 頭像 chat2db 頭像
點贊 6 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.