Rust Web存储解决方案deno_webstorage的使用:实现浏览器式localStorage和sessionStorage的跨平台数据持久化

Rust Web存储解决方案deno_webstorage的使用:实现浏览器式localStorage和sessionStorage的跨平台数据持久化

deno_webstorage是一个实现了WebStorage规范的Rust crate,可以在Deno环境中使用。它提供了类似浏览器中localStorage和sessionStorage的API,实现跨平台的数据持久化存储。

安装

在项目目录中运行以下Cargo命令:

cargo add deno_webstorage

或者在Cargo.toml中添加:

deno_webstorage = "0.207.0"

使用示例

下面是一个完整的示例demo,展示如何使用deno_webstorage实现类似浏览器中的localStorage和sessionStorage功能:

use deno_webstorage::WebStorage;
use std::path::Path;

fn main() {
    // 创建WebStorage实例
    // 第一个参数是存储路径,第二个参数是存储大小限制(字节)
    let localStorage = WebStorage::new(Path::new("local_storage"), 1024 * 1024).unwrap();
    let sessionStorage = WebStorage::new(Path::new("session_storage"), 1024 * 1024).unwrap();

    // 存储数据
    localStorage.set_item("username", "rust_user").unwrap();
    sessionStorage.set_item("session_token", "abc123").unwrap();

    // 读取数据
    let username = localStorage.get_item("username").unwrap();
    let token = sessionStorage.get_item("session_token").unwrap();
    
    println!("Username: {:?}", username);  // 输出: Some("rust_user")
    println!("Token: {:?}", token);       // 输出: Some("abc123")

    // 删除数据
    localStorage.remove_item("username").unwrap();
    sessionStorage.remove_item("session_token").unwrap();

    // 清空存储
    localStorage.clear().unwrap();
    sessionStorage.clear().unwrap();

    // 获取存储长度
    let local_len = localStorage.length().unwrap();
    let session_len = sessionStorage.length().unwrap();
    
    println!("Local storage length: {}", local_len);
    println!("Session storage length: {}", session_len);
}

主要功能

  1. set_item(key, value) - 存储键值对数据
  2. get_item(key) - 获取指定键的值
  3. remove_item(key) - 删除指定键的数据
  4. clear() - 清空所有存储数据
  5. length() - 获取存储的项目数量

注意事项

  • localStorage和sessionStorage的主要区别在于持久性:

    • localStorage数据会持久保存,即使关闭程序
    • sessionStorage数据只在当前会话有效,程序关闭后消失
  • 需要指定存储路径和大小限制

  • 所有操作返回Result类型,需要处理可能的错误

这个crate遵循HTML5的WebStorage规范,提供了与浏览器存储API高度兼容的接口,非常适合需要在Rust中实现跨平台持久化存储的场景。


1 回复

Rust Web存储解决方案:deno_webstorage

deno_webstorage 是一个 Rust 库,为 Deno 和 Rust 应用程序提供了类似浏览器中 localStorage 和 sessionStorage 的 API,实现了跨平台的数据持久化功能。

功能特点

  • 提供与 Web Storage API 兼容的接口
  • 支持 localStorage(持久化存储)和 sessionStorage(会话存储)
  • 跨平台支持(包括 Windows、macOS 和 Linux)
  • 线程安全的设计
  • 简单的键值存储接口

安装方法

在 Cargo.toml 中添加依赖:

[dependencies]
deno_webstorage = "0.1"

基本使用方法

初始化存储

use deno_webstorage::{WebStorage, StorageType};

fn main() {
    // 创建 localStorage
    let local_storage = WebStorage::new(StorageType::Local, "/path/to/storage/dir").unwrap();
    
    // 创建 sessionStorage
    let session_storage = WebStorage::new(StorageType::Session, "/path/to/storage/dir").unwrap();
}

基本操作示例

use deno_webstorage::{WebStorage, StorageType};

fn main() {
    let storage = WebStorage::new(StorageType::Local, "./storage").unwrap();

    // 设置值
    storage.set_item("username", "rustacean").unwrap();
    
    // 获取值
    let username = storage.get_item("username").unwrap();
    println!("Username: {}", username); // 输出: Username: rustacean
    
    // 删除值
    storage.remove_item("username").unwrap();
    
    // 清空存储
    storage.clear().unwrap();
    
    // 获取存储中的键数量
    let length = storage.length().unwrap();
    println!("Storage contains {} items", length);
}

遍历存储内容

use deno_webstorage::{WebStorage, StorageType};

fn main() {
    let storage = WebStorage::new(StorageType::Local, "./storage").unwrap();

    // 添加一些数据
    storage.set_item("key1", "value1").unwrap();
    storage.set_item("key2", "value2").unwrap();
    storage.set_item("key3", "value3").unwrap();

    // 遍历所有键
    for i in 0..storage.length().unwrap() {
        if let Some(key) = storage.key(i).unwrap() {
            let value = storage.get_item(&key).unwrap();
            println!("{}: {}", key, value);
        }
    }
}

高级用法

使用自定义序列化

use deno_webstorage::{WebStorage, StorageType};
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]
struct User {
    id: u32,
    name: String,
    email: String,
}

fn main() {
    let storage = WebStorage::new(StorageType::Local, "./storage").unwrap();
    
    let user = User {
        id: 1,
        name: "Alice".to_string(),
        email: "alice@example.com".to_string(),
    };
    
    // 序列化并存储
    let serialized = serde_json::to_string(&user).unwrap();
    storage.set_item("user1", &serialized).unwrap();
    
    // 读取并反序列化
    let stored = storage.get_item("user1").unwrap();
    let deserialized: User = serde_json::from_str(&stored).unwrap();
    println!("User: {:?}", deserialized);
}

错误处理

use deno_webstorage::{WebStorage, StorageType, WebStorageError};

fn main() -> Result<(), WebStorageError> {
    let storage = WebStorage::new(StorageType::Local, "./storage")?;
    
    storage.set_item("test_key", "test_value")?;
    
    match storage.get_item("non_existent_key") {
        Ok(value) => println!("Got value: {}", value),
        Err(WebStorageError::KeyNotFound) => println!("Key not found"),
        Err(e) => return Err(e),
    }
    
    Ok(())
}

完整示例代码

下面是一个结合了基本使用和高级用法的完整示例:

use deno_webstorage::{WebStorage, StorageType, WebStorageError};
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]
struct AppConfig {
    theme: String,
    notifications: bool,
    last_login: String,
}

fn main() -> Result<(), WebStorageError> {
    // 初始化本地存储
    let storage = WebStorage::new(StorageType::Local, "./my_app_data")?;
    
    // 示例1: 基本键值操作
    println!("--- 基本键值操作 ---");
    storage.set_item("app_name", "MyRustApp")?;
    storage.set_item("app_version", "1.0.0")?;
    
    println!("App Name: {}", storage.get_item("app_name")?);
    println!("App Version: {}", storage.get_item("app_version")?);
    
    // 示例2: 存储和检索结构体
    println!("\n--- 结构体存储 ---");
    let config = AppConfig {
        theme: "dark".to_string(),
        notifications: true,
        last_login: "2023-05-15".to_string(),
    };
    
    let serialized = serde_json::to_string(&config).unwrap();
    storage.set_item("user_config", &serialized)?;
    
    let stored_config = storage.get_item("user_config")?;
    let deserialized: AppConfig = serde_json::from_str(&stored_config).unwrap();
    println!("Config: {:?}", deserialized);
    
    // 示例3: 遍历存储内容
    println!("\n--- 存储内容遍历 ---");
    println!("Total items in storage: {}", storage.length()?);
    for i in 0..storage.length()? {
        if let Some(key) = storage.key(i)? {
            println!("Key {}: {}", i, key);
        }
    }
    
    // 示例4: 错误处理
    println!("\n--- 错误处理 ---");
    match storage.get_item("non_existent_key") {
        Ok(value) => println!("Found value: {}", value),
        Err(WebStorageError::KeyNotFound) => println!("Key does not exist"),
        Err(e) => return Err(e),
    }
    
    // 清理示例数据
    storage.remove_item("app_name")?;
    storage.remove_item("app_version")?;
    storage.remove_item("user_config")?;
    
    Ok(())
}

注意事项

  1. 确保存储目录有正确的读写权限
  2. sessionStorage 在程序退出后数据会丢失,而 localStorage 会持久化保存
  3. 存储的数据大小有限制(通常为 5MB 左右)
  4. 在多线程环境中使用时,确保正确处理并发访问

deno_webstorage 为 Rust 应用程序提供了简单易用的 Web 存储风格 API,特别适合需要轻量级持久化存储的场景。

回到顶部