在 Ubuntu 里写 JavaScript 应用时,数据持久化通常会先碰到两个问题:代码到底跑在浏览器里,还是跑在 Node.js 里;数据只是临时配置,还是后续还要查询、扩展和并发读写。选型一旦走偏,前期开发省下的事,后面往往会在迁移、性能或一致性上补回来。
这篇文章按实际开发场景把几种常见方案重新梳理一遍:先看浏览器端的 LocalStorage 和 IndexedDB,再看 Node.js 下的文件系统、SQLite 与 MongoDB。读完你可以直接根据数据量、结构复杂度、部署方式和维护成本,判断哪种方案更合适。
先分清场景:浏览器端和 Node.js 端不是一回事
JavaScript 的数据持久化方案,首先受运行环境限制。
浏览器端
如果代码运行在浏览器里,可直接使用 Web API,例如 LocalStorage 和 IndexedDB。这类方案适合前端页面、离线应用、本地缓存和用户偏好设置。
Node.js 端
如果代码运行在 Ubuntu 上的 Node.js 环境中,就不能直接使用浏览器存储接口,而是要依赖文件系统或数据库,例如 fs、SQLite、MongoDB。

所以真正的选型顺序通常是:先看运行环境,再看数据规模和查询需求。
小数据、低复杂度:优先考虑 LocalStorage
LocalStorage 是 HTML5 自带的客户端存储机制,使用方式接近简单的键值对仓库。它最大的优势是零依赖、上手快,适合保存主题配置、语言偏好、登录态辅助信息、页面临时状态这类小体量数据。
// 存储数据
localStorage.setItem('key', 'value');
// 获取数据
const value = localStorage.getItem('key');
// 删除数据
localStorage.removeItem('key');
// 清空所有数据
localStorage.clear();
适合什么场景
适合“小而简单”的数据,例如:

- 用户偏好设置
- 页面草稿状态
- 无需复杂查询的缓存标记
使用时要注意什么
LocalStorage 只能存字符串。如果要保存对象或数组,需要先用 JSON.stringify 转换,读取后再用 JSON.parse 还原。
另外,它的容量通常只有 5-10MB 左右,适合轻量数据,不适合大批量记录、复杂结构或频繁更新的数据集。
浏览器里要存大数据或复杂结构,IndexedDB 更合适
当数据量上来,或者你需要索引、事务、游标查询时,LocalStorage 就不够用了。这时更适合使用 IndexedDB。它本质上是浏览器内置的客户端数据库,能处理几十MB甚至更大的本地数据。
// 打开数据库
const request = indexedDB.open('myDatabase', 1);
request.onupgradeneeded = function(event) {
const db = event.target.result;
const objectStore = db.createObjectStore('myObjectStore', { keyPath: 'id' });
};
request.onsuccess = function(event) {
const db = event.target.result;
// 添加数据
const transaction = db.transaction(['myObjectStore'], 'readwrite');
const objectStore = transaction.objectStore('myObjectStore');
const request = objectStore.add({ id: 1, name: 'John Doe' });
request.onsuccess = function(event) {
console.log('Data added successfully');
};
// 读取数据
const getRequest = objectStore.get(1);
getRequest.onsuccess = function(event) {
console.log(getRequest.result);
};
};
request.onerror = function(event) {
console.error('Database error:', event.target.errorCode);
};
它为什么比 LocalStorage 强
IndexedDB 支持对象存储、索引、事务和更复杂的数据访问方式,适合以下场景:
- 离线 Web 应用
- 需要本地缓存大量数据的前端项目
- 文档编辑器、笔记应用、任务管理器
它的代价是什么
和 LocalStorage 相比,IndexedDB 的 API 明显更复杂。原生写法里会涉及数据库版本、对象仓库、事务以及异步回调。不过这类复杂度通常可以通过 Promise 或 async/await 封装来缓解。
如果你的前端应用已经需要“本地数据库”这个级别的能力,IndexedDB 通常就是更稳妥的选择。
Node.js 下做简单持久化,直接用文件系统
在 Ubuntu 的 Node.js 环境里,最直接的持久化方式就是使用内置的 fs 模块读写文件。它没有额外部署成本,适合配置文件、日志、导出数据以及小规模 JSON 数据保存。
const fs = require('fs');
// 写入文件
fs.writeFile('data.json', JSON.stringify({ key: 'value' }), (err) => {
if (err) throw err;
console.log('Data written to file');
});
// 读取文件
fs.readFile('data.json', 'utf8', (err, data) => {
if (err) throw err;
console.log(JSON.parse(data));
});
什么时候文件就够用
如果需求只是把结果写到本地、下次启动再读回来,文件方案通常已经够用,例如:
- 本地配置保存
- 日志落盘
- 单机脚本的数据缓存
- 简单数据导出
什么时候文件会开始吃力
问题主要出在并发和查询能力上。文件适合“整块读写”,但不擅长多条件查询,也不擅长在多个并发写入场景下保持一致性。
如果只是单进程工具,使用 fs.writeFileSync 和 fs.readFileSync 也可以,但在生产环境中要避免用同步 I/O 长时间阻塞事件循环。
数据再复杂一步,就该换成数据库
当你的应用开始出现这些需求时,文件系统通常就不再合适了:
- 需要复杂查询
- 需要索引或事务
- 需要更好的数据一致性
- 数据量持续增长
- 后续可能扩展到多用户或多实例
这时更适合引入真正的数据库。Ubuntu 环境下,JavaScript 常见的两类路线是 SQLite 和 MongoDB。
SQLite:单机应用和轻量服务的实用选项
SQLite 是轻量级嵌入式数据库,不需要单独启动数据库服务,数据直接保存在本地文件中。对很多单机程序、小型服务、桌面工具来说,这一点非常省事。
const sqlite3 = require('sqlite3').verbose();
// 打开数据库
const db = new sqlite3.Database('myDatabase.db', (err) => {
if (err) throw err;
console.log('Connected to the SQLite database.');
});
// 创建表
db.run("CREATE TABLE IF NOT EXISTS users (id INT, name TEXT)");
// 插入数据
db.run("INSERT INTO users (id, name) VALUES (1, 'John Doe')", (err) => {
if (err) throw err;
console.log('Data inserted');
});
// 查询数据
db.get("SELECT * FROM users WHERE id = ?", [1], (err, user) => {
if (err) throw err;
console.log(user);
});
// 关闭数据库
db.close();
它支持 SQL、事务和索引,适合需要一定查询能力、但又不想额外维护数据库服务的场景。比如桌面应用、本地工具、嵌入式设备、小型后端服务,都很常见。
MongoDB:文档模型灵活,适合中大型项目扩展
如果你的数据结构变化快,或者项目后续要考虑分布式部署、联机服务和更灵活的文档模型,MongoDB 会更合适。它以文档形式存储数据,与 JavaScript 的 JSON 风格天然接近。
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'myDatabase';
MongoClient.connect(url, function(err, client) {
if (err) throw err;
console.log('Connected successfully to MongoDB');
const db = client.db(dbName);
const collection = db.collection('users');
// 插入数据
collection.insertOne({ name: 'John Doe' }, (err, result) => {
if (err) throw err;
console.log('Data inserted');
});
// 查询数据
collection.findOne({ name: 'John Doe' }, (err, user) => {
if (err) throw err;
console.log(user);
});
// 关闭数据库连接
client.close();
});
MongoDB 的优势主要在于文档结构灵活、聚合能力强、可扩展性更好。但代价也很明确:需要单独安装并运行 MongoDB 服务,部署和维护成本会高于 SQLite。
怎么选:按数据规模、查询方式和部署成本判断
把上面几种方案放到一起,选择思路其实很清晰:
- 浏览器环境、小数据量、简单键值存储:用
LocalStorage - 浏览器环境、数据量大或结构复杂:用
IndexedDB - Node.js 环境、简单本地读写:用文件系统
- Node.js 环境、需要 SQL 查询和本地单机部署:用 SQLite
- Node.js 环境、需要灵活文档模型或后续扩展能力:用 MongoDB
如果还拿不准,可以直接问自己三个问题:数据会不会持续增长、后面要不要复杂查询、部署时能不能接受独立数据库服务。大多数情况下,答案会把范围缩得很小。
结语
在 Ubuntu 上用 JavaScript 做数据持久化,没有“最强方案”,只有更贴合场景的方案。前端小数据先从 LocalStorage 起步,浏览器重度存储转向 IndexedDB;Node.js 里简单任务用文件,业务复杂后再上 SQLite 或 MongoDB,整体路线通常最省成本,也最容易维护。









