#virtual-dom #bump #render #vdom

dodrio

一个快速、基于 bump 分配的虚拟 DOM 库

3 个版本 (破坏性更新)

0.2.0 2020 年 5 月 8 日
0.1.0 2019 年 3 月 13 日
0.0.0 2019 年 3 月 13 日

#7 in #vdom

Download history 439/week @ 2024-03-13 644/week @ 2024-03-20 666/week @ 2024-03-27 669/week @ 2024-04-03 594/week @ 2024-04-10 588/week @ 2024-04-17 662/week @ 2024-04-24 567/week @ 2024-05-01 510/week @ 2024-05-08 551/week @ 2024-05-15 566/week @ 2024-05-22 616/week @ 2024-05-29 487/week @ 2024-06-05 408/week @ 2024-06-12 488/week @ 2024-06-19 464/week @ 2024-06-26

1,946 每月下载量
33 个 crate 中使用 (直接使用 8 个)

MPL-2.0 许可证

180KB
3.5K SLoC

Rust 3K SLoC // 0.1% comments JavaScript 360 SLoC // 0.1% comments Shell 13 SLoC // 0.1% comments

Dodrio

Dodrio 是一个用于 Rust 和 WebAssembly 的快速、基于 bump 分配的虚拟 DOM 库。请注意,Dodrio 仍然处于 实验性 状态。它可能存在错误,并且没有人将其用于生产环境。

警告

我再次强调,Dodrio 处于一个非常 实验性 的状态。它可能存在错误,并且没有人将其用于生产。

示例

以下是经典的 "Hello, World!" 示例

struct Hello {
    who: String,
}

impl Render for Hello {
    fn render<'a>(&self, cx: &mut RenderContext<a>) -> Node<'a> {
        let who = bumpalo::format!(in cx.bump, "Hello, {}!", self.who);
        div(cx)
            .children([text(who.into_bump_str())])
            .finish()
    }
}

更多示例可以在 examples 目录 中找到,包括

  • counter:增加和减少计数器。
  • input-form:读取 <input> 并显示其内容。
  • todomvc:著名 TodoMVC 应用的实现。
  • moire:WebRender Moiré 图案演示。
  • game-of-life:使用 Dodrio 而不是 2D 画布渲染 Rust 和 WebAssembly 书籍的 Game of Life 教程。
  • js-component:使用 dodrio-js-api crate 定义 JavaScript 渲染组件。

Cargo 功能

  • log — 使用 log crate 的外观启用面向调试的日志消息。您仍然需要初始化一个记录器,以便消息可以发送到任何地方,例如 console_log

  • serde — 启用 serde::{Serialize, Deserialize} 实现为 Cached<R>,其中 R 是可序列化和反序列化的。

设计

Bump 分配

增量分配是分配对象最快的方法。它有一些限制,但当分配的生存期与程序阶段相匹配时,效果特别出色。并且虚拟 DOM 非常面向阶段。

Dodrio 维护了三个增量分配区域

  1. 最新的、最新的虚拟 DOM。虚拟 DOM 节点以及创建它们时所需的任何临时容器都分配到这个区域。
  2. 之前的虚拟 DOM。这反映了物理 DOM 的当前状态。
  3. (1) 和 (2) 之间的差异。这是一系列 DOM 变更操作——俗称为“变更列表”——如果应用于物理 DOM,将使物理 DOM 与 (1) 相匹配。

渲染过程如下

  1. 应用程序状态被渲染到增量分配区域 (1)。
  2. (1) 与 (2) 进行 diff 操作,并将更改输出到 (3)。
  3. JavaScript 代码将 (3) 中的变更列表应用到物理 DOM 上。
  4. (1) 和 (2) 交换,采用双缓冲方式,新的 (1) 的增量分配指针被重置,(3) 也是如此。
  5. 重复此过程。

将更改列表作为栈式机器

表示物理 DOM 当前外观与我们理想虚拟 DOM 状态之间的差异的变更列表被编码在一个微型堆栈机器语言中。堆栈机器非常适合应用 DOM 差分,这是一个本质上是树遍历的任务。

库 — 非 框架

Dodrio 只是一个库。(我提到它是实验性的吗?!)它不是一个完整、完整、带电池的解决方案,用于所有前端 Web 开发。它也永远不会成为那样的解决方案。

依赖项

~6.5–9MB
~175K SLoC