用 Cloudflare KV 與 Hono 強化 ShareThis:建構彈性分享統計系統

作者: Calpa Liu
字數:3035
出版:2025 年 5 月 3 日
想讓 ShareThis 分享按鈕擁有更多彈性與控制權?本教學將教你如何用 Cloudflare Workers 的 KV 資料庫與 Hono 框架,打造一個可擴充的後端 API。不只能保留原有分享數據,更支援快取、資料追蹤與訪問統計,幫助你打造真正可維護的分享統計系統。

認識 Cloudflare Workers KV 的運作原理

Cloudflare Workers KV 是一套全球分佈式的鍵值儲存服務,具備極低延遲與高吞吐量的特性。資料初次寫入時會儲存在中央資料中心,隨後讀取將自動快取到邊緣節點,實現快速回應。特別適用於讀取密集的場景,例如分享計數、使用者偏好或動態設定。Cloudflare 近期也針對 KV 架構進行優化,讀取效能提升達三倍以上。

為何選擇 Hono?最適合邊緣運算的輕量框架

Hono 是一款專為 Cloudflare Workers 等邊緣運算環境打造的輕量級 Web 框架,最小預設僅約 12KB,完全基於 Web 標準 API 實現,沒有任何額外依賴。這確保了應用極度輕盈、兼容性高,同時大幅降低了安全風險與版本衝突問題,非常適合資源有限且對性能有高要求的應用場景。

Hono 原生支援 TypeScript,提供完善的類型安全體驗。其上下文(context)設計讓與 Cloudflare 綁定(bindings)和其他服務的整合變得簡單直觀,極大提升了開發效率,也讓開發者能夠放心構建穩健且可維護的系統。

了解了 Cloudflare Workers KV 的運作原理與 Hono 框架的設計哲學後,接下來,我們將動手實作一個常見又實用的小功能:文章分享次數統計 API。這個例子不只能讓你熟悉 Hono 的路由與綁定機制,更能實際體會 Workers KV 如何作為後端資料儲存的基礎。整個教學將從環境建置開始,逐步帶你完成後端 API、前端串接、部署上線與效能優化,適合想快速上手的開發者。

先談 ShareThis:為什麼我還需要額外補充一套分享 API?

在許多內容型網站中,「文章被分享的次數」常被視為一項重要的互動指標,不僅能展現內容的熱門程度,也有助於內容分發與社群傳播。市面上最常見的分享按鈕元件之一是 ShareThis,它提供可嵌入網站的按鈕 UI,並內建支援 Facebook、Line、Twitter 等平台的社群分享。更便利的是,ShareThis 提供一組公開 API(get_counts),讓開發者能針對特定 URL 取得目前的總分享次數,無需額外與各社群平台整合。

不過,這樣的雲端服務雖然好用,卻也有其限制:例如 ShareThis 並不會記錄 API 的請求時間或來源,無法與你自家的資料庫整合;它的統計也無法做分群分析或搭配後台行銷工具使用,對於需要深度洞察的內容經營者來說不夠彈性。因此,透過自建 Cloudflare Workers KV + Hono 的 API,我們可以保留 ShareThis 現有的分享數據,同時補強資料主權與擴充能力,打造一套兼具快取效率與可維護性的分享統計系統。

建立分享計數 API:後端程式碼實作教學

這一節將詳細說明如何利用 Hono 框架與 Cloudflare Workers KV,這不是取代 ShareThis,而是補足它無法涵蓋的部分。接下來將介紹基本的端點設計、資料流程以及核心程式碼實作步驟,幫助你快速上手並完成後端服務。

我的部落格實際上採用了 ShareThis 的分享按鈕元件,讓讀者能夠輕鬆一鍵分享到 Facebook、Line 等社群平台,同時也利用其 get_counts API 擷取每篇文章的總分享次數。這雖然帶來便利,但 ShareThis 的資料格式和功能仍有一些限制,例如無法串接自家的資料庫進行統一分析,也無法記錄 API 被觸發的時間、身份或來源,更難以做進一步的自訂擴充(如排行榜、徽章等)。

為了更完整掌握分享數據的生命週期,並便於日後整合後台報表或行銷工具,我另外打造了一個基於 Cloudflare Workers KV 與 Hono 框架的輕量級分享計數 API,作為 ShareThis 的補充方案。這篇教學將完整介紹這套系統的實作細節、效能優化方式和前端整合技巧,非常適合需要進階控制權的內容經營者或開發者參考應用。

環境設置與準備工作

首先,讓我們使用 Cloudflare 的 create-hono 命令建立一個新的 Workers 專案:

npm create hono@latest share-counter

選擇 cloudflare-workers 模板,並安裝依賴:

cd share-counter
npm install

接著,在 Cloudflare 儀表板建立 KV 命名空間,用來儲存分享次數:

# 使用 Wrangler CLI 創建 KV 命名空間
npx wrangler kv:namespace create SHARE_COUNTS

執行後,你將收到一個命名空間 ID,將其添加到 wrangler.toml 文件中:

kv_namespaces = [
  { binding = "SHARE_COUNTS", id = "您的命名空間ID" }
]

使用 Hono 創建 API

我們將實現兩個主要端點:

  1. POST /api/share/:id - 從 ShareThis 同步指定文章的最新分享次數(由後端或定時排程呼叫)
  2. GET /api/share/:id - 獲取特定內容的分享計數

修改 src/index.ts 文件如下:

import { Hono } from 'hono'

// 定義環境變數類型
type Bindings = {
  SHARE_COUNTS: KVNamespace
}

const app = new Hono()

// 首頁路由
app.get('/', (c) => c.text('分享計數 API'))

// 獲取分享計數
app.get('/api/share/:id', async (c) => {
  const id = c.req.param('id')
  
  try {
    // 從 KV 讀取計數,如果不存在則默認為 0
    const count = await c.env.SHARE_COUNTS.get(id, 'json') || 0
    
    return c.json({
      success: true,
      count
    })
  } catch (error) {
    return c.json({
      success: false,
      error: '獲取計數失敗'
    }, 500)
  }
})

// 從 ShareThis 同步分享次數
app.post('/api/share/:id', async (c) => {
  const id = c.req.param('id')
  const url = `https://your-blog.com/blog/${id}`

  try {
    const res = await fetch(`https://count-server.sharethis.com/v2.0/get_counts?url=${encodeURIComponent(url)}`)
    const json = await res.json()
    const shareCount = json.shares?.all || 0

    await c.env.SHARE_COUNTS.put(id, JSON.stringify(shareCount))

    return c.json({
      success: true,
      count: shareCount,
    })
  } catch (error) {
    return c.json({
      success: false,
      error: '同步分享數據失敗'
    }, 500)
  }
})

export default app

若想自動同步所有文章的分享次數,可使用 Cloudflare Cron Triggers 建立定時任務,每日定時呼叫多個 POST /api/share/:id 端點。這可確保計數資料持續更新,適用於部落格、媒體平台等需整體統計的情境。

// cf-workers-cron.ts
import app from './index'

const ARTICLE_IDS = ['article-1', 'article-2', 'article-3'] // 你的文章 ID 清單

export default {
  async scheduled(event, env, ctx) {
    for (const id of ARTICLE_IDS) {
      await app.request(`/api/share/${id}`, {
        method: 'POST',
        headers: { 'X-API-Key': env.API_KEY }
      })
    }
  }
}

添加中間件進行請求驗證

為了防止濫用,我們可以添加一個簡單的 API 金鑰驗證中間件:

// API 金鑰驗證中間件
const apiKeyAuth = async (c: Context, next: Next) => {
  const apiKey = c.req.header('X-API-Key')
  
  if (!apiKey || apiKey !== c.env.API_KEY) {
    return c.json({
      success: false,
      error: '未授權訪問'
    }, 401)
  }
  
  await next()
}

// 將中間件應用到分享端點
app.post('/api/share/:id', apiKeyAuth, async (c) => {
  // 原有代碼...
})

確保在 wrangler.toml 中添加 API 金鑰環境變數:

[vars]
API_KEY = "your-secret-key"

提升效能:快取策略與 KV 使用限制說明

Cloudflare KV 採用最終一致性架構,資料的寫入在全球節點同步時可能會有 30-60 秒的延遲。對於如分享計數這類非關鍵應用,這種延遲通常不會造成實質影響。不過,開發時仍需留意:單一資料中心的寫入幾乎即時可見,但同一鍵值高頻率(每秒超過一次)寫入會受到限制,且若應用場景需要更嚴格的一致性保證,建議評估 Durable Objects 這類解決方案。

為提升效能與用戶體驗,建議前端搭配快取策略,讓分享計數能在短時間內於客戶端快取、減少重複請求。這種設計既能減少邊緣網關壓力,也能讓用戶獲得更流暢即時的介面反饋。

// 獲取分享計數並設置緩存頭
app.get('/api/share/:id', async (c) => {
  const id = c.req.param('id')
  
  try {
    const count = await c.env.SHARE_COUNTS.get(id, 'json') || 0
    
    // 設置緩存頭(緩存 5 分鐘)
    c.header('Cache-Control', 'public, max-age=300')
    
    return c.json({
      success: true,
      count
    })
  } catch (error) {
    // 錯誤處理...
  }
})

在前端頁面中嵌入分享計數:JavaScript 範例

以下是一個簡單的 JavaScript 片段,可以嵌入到網頁中顯示和更新分享計數:

// 顯示特定文章的分享計數
async function displayShareCount(articleId) {
  try {
    const response = await fetch(`https://your-worker.workers.dev/api/share/${articleId}`);
    const data = await response.json();
    
    if (data.success) {
      document.getElementById('share-count').textContent = data.count;
    }
  } catch (error) {
    console.error('獲取分享計數失敗:', error);
  }
}

// 初始化頁面時載入計數
document.addEventListener('DOMContentLoaded', () => {
  const articleId = document.querySelector('article').dataset.id;
  displayShareCount(articleId);
});

一鍵部署到 Cloudflare Workers 並驗證 API 功能

將您的應用程式部署到 Cloudflare Workers 只需一步:

npm run deploy

部署成功後,建議立即驗證 API 是否正常運作。您可以透過 cURL 或 Postman 工具進行以下測試:

  1. 查詢指定文章的分享計數

    執行以下指令,獲取某篇文章(例如 article-123)的分享次數:

    curl https://your-worker.workers.dev/api/share/article-123

    成功回應範例:

    {
      "success": true,
      "count": 5
    }
  2. 遞增指定文章的分享計數

    使用 POST 請求並攜帶 API 金鑰,來增加該文章的分享次數:

    curl -X POST https://your-worker.workers.dev/api/share/article-123 \
      -H "X-API-Key: your-api-key"

    回應範例:

    {
      "success": true,
      "count": 6
    }

    此步驟可用於驗證後端是否能成功與 ShareThis 同步資料,亦可搭配 Cron 定期呼叫。

您也可以使用 Postman 建立請求,方便地觀察回應內容與 Header,進一步驗證 API 的正確性。這些步驟能幫助您確保部署後的 API 具備預期功能,便於後續整合前端或其他服務。

進階功能:訪問者統計

在實現基本的分享計數後,您或許會希望追蹤每個 API 路徑的總訪問次數,進一步分析用戶行為。這可以透過新增一個中間件來達成,該中間件會在每次請求時自動更新對應路徑的訪問計數,實現高效的訪問者統計。

// 訪問者計數中間件
const visitorCounter = async (c: Context, next: Next) => {
  // 執行主要請求
  await next()

  // 非同步計數:每個 pathname 作為唯一鍵
  c.executionCtx.waitUntil(async () => {
    try {
      const path = new URL(c.req.url).pathname
      const key = `visit:${path}`
      const prev = await c.env.SHARE_COUNTS.get(key, 'json') || 0
      const nextCount = Number(prev) + 1
      await c.env.SHARE_COUNTS.put(key, JSON.stringify(nextCount))
    } catch (err) {
      console.error('訪問計數更新失敗:', err)
    }
  })
}

// 全域套用訪問者統計中間件
app.use('*', visitorCounter)

有了這個中間件,您的 API 每次被訪問時都會自動記錄到對應的統計資料,方便後續進行使用者行為分析或安全監控,進一步提升服務品質與洞察能力。

結論

在我的部落格中,我實際運用這套 Cloudflare Workers KV 結合 Hono 框架的架構,來追蹤每篇文章的分享次數,再搭配 Cloudflare Page Rules 設定快取政策,不僅讓統計資料能即時更新,也有效避免大量重複請求造成的性能瓶頸。這種方式讓我可以輕鬆記錄和分析用戶互動數據,完全不需要自建傳統關聯式資料庫,僅使用 Cloudflare KV 這類原生鍵值儲存服務,即可達成穩定高效的分享計數儲存與快取邏輯。這樣的設計讓我能保有 ShareThis 的便利性,同時彌補它在資料可擴充性與主控權上的缺口。

運用 Cloudflare Workers KV 的全球分佈與高速存取,加上 Hono 框架簡潔高效的程式設計,這套解決方案不僅部署容易、維護輕鬆,更能以極低成本支撐高流量需求。隨著 KV 性能的持續優化(如近期讀取速度大幅提升),這類雲端原生架構已成為現代網站開發的理想選擇。你可以把更多心力放在內容與服務本身,無需為基礎設施操心,讓技術真正服務於創作與經營。

關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。

熱門文章

最新文章

圖片管理中心
管理圖片資源
IP 查詢
快速查詢和定位 IP 地址的地理位置和相關信息
Python 運行器
無需後端、無需登入,只需打開瀏覽器即可運行 Python 代碼(由 Pyodide 提供支持)
封面圖生成器
自動創建適合各種平台的文章封面圖
原作(青山剛昌)產生器
一鍵創建原作(青山剛昌)的封面圖
日本色彩
探索和使用傳統日本色彩
部落格內容洞察儀表板
以視覺化儀表板方式追蹤文章成效、分享熱度與分類分布,協助創作者掌握內容表現。
蒙特卡羅估算 π
使用蒙特卡羅方法演示 π 值的估算過程
LLM
使用 LLM 模型進行聊天
活動圖生成器
一鍵創建活動的封面圖
Wagmi Card
一鍵創建 Wagmi 的封面圖
Facebook Quote
Facebook Quote
Music Macro Language (MML) Studio
用程式語法編寫旋律,用音符構築想像
Blurhash
一鍵創建 Blurhash
文字分類器
使用 MediaPipe TextClassifier 分類文字
前端工程師免費工具資源
前端工程師免費工具資源
後端工程師免費工具資源
後端工程師免費工具資源
全端工程師免費工具資源
全端工程師免費工具資源
Web3 工程師免費工具資源
Web3 工程師免費工具資源
紫微斗數排盤系統|結合 AI 的命盤性格與事業財務分析生成器
紫微斗數排盤工具,輸入生日與時辰,自動生成完整命盤分析提示(Prompt)。結合最專業紫微理論與 AI 助力,助你深入解析性格、事業、財務與人際課題。免費使用,適合命理師及紫微愛好者。