Kit - 書籤管理工具

2024/06 ~ 現在

全端開發
資料庫設計
Serverless
Cloudflare
進行中
精選

基於 React Router v7 + Cloudflare 的現代化書籤管理系統,支援多層級資料夾、標籤分類與拖曳排序

Kit - 書籤管理工具

採用技術

Remix (React Router v7)

全端 React 框架,處理 SSR 與 API 路由

Cloudflare Pages

Serverless 部署平台,邊緣運算零冷啟動

Cloudflare D1

Serverless SQLite 資料庫

Drizzle ORM

Type-safe 資料庫操作與 Migration 管理

shadcn/ui

基於 Radix UI 的高品質元件庫

Tailwind CSS

Utility-first CSS 框架

dnd-kit

拖曳排序功能實作

專案介紹

Kit 是一款自架式書籤管理工具,解決瀏覽器書籤管理混亂的痛點。透過 Workspace、Tab、Folder 三層架構搭配標籤系統,讓使用者能以直覺的方式整理大量網路資源。

全端架構部署於 Cloudflare Pages,搭配 D1 Serverless SQLite 資料庫,實現零伺服器維護成本與全球邊緣運算的快速存取體驗。

核心功能

雙模式分類系統

每個 Tab 可選擇「資料夾模式」或「標籤模式」。資料夾模式提供傳統樹狀結構;標籤模式支援 Tag Group 與 AND / OR / SINGLE 三種篩選邏輯。

拖曳排序

基於 @dnd-kit 實現 Tab、Folder、Bookmark、Tag Group 的拖曳排序,使用浮點數 sort_order 策略避免頻繁重排。

書籤分享

產生 Share Token 建立唯讀公開連結,支援自訂短連結與額外按鈕配置。

自動擷取 Favicon

新增書籤時自動透過 Google Favicon API 取得網站圖標,提升辨識度。

技術架構

前端

Remix (React Router v7) 為核心框架,搭配 shadcn/ui 元件庫與 Tailwind CSS 建構現代化介面。使用 Phosphor Icons 作為圖示系統,@dnd-kit 處理拖曳交互。

後端

執行於 Cloudflare Workers 邊緣運算環境,使用 Cloudflare D1 (SQLite) 作為資料庫,透過 Drizzle ORM 進行 Type-safe 的資料操作與 Migration 管理。

認證系統

自建 JWT 認證機制(jose),密碼使用 PBKDF2-SHA256(100,000 次迭代)進行雜湊,Cookie-based Session 管理,支援註冊白名單機制。

智慧緩存加速設計

針對公開分享頁面設計了一套基於 Hash 比對 的客戶端快取機制,大幅減少重複訪問時的資料庫查詢負擔。

Hash 驅動的失效策略

users 資料表上維護 data_hash 欄位(UUID),每當任何寫入操作(書籤、資料夾、標籤、工作區等)成功後,皆透過 bumpUserDataHash() 重新產生 UUID,作為資料版本的唯一標識。

輕量級 Hash 探針

提供 /api/data-hash 端點,僅需 1–2 次 D1 查詢即可回傳目前的 Hash 值。相較於完整載入分享頁面所需的 7+ 次資料庫查詢,探針成本極低。

clientLoader 快取流程

利用 React Router v7 的 clientLoader 在瀏覽器端攔截請求:先檢查 localStorage 中是否有快取 → 若有,向 Hash 探針確認資料是否變更 → Hash 一致則直接返回快取資料,跳過完整的伺服器載入;Hash 不一致或無快取時才執行完整查詢,並將結果連同新 Hash 寫入快取。

快取管理

快取以 bk-cache:{route}:{sorted-params} 為 Key 存儲於 localStorage,設有 7 天硬性過期。當儲存空間不足時自動清除所有快取並重試,確保不影響頁面正常運作。

跨工作區全文搜尋

內建 Cmd/Ctrl + K 快速搜尋功能,可即時在當前 Workspace 的所有 Tab 中進行全文檢索,不受單一分頁限制。

多欄位聯合搜尋

每筆書籤會將標題、URL、備註、資料夾路徑、分頁名稱與標籤名稱合併為搜尋範圍,確保無論記得哪個片段都能找到目標。

多關鍵字 AND 邏輯

輸入以空白分隔的多個關鍵字時,系統採用 AND 邏輯——所有關鍵字必須同時出現才會匹配。例如搜尋 react hooks 會找到同時包含「react」與「hooks」的書籤。

智慧結果呈現

搜尋結果中匹配的關鍵字會以高亮標示;資料夾模式的書籤會顯示完整的麵包屑路徑(如 Programming / JavaScript / Frameworks);標籤模式則會帶出彩色標籤徽章,顏色繼承自所屬 Tag Group。

流暢的操作體驗

搜尋輸入設有 200ms 防抖機制避免過度運算,並支援 鍵盤導航與 Enter 直接開啟書籤,從搜尋到抵達目標一氣呵成。

資料庫設計

使用 Cloudflare D1 (SQLite) 搭配 Drizzle ORM,涵蓋使用者、工作區、書籤內容、標籤系統與分享機制。

資料表 說明 關鍵欄位
users 使用者帳號 id, email, password_hash
workspaces 工作區(每位使用者可建立多個) id, user_id, title, sort_order
tabs 分頁(支援 folders / tags 兩種模式) id, workspace_id, title, type

API 設計

基於 Remix Action Handler 設計 RESTful 風格的 API 端點,透過 FormData 傳遞參數:

書籤管理 api.bookmarks

支援 CRUD、跨資料夾移動、批次排序更新

資料夾管理 api.folders

支援 CRUD、巢狀子資料夾、摺疊狀態切換

標籤系統 api.tags / api.tag-groups / api.bookmark-tags

標籤群組管理、標籤 CRUD、書籤標籤關聯操作

工作區與分頁 api.workspaces / api.tabs

多工作區切換、分頁模式管理(folders / tags)

分享系統 api.shares

產生唯讀分享連結、自訂短連結與額外按鈕