JavaScript 无内置持久化能力,浏览器用 localStorage(轻量键值)或 indexedDB(结构化数据),Node.js 依赖 fs 或 SQLite;均需注意容量、安全、清理与读写时机。

JavaScript 本身没有内置的“持久化存储”能力,所有数据默认随页面刷新或关闭而丢失;真正能落地的方案取决于运行环境——浏览器端靠 localStorage、indexedDB 或 cookie,Node.js 环境则必须借助文件系统(fs)或数据库(如 SQLite、PostgreSQL)。
浏览器里存简单配置:用 localStorage 最直接,但别存敏感信息
localStorage 是最常用的前端持久化方式,适合存用户偏好、开关状态、表单草稿等轻量 JSON 数据。它同步写入、容量约 5–10MB,但不加密、不防 XSS,且无法跨域共享。
-
localStorage.setItem('theme', 'dark')写入字符串,值必须是字符串;对象得先JSON.stringify() -
localStorage.getItem('theme')返回null而非undefined,记得判空 - 不能监听变化——除非自己封装一层,用
storage事件监听同源其他 tab 的修改 - 遇到
QuotaExceededError错误?说明超了配额,常见于存了大图片 base64 或未清理的旧数据
存结构化数据或大量内容:绕不开 indexedDB
当你要存用户上传的多个文件、离线消息列表、或需要索引查询的记录时,localStorage 就力不从心了。indexedDB 是浏览器原生支持的异步、事务型 NoSQL 数据库,虽 API 繁琐,但无可替代。
- 必须在
onupgradeneeded中定义 object store 和 index,版本号升了才会触发,不是每次打开都重跑 - 所有读写操作都基于事务(
transaction),且事务生命周期绑定在当前函数调用栈——别在await后续操作中继续用同一个事务对象 - 想存 ArrayBuffer、Blob、File?可以,但不能直接 JSON 序列化;
structuredClone()在较新浏览器可用,否则得手动处理 - 不要手写原生 indexedDB 封装,优先用
idb这类轻量 Promise 包装库,避免掉进事务失效、游标越界等坑
Node.js 环境下没 localStorage:老实用 fs.writeFile 或 SQLite
Node.js 没有 Web Storage API,所谓“前端式持久化”在这里完全不成立。临时存点配置,用 fs.writeFileSync 写 JSON 文件最直白;长期需查询、多进程访问,就得上 SQLite(用 sqlite3 或 better-sqlite3)。
每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite来存储配置数据的,iPhon
立即学习“Java免费学习笔记(深入)”;
-
fs.writeFileSync('./config.json', JSON.stringify(config, null, 2))—— 注意JSON.stringify会丢掉函数、undefined、Symbol 和循环引用 - 并发写同一文件?可能丢数据。加锁要用
fs.flock(POSIX)或第三方包如proper-lockfile - SQLite 文件即数据库,无需服务端,适合 CLI 工具或桌面应用;但注意
better-sqlite3是同步 API,别在主线程做复杂查询阻塞事件循环 - 别把
process.env当持久化手段——它只在进程启动时读取,改了环境变量也不会自动更新
真正容易被忽略的不是“怎么存”,而是“什么时候删”和“谁有权读”。localStorage 不会自动过期,indexedDB 不会自动压缩,Node.js 的 JSON 文件不会自动备份。持久化的麻烦,往往从第 3 次读写开始显现。










