3个版本
0.1.2 | 2024年7月15日 |
---|---|
0.1.1 | 2024年7月15日 |
0.1.0 | 2024年7月15日 |
#323 in Rust模式
每月73次下载
在 3 crates中使用
69KB
1.5K SLoC
bloom-core
Bloom是一个紧密模仿React的描述性UI框架。
核心API
Bloom中的UI由组件(实现Component
特质的结构体)组成。
它提供了类似React的API
use_state
use_ref
use_effect
use_context
(WIP)use_layout_effect
(WIP)Suspense
(WIP)ErrorBoundary
(WIP)
这些API可以在Component
-trait的render
方法中使用,以提供诸如状态、副作用或对底层渲染器的原始引用等功能。
核心crate还提供了一个默认的渲染循环实现,这使得实现额外的渲染器变得容易。
为什么不使用响应式编程
大多数现代UI框架使用基于响应式编程原语(如信号)的架构。
然而,React只是在某些状态变化时重新渲染整个组件树(或其部分),这保证了UI始终更新以匹配各自的渲染函数的确切输出。
实践经验表明,响应式编程很难,虽然通常可以提供更好的性能,因为它避免了diff步骤(确定UI的实际属性有哪些已更改),但它们也引入了性能陷阱和难以调试的响应式编程错误。
Bloom是尝试将React的积极方面带入Rust UI开发的尝试。
为什么不使用Elm架构
许多Rust Web框架基于elm架构(其中你提供一个模型和一个更新函数,该函数接受前一个模型和一个事件对象,为UI的下一轮迭代构建下一个状态)。
这种方法在函数式方面非常干净,但引入了样板代码,并且难以扩展,因为它使得创建完全独立工作的隔离组件变得困难。
错误处理
Component
-trait有一个关联类型Error
,表示渲染函数可能返回的错误类型。
这允许库的消费者使用自己的错误类型,这可能是anyhow::Error
,使用thiserror
生成的错误类型或完全自定义的错误类型。
正在制作一个合理的API来捕获这些错误(ErrorBoundary
)。
渲染器无关
虽然React主要为了Web构建(react-native是后来的想法),但bloom通常是渲染器无关的。
原生UI元素(如原生HTML节点,例如<div>
和<span>
)在bloom世界中被称为“节点”。除了HTML元素外,bloom还可以用于渲染QT对象,如Button
或基本上任何其他UI原语。
Component
-trait有一个类型参数(Node
),表示它实现的具体节点类型。
RSX
Bloom在bloom-rsx crate中提供了自己的类似JSX的语法实现,称为RSX。
数据获取
Bloom组件是异步函数。这意味着数据获取可以像直接获取调用一样简单。
async fn render() -> Result<Element<Self::Node, Self::Error>, Self::Error> {
let my_data = reqwest::get(my_api_endpoint).await?.json().await?;
rsx!(
<Heading>{my_data.title}</Heading>
)
}
HTML
有关使用bloom渲染HTML的所有内容,请参阅bloom-html crate。
依赖关系
~1.2–2MB
~37K SLoC