#signal #scope #reactive #run-time #value #subscriber #docs

reactive-signals

reactive-signals 是一个以 dx 为首,基于范围的高精度响应式系统

4 个版本

0.1.0-alpha.42023 年 4 月 5 日

#1148数据结构

MIT 许可证

160KB
4K SLoC

reactive-signals

关于工作文档链接,请在此处阅读:DOCS.RS

reactive-signals 是一个以 dx 为首,基于范围的高精度响应式系统。它基于 leptos_reactive 中的优秀想法,但从头开始编写,为开发者提供最简单易用的 API 和思维模型。

本文档假设您熟悉 Leptos 并了解响应式概念。

  • TBD(待定)表示该功能将在未来添加。
  • TBC(待确认)表示它可能是未来的一个可能添加的功能

注意:该项目尚未准备好使用!首先需要全面的测试覆盖率。

特性

  • 精简且强大的 API 接口。本质上:范围、信号、信号!。
  • 开发者体验:您创建响应式信号,它们会以可预测的方式自动更新。没有更多需要了解的内容。
  • 内存和性能开销极低,以至于开发者无需担心。
  • 一个易于使用的 [信号!] 宏,用于创建各种信号,包括数据信号、函数信号、服务器端和客户端信号等。
  • [信号]s 产生一个响应式值,对于数据信号,它是内部数据,对于函数信号,它是函数产生的值。当值更新时,或对于实现 [PartialEq] 的值,当它发生变化时,订阅者会收到通知。
  • 范围类型安全的附加数据。请参阅 [范围] 文档。TBD
  • leptos_reactive 降低了 4 倍的内存开销和 3.5 倍(最坏情况)的速度。请参阅下面的 [基准测试]。
  • 推拉更新:确保节点仅更新一次,且仅当必要时。请参阅 reactively 中的说明文件的末尾。TBC
  • Tokio tracing 兼容性。TBC
  • 使用自定义异步运行时在浏览器中运行时异步信号,以及在服务器中运行时使用tokio。请参阅[signal!]文档。待定
  • 将leptos_reactive API进行镜像,并包含升级说明,以提供平滑的升级体验。如有兴趣,当然可以。待定
  • 生产级的测试覆盖率。待定
  • 有关更多可能的功能,请参阅Evolutions

示例

请参阅Scope、Signal、signal!中的示例。

Cargo 特性

  • unsafe-cell:在内部,reactive-signals使用RefCell进行内部可变性。一旦reactive-signals成熟并且您的应用程序经过良好测试,则可以使用UnsafeCell,从而实现大约40%的性能提升和大约20%的内存使用减少。

演进

  • 时间旅行。由于reactive-signals的结构,可以创建状态快照,用于创建信号的实时可视化,按其作用域分组,信号之间有边。每个外部动作或事件都会触发一个新的状态快照。状态快照将通过突出显示触发信号及其所有递归依赖项来可视化。当信号的值实现Debug或Display时,可以用于可视化其内容。
  • 轮询信号。可以选择注册信号以进行轮询,以便运行时vec包含自上次轮询以来所有更改的信号。这可以用于将DOM更新分组到每帧一个更新,从而避免从WASM中多次调用开销大的小而昂贵的调用。对于Leptos来说,需要调查它的实用性。
  • 远程shim(推测性)。WASM中进出的一切都会在Rust和JS数据之间进行转换。应该可以在其中放入一个shim来将其序列化为远程应用程序。为什么要这样做?这将有助于实现完整的即时热重载,并应用各种技巧来大大加快编译时间。

基准测试

测量值已四舍五入,以便于阅读和推理。它们测量ScopeInner和SignalInner(不属于公共API),数据存储在这里,而Scope和Signal只具有索引(整数)数据。

性能

这些测量值是使用criterion通过测量1000个实例并计算一个实例的时间来产生的。它在Macbook M1上进行了测量。

什么 时间 使用unsafe-cell
创建一个ScopeInner 10纳秒 8纳秒
创建一个SignalInner 55纳秒 50纳秒
通知订阅者 25纳秒 15纳秒

leptos_reactive的配置文件示例“Leptos创建1000个信号”测量值为245微秒。使用reactive-signals的相同测量值为70微秒。这使得性能提高了3.5倍。

内存使用

这些测量值是使用dhat通过创建1000个实例并计算一个实例的大小来产生的。

什么 堆使用 使用unsafe-cell
ScopeInner 40字节 32字节
SignalInner 80字节 70字节
订阅* 8字节 12字节

*每个信号订阅的内存使用。

在leptos_reactive中,1000个信号和一个memo使用400kb,而在reactive-signals中创建1000个函数信号,每个信号都有一个订阅,使用100kb。换句话说,reactive-signals使用的内存比leptos_reactive少4倍。

请参阅benchmarks、示例和测试以获取完整详细信息。

个人笔记及 reactive-signals 的未来

我在reactive-signals项目上投入了大量的时间,这个项目完全是自筹资金。不幸的是,我无法继续这样下去(虽然我非常愿意这么做!)。

reactive-signals的未来取决于您,如果您想资助列表中的功能,请标明为TBC

我为它创建了一个筹款活动

我愿意接受任何类型的自由职业合同工作,以使我能够继续开发和维护我目前和计划中的开源项目。请参阅我的服务

请参阅我的其他开源项目

如果您感兴趣,请随时联系!

依赖关系

~0–13MB
~155K SLoC