Vorstellung von bwu_redux: Redux-Style State Management für Rust, jetzt Open Source
2026-07-17
Kategorie: Ankündigungen
In unserem letzten Beitrag haben wir das Argument für die Kombination von Redux-artigem State Management mit Rust vorgebracht. Heute ist das kein reines Argument mehr — es ist ein Crate, das Sie Ihrem Projekt hinzufügen können. bwu_redux ist jetzt Open Source, veröffentlicht auf crates.io und GitHub unter einer dualen MIT/Apache-2.0-Lizenz.
Es ist dieselbe State-Management-Bibliothek, die hinter dem Frontend von BWU Designer steckt, herausgelöst, damit jeder sie unabhängig von unserer App nutzen kann.
Was es macht
bwu_redux ist ein asynchroner, Redux-artiger Store für Rust: ein einzelner unveränderlicher Zustand, Aktionen, die durch eine Middleware-Kette geschickt werden, und ein reiner Reducer, der den nächsten Zustand erzeugt. Zustandsänderungen werden an Subscriber als asynchrone Streams übertragen, angetrieben von Selektoren, die genau den Teil des Zustands extrahieren, der einen Subscriber tatsächlich interessiert — sodass ein Subscriber nur geweckt wird, wenn sich der ausgewählte Wert tatsächlich ändert, nicht bei jedem Dispatch.
Ein paar Dinge sind besonders erwähnenswert:
- Undo gibt's gratis dazu. Mit aktiviertem
history-Feature (standardmäßig an) behält der Store automatisch die letzten N Zustände. Undo ist kein separates, aufgesetztes System — es ergibt sich aus demselben Append-only-Zustandsprotokoll, das den Store von vornherein vorhersehbar macht. - Time-Travel-Debugging. Das
redux_devtools-Feature streamt jede Zustandsänderung zu einem DevTools-gRPC-Server zur Live-Inspektion, mit demselben Wire-Format, egal ob Ihre App nativ läuft oder im Browser. - Eine Codebasis, zwei Laufzeitumgebungen. Genau derselbe Store, dieselben
Aktionen und dieselbe Reducer-Logik laufen unverändert auf nativen Zielen und in
WASM über
wasm-bindgen/gloo— einschließlich der DevTools-Verbindung, die im Browser einfach zu gRPC-web wechselt.
Erste Schritte
use std::sync::Arc;
use bwu_redux::{StoreConfig, StoreWrapper};
#[tokio::main]
async fn main() {
let config = StoreConfig::new(String::from("initial"), |state: String, action: &String| {
if action.is_empty() { state } else { action.clone() }
});
let store = Arc::new(StoreWrapper::new(config));
store.run();
store.dispatch(String::from("hello")).expect("store is running");
store.close(String::new()).await.expect("close failed");
assert_eq!(store.select(|s| s.clone()), "hello");
}
Zustands- und Aktionstypen brauchen nur Clone + Debug + PartialEq + Send + Sync —
fügen Sie serde::Serialize/Deserialize hinzu, wenn Sie das redux_devtools-Feature
nutzen möchten. Das README enthält ein
vollständigeres Beispiel mit eingerichtetem Tracing sowie die vollständige
Feature-Flag-Referenz.
Ausprobieren und uns sagen, was kaputtgeht
Dies ist ein 0.1.0-Release: der Kern-Store, Middleware, Undo-Historie und die
DevTools-Integration sind alle im täglichen Einsatz in BWU Designer, aber das Crate
ist jung und die API kann sich noch verschieben. Wenn Sie es ausprobieren und auf eine
Unebenheit stoßen — oder einfach sehen wollen, wie das DevTools-Protokoll funktioniert
— sind Issues und Pull Requests auf GitHub
willkommen.
[dependencies]
bwu_redux = "0.1"