1. Web Storage(localStorage / sessionStorage)
最熟悉的前端存储,适合键值对形式的小数据。
- 优点:无需任何额外依赖,前端 JavaScript 直接调用
localStorage.setItem()/getItem()。API 简单,兼容性好。 - 限制:仅能存储字符串,总容量约 5 MB(不同 WebView 可能略有差异)。同步调用,大量写入可能阻塞 UI。
- 适用场景:用户偏好设置(主题、语言)、临时令牌、轻量级 UI 状态。
- 注意:存储在 WebView 的浏览器上下文中,如果用户清除浏览器数据或应用卸载,数据会丢失。不要用于持久化重要业务数据。
2. IndexedDB
前端可用的非关系型数据库,适合较大结构化的数据。
- 优点:容量远大于 localStorage(通常可达数百 MB 甚至更多),支持事务、索引、游标,异步操作不阻塞 UI。可以存储 Blob、文件等复杂类型。
- 限制:API 原生较为繁琐,通常需要包装库(如
idb或 Dexie.js)。数据仍位于 WebView 沙箱内,无法直接与其他应用共享。 - 适用场景:离线缓存数据、本地文档草稿、表格数据浏览等。
- 推荐:结合 Dexie.js 使用,开发体验接近关系型数据库。Tauri 官方不会限制 IndexedDB 用法,完全由前端自行管理。
3. 文件系统读写(Rust 后端)
通过 Tauri 的 Rust 命令直接操作系统文件,实现完全不受限的本地存储。
- 优点:无容量限制,可以自由选择目录(应用数据目录、用户文档目录等)。数据独立于 WebView 沙箱,卸载应用时可保留或选择性删除。能够读写二进制文件、加密文件等。
- 实现方式:
- 在
tauri.conf.json中启用文件系统权限(例如需要访问应用数据目录); - 使用 Rust 的
std::fs或tauri::api::path获取正确路径; - 暴露 Tauri 命令,前端通过
invoke读写文件。
- 示例命令:
#[tauri::command]
fn save_data(path: String, content: String) -> Result<(), String> {
std::fs::write(path, content).map_err(|e| e.to_string())
}
- 适用场景:用户文档保存、配置文件导出、日志收集、需要跨应用共享的数据。
4. 键值存储插件(tauri-plugin-store)
Tauri 官方提供的轻量持久化方案,将 JSON 数据写入文件,API 近似 localStorage。
- 优点:安装简单(
npm install @tauri-apps/plugin-store并在 Rust 端注册),自动序列化/反序列化 JSON,支持监听值变化,文件默认保存在应用配置目录下。前端使用体感类似 localStorage 但数据落在磁盘上。 - 限制:不适合存储大体积二进制或数十万条数据,本质上是文件级的读写,频繁修改大 JSON 会产生性能瓶颈。
- 适用场景:持久化的用户设置、简单缓存、状态恢复。是
localStorage的可靠替代品。 - 示例:
import { Store } from '@tauri-apps/plugin-store';
const store = new Store('settings.json');
await store.set('theme', 'dark');
const theme = await store.get('theme');
选择建议速查表
| 数据类型 | 推荐方案 | 备注 |
|---------|---------|------|
| 几 KB 的配置项 | tauri-plugin-store | 持久化到磁盘,跨会话保留 |
| 临时 UI 状态 | localStorage / sessionStorage | 仅限本次会话或短期内有效 |
| 复杂查询、离线数据 | IndexedDB + Dexie.js | 前端控制,无需 Rust 介入 |
| 用户文档、导出文件 | Rust 文件系统命令 | 可任意读写系统目录 |
| 敏感数据(密钥等) | Rust 加密 + 文件系统 | 配合 Tauri 加密插件更安全 |
无论选择哪种,Tauri 的架构都保证了前端和后端的分工明确:前端负责展示和用户交互,后端负责“真正落到磁盘”的操作,你可以在两者之间灵活组合,找到最适合应用场景的存储策略。