人人都会AI编程

11.3 本地存储方案

更新时间:2026-07-11

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 沙箱,卸载应用时可保留或选择性删除。能够读写二进制文件、加密文件等。
  • 实现方式
  1. tauri.conf.json 中启用文件系统权限(例如需要访问应用数据目录);
  2. 使用 Rust 的 std::fstauri::api::path 获取正确路径;
  3. 暴露 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 的架构都保证了前端和后端的分工明确:前端负责展示和用户交互,后端负责“真正落到磁盘”的操作,你可以在两者之间灵活组合,找到最适合应用场景的存储策略。