想找一個不需設定資料庫伺服器的解決方案嗎?這篇教學將帶你認識 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 特別適合以下場景:
- 命令行工具(CLI):需要簡單資料存儲的命令行工具。
- 小型服務器:不需要高併發和複雜查詢功能的小型應用服務。
- Electron 應用:需要本地資料存儲的桌面應用程序。
- npm 套件:作為 npm 套件的內部資料存儲解決方案。
- 黑客松(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」。