人人都会AI编程

WebView 原生存储:localStorage、IndexedDB

更新时间:2026-07-11

在 Tauri 应用中,前端部分(WebView)本质上就是一个受控的浏览器环境。因此,所有现代浏览器提供的 Web Storage API 都可以直接使用,不需要安装任何额外依赖,也不需要特殊的权限配置。最常用的两种原生存储方式是 localStorageIndexedDB


localStorage

  • 是什么:键值对形式的同步存储,只能保存字符串。
  • 容量:通常限制在 5~10 MB(各平台 WebView 实现略有差异),超出后会抛异常。
  • 适用场景:用户偏好设置(如主题、语言)、小型会话状态、不敏感的配置项。
  • 优点:API 极简(getItem / setItem / removeItem),读取无异步开销。
  • 注意事项
  • 同步操作:如果频繁读写大量数据,会阻塞 UI 线程,造成界面卡顿。
  • 数据不加密:存储的值会以明文形式保存在 WebView 的数据目录中,不要存放密码或 Token。
  • 生命周期:数据会持久保留,直到用户清除浏览器数据或应用卸载。Tauri 应用通常拥有独立的 WebView 数据目录,不会与其他应用混用。

简单示例

// 保存用户设置
localStorage.setItem('theme', 'dark');

// 读取
const theme = localStorage.getItem('theme'); // 'dark'

IndexedDB

  • 是什么:异步的非关系型数据库,支持存储复杂的 JavaScript 对象、文件、Blob 等结构化数据。
  • 容量:动态分配,通常可达数百 MB 甚至数 GB,具体取决于设备可用空间和 WebView 策略,远超 localStorage。
  • 适用场景:需要存取大量结构化数据的场景,比如离线缓存、日志系统、用户文档的本地草稿、图片/文件的本地副本。
  • 优点
  • 异步设计,不阻塞主线程。
  • 支持索引和事务,查询效率高。
  • 可以安全地存储二进制数据。
  • 注意事项
  • API 相对底层,直接使用较繁琐,建议配合封装库(如 idbDexie.js)。
  • 数据同样以明文存储在用户设备上(WebView 的数据目录),不适用于敏感信息。
  • 和 localStorage 一样,Tauri 不干预数据生命周期,完全由 WebView 管理。

简单示例(使用 Dexie.js)

import Dexie from 'dexie';

const db = new Dexie('MyAppDB');
db.version(1).stores({ todos: '++id, title, done' });

// 添加一条记录
await db.todos.add({ title: '完成报告', done: false });

// 查询所有未完成项
const items = await db.todos.where('done').equals(0).toArray();

与 Rust 后端的存储分工

WebView 存储属于前端沙箱内的存储,Rust 后端无法直接读写它们,除非通过 Tauri 的 IPC 命令。这种隔离是一种安全设计。如果你需要读写文件系统中的任意位置、加密存储、或与系统级凭证交互,应当在 Rust 后端完成,然后通过自定义命令返回给前端。对于一般的应用状态、UI 配置、离线缓存等,直接使用 localStorage 或 IndexedDB 是最方便且安全的方式。

一句话建议:体积小、非敏感的字符串 → localStorage;结构复杂、数据量大、需要异步查询 → IndexedDB;密码、Token 等敏感数据 → 交给 Rust 后端处理。