lowdb 教學:打造輕量級本地 JSON 資料庫,支援 TypeScript

作者: Calpa Liu
字數:1393
出版:April 13, 2025

想找一個不需設定資料庫伺服器的解決方案嗎?這篇教學將帶你認識 lowdb——一個輕量級本地 JSON 資料庫,適用於 Node.js、Electron 與前端專案。支援 TypeScript,幫助你用原生 JavaScript 快速完成資料儲存與查詢操作,適合原型開發、小型工具與桌面應用。

lowdb 的主要特性與優勢

輕量級且易於使用

lowdb 的設計理念是極度簡潔—如果你懂 JavaScript,你就已經知道如何使用 lowdb。它沒有複雜的查詢語言或 API,而是直接利用原生 JavaScript 進行資料操作。

// 使用原生 JavaScript 添加資料
db.data.posts.push({ id: 1, title: 'lowdb is awesome', views: 100 })
await db.write()

// 使用原生 Array 方法查詢資料
const { posts } = db.data
posts.filter((post) => post.title.includes('lowdb'))
posts.find((post) => post.id === 1)
posts.toSorted((a, b) => a.views - b.views)

無需額外的資料庫服務器

lowdb 將所有資料存儲在單一 JSON 檔案中,無需設置或維護單獨的資料庫服務器。這使它成為嵌入式資料庫的理想選擇,特別適合需要簡單資料存儲的小型應用程序。

類型安全與 TypeScript 支持

最新版本的 lowdb 提供了完善的 TypeScript 支持,這讓開發者可以實現類型安全的資料操作,避免運行時錯誤。

type Data = { messages: string[] }
const defaultData: Data = { messages: [] }
const db = await JSONFilePreset<Data>('db.json', defaultData)
db.data.messages.push('foo') // ✅ 成功
db.data.messages.push(1) // ❌ TypeScript 錯誤

安全的原子寫入

lowdb 支持原子寫入,這意味著即使在寫入過程中發生錯誤,資料庫也不會被破壞。這提高了資料的可靠性和一致性。

高度可擴展和可定制

通過適配器系統,lowdb 允許開發者自定義存儲方式、檔案格式(如 JSON、YAML 等)甚至添加加密功能。這種靈活性讓開發者可以根據特定需求調整資料庫行為。

測試友好

在測試環境中,lowdb 會自動切換到快速的內存模式,這使得單元測試和集成測試更加高效。

適用場景與使用者

根據搜索結果,lowdb 特別適合以下場景:

  1. 命令行工具(CLI):需要簡單資料存儲的命令行工具。
  2. 小型服務器:不需要高併發和複雜查詢功能的小型應用服務。
  3. Electron 應用:需要本地資料存儲的桌面應用程序。
  4. npm 套件:作為 npm 套件的內部資料存儲解決方案。
  5. 黑客松(Hackathon)項目:需要快速開發的小型項目。

lowdb 被 json-server 和超過 90 個 npm 上的項目使用。它的簡單性和零配置特性使其成為原型設計和小型專案的理想選擇。

使用示例

以下是使用最新版本 lowdb 的示例,注意使用 import 而非 require:

基本使用

假設我們的資料庫結構如下:

{
  "posts": []
}

我們可以使用 lowdb 來操作這個資料庫:

import { JSONFilePreset } from "lowdb/node";

interface DB {
  posts: Post[];
}

interface Post {
  id: number;
  title: string;
  views: number;
}

async function main() {
  // 初始化資料庫,設定預設值
  const db = await JSONFilePreset<DB>("db.json", { posts: [] });

  // 添加資料
  db.data.posts.push({ id: 1, title: "lowdb is awesome", views: 100 });

  // 保存更改
  await db.write();

  // 或者使用 update 方法一步完成
  await db.update(({ posts }) =>
    posts.push({
      id: 2,
      title: "Another post",
      views: 50,
    })
  );

  // 查詢資料
  const firstPost = db.data.posts;
  const popularPosts = db.data.posts.filter((post) => post.views > 50);

  console.log("firstPost", firstPost);
  console.log("popularPosts", popularPosts);
}

main();

結果會是:

{
  "posts": [
    {
      "id": 1,
      "title": "lowdb is awesome",
      "views": 100
    },
    {
      "id": 2,
      "title": "Another post",
      "views": 50
    }
  ]
}

局限性與替代方案

lowdb 的限制

雖然 lowdb 是開發小型專案、原型應用與簡易工具的理想選擇,但在面對較大或更複雜的資料需求時,它仍有一些明顯的限制。首先,lowdb 將所有資料儲存在單一 JSON 檔案中,並在操作時將整個資料集載入記憶體。當資料量超過約 10MB(約 5 萬到 10 萬筆記錄)時,效能可能明顯下降,尤其在每次讀寫時都需處理整個檔案,會導致延遲增加與系統資源消耗上升。其次,lowdb 缺乏複雜查詢能力,例如進階篩選、聚合運算或多層條件邏輯,這使它不適合中大型應用或需要高度資料處理能力的情境。

可替代方案

若你的專案在功能、效能或擴充性方面有更高需求,可以考慮其他更適合的替代方案。像是 NeDB,它是類似 MongoDB 的嵌入式資料庫,效能更佳且支援基本查詢語法;SQLite 則是一套輕量級但功能完整的 SQL 資料庫,具備 ACID 特性,適用於需要資料一致性與事務控制的應用;或者選擇 LokiJS,這是一個以記憶體為主導的文檔型資料庫,支援更複雜的查詢操作與更快的存取速度。這些工具都能根據不同的應用場景,補足 lowdb 的不足,為開發者提供更彈性與強大的資料處理能力。

結論

lowdb 是一個極簡且強大的本地 JSON 資料庫解決方案,特別適合小型專案、原型設計和不需要複雜資料庫服務的應用。它的優勢在於簡單易用、無需配置、原生 JavaScript API 以及 TypeScript 支持。

對於開發者來說,lowdb 提供了一種低門檻的資料存儲方式,讓你可以專注於應用邏輯而非資料庫設置。雖然它不適合大規模應用,但在其適用範圍內,lowdb 是一個非常實用的工具。

無論你是在開發命令行工具、Electron 應用還是需要簡單資料存儲的小型服務,lowdb 都能提供簡潔而高效的解決方案。正如其口號所說:「如果你懂 JavaScript,你就懂 lowdb」。

感謝您閱讀我的文章。歡迎隨時分享你的想法。
關於 Calpa

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

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

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