#key-value-store #tauri-plugin #tauri-app #persistent #javascript #secure #io

sys tauri-plugin-store

简单、持久的键值存储

22 个版本

2.0.0-rc.2 2024 年 8 月 20 日
2.0.0-beta.112024 年 7 月 31 日
2.0.0-beta.42024 年 3 月 21 日
2.0.0-alpha.62023 年 12 月 20 日
2.0.0-alpha.02023 年 5 月 24 日

#412 in 编码

Download history 331/week @ 2024-05-02 461/week @ 2024-05-09 271/week @ 2024-05-16 408/week @ 2024-05-23 1105/week @ 2024-05-30 612/week @ 2024-06-06 692/week @ 2024-06-13 645/week @ 2024-06-20 823/week @ 2024-06-27 829/week @ 2024-07-04 1129/week @ 2024-07-11 1033/week @ 2024-07-18 1865/week @ 2024-07-25 2095/week @ 2024-08-01 2172/week @ 2024-08-08 3006/week @ 2024-08-15

9,251 每月下载量
用于 markflowy

Apache-2.0 OR MIT

72KB
966

plugin-store

简单、持久的键值存储。

安装

此插件需要至少 Rust 版本 1.75

我们可以推荐三种一般性的安装方法。

  1. 使用 crates.io 和 npm(最简单,需要您信任我们的发布管道已正常工作)
  2. 直接从 Github 使用 git 标签/修订哈希拉取源代码(最安全)
  3. 使用 Git 子模块将此仓库安装到您的 tauri 项目中,然后使用文件协议导入源(最安全,但使用不便)

通过向您的 Cargo.toml 文件中添加以下内容来安装核心插件

src-tauri/Cargo.toml

[dependencies]
tauri-plugin-store = "2.0.0-rc"
# alternatively with Git:
tauri-plugin-store = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }

您可以使用您首选的 JavaScript 包管理器安装 JavaScript 客户端绑定

注意:由于大多数 JavaScript 包管理器无法从 git monorepos 安装包,我们为每个插件提供只读镜像。这使得安装选项 2 更易于使用。

pnpm add @tauri-apps/plugin-store
# or
npm add @tauri-apps/plugin-store
# or
yarn add @tauri-apps/plugin-store

# alternatively with Git:
pnpm add https://github.com/tauri-apps/tauri-plugin-store#v2
# or
npm add https://github.com/tauri-apps/tauri-plugin-store#v2
# or
yarn add https://github.com/tauri-apps/tauri-plugin-store#v2

用法

首先,您需要将核心插件与 Tauri 进行注册

src-tauri/src/main.rs

fn main() {
    tauri::Builder::default()
        .plugin(tauri_plugin_store::Builder::default().build())
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

之后,所有插件 API 都可以通过 JavaScript 客户端绑定访问

import { Store } from "tauri-plugin-store-api";

const store = new Store(".settings.dat");

await store.set("some-key", { value: 5 });

const val = await store.get<{ value: number }>("some-key");

if (val) {
  console.log(val);
} else {
  console.log("val is null");
}

// This manually saves the store.
await store.save();

持久化值

如上所示,添加到存储中的值在应用程序优雅关闭之前不会在应用程序加载之间持久化。

您可以使用以下方式手动保存存储:

await store.save();

当从JavaScript绑定中使用时,存储库会自动加载。
然而,您也可以稍后手动加载它们,如下所示

await store.load();

从Rust的使用

您还可以在Rust中直接创建Store实例

use tauri_plugin_store::StoreBuilder;
use serde_json::json;

fn main() {
    tauri::Builder::default()
        .plugin(tauri_plugin_store::Builder::default().build())
        .setup(|app| {
            let mut store = StoreBuilder::new("app_data.bin").build(app.handle().clone());

            // Attempt to load the store, if it's saved already.
            store.load().expect("Failed to load store from disk");

            // Note that values must be serde_json::Value instances,
            // otherwise, they will not be compatible with the JavaScript bindings.
            store.insert("a".to_string(), json!("b"));

            // You can manually save the store after making changes.
            // Otherwise, it will save upon graceful exit as described above.
            store.save()
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

优雅地加载

如果您在一个尚未写入磁盘的Store上调用load,它将返回一个错误。如果您想优雅地继续并使用默认存储库,直到将其保存到磁盘,您必须处理这个错误。上面的例子显示了如何这样做。

例如,如果存储库尚未创建,这会导致panic

store.load().unwrap();

而不是像您可能期望的那样默默地继续。

您应该始终适当地处理错误,而不是解包,否则您可能会遇到意外的应用程序崩溃

store.load().expect("Failed to load store from disk");

前端互操作性

如您所注意到的,上面创建的Store不能被前端访问。要与JavaScript创建的存储库进行交互,请使用导出的with_store方法

use tauri::Wry;
use tauri_plugin_store::with_store;

let stores = app.state::<StoreCollection<Wry>>();
let path = PathBuf::from("app_data.bin");

with_store(app_handle, stores, path, |store| store.insert("a".to_string(), json!("b")))

贡献

接受PR。请在提交拉取请求之前务必阅读贡献指南。

合作伙伴

CrabNebula

有关赞助商的完整列表,请访问我们的网站Open Collective

许可证

代码:(c) 2015 - 现在 - The Tauri Programme within The Commons Conservancy。

适用时,使用MIT或MIT/Apache 2.0。

依赖项

~17–60MB
~1M SLoC