#ui-framework #component #bloom #renderer #html #traits #state

bloom-core

一个类似React的描述性UI框架。无渲染器限制,但以HTML为设计理念。

3个版本

0.1.2 2024年7月15日
0.1.1 2024年7月15日
0.1.0 2024年7月15日

#323 in Rust模式

Download history 284/week @ 2024-07-12 36/week @ 2024-07-19 17/week @ 2024-07-26 6/week @ 2024-08-02

每月73次下载
3 crates中使用

MIT许可证

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