dodrio

A fast, bump-allocated virtual DOM library for Rust and WebAssembly.

  • 所有者: fitzgen/dodrio
  • 平台:
  • 许可证: Mozilla Public License 2.0
  • 分类:
  • 主题:
  • 喜欢:
    0
      比较:

Github星跟踪图

Dodrio

A fast, bump-allocated virtual DOM library for Rust and WebAssembly. Note that
Dodrio is still experimental.

Warning

I reiterate that Dodrio is in a very experimental state. It probably has
bugs, and no one is using it in production.

Examples

Here is the classic "Hello, World!" example:

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()
    }
}

More examples can be found in the examples
directory
, including:

  • counter:
    Incrementing and decrementing a counter.
  • input-form:
    Reading an <input> and displaying its contents.
  • todomvc:
    An implementation of the infamous TodoMVC application.
  • moire: The
    WebRender Moiré patterns demo.
  • game-of-life:
    The Rust and WebAssembly book's Game of Life tutorial rendered with Dodrio
    instead of to 2D canvas.
  • js-component:
    Defines a rendering component in JavaScript with the dodrio-js-api crate.

Cargo Features

  • log — enable debugging-oriented log messages with the log crate's
    facade. You still have to initialize a logger for the messages to go anywhere,
    such as console_log.

  • serde — enable serde::{Serialize, Deserialize} implementations for
    Cached<R> where R is serializable and deserializable.

Design

Bump Allocation

Bump allocation is essentially the fastest method of allocating objects. It has
constraints, but works particularly well when allocation lifetimes match program
phases. And virtual DOMs are very phase oriented.

Dodrio maintains three bump allocation arenas:

  1. The newest, most up-to-date virtual DOM. The virtual DOM nodes themselves and
    any temporary containers needed while creating them are allocated into this
    arena.
  2. The previous virtual DOM. This reflects the current state of the physical
    DOM.
  3. The difference between (1) and (2). This is a sequence of DOM mutation
    operations — colloquially known as a "change list" — which if applied to
    the physical DOM, will make the physical DOM match (1).

Rendering happens as follows:

  1. The application state is rendered into bump allocation arena (1).
  2. (1) is diffed with (2) and the changes are emitted into (3).
  3. JavaScript code applies the change list in (3) to the physical DOM.
  4. (1) and (2) are swapped, double-buffering style, and the new (1) has its bump
    allocation pointer reset, as does (3).
  5. Rinse and repeat.

Change List as Stack Machine

The change list that represents the difference between how the physical DOM
currently looks, and our ideal virtual DOM state is encoded in a tiny stack
machine language. A stack machine works particularly well for applying DOM
diffs, a task that is essentially a tree traversal.

Library — Not Framework

Dodrio is just a library. (And did I mention it is experimental?!) It is not a
full-fledged, complete, batteries-included solution for all frontend Web
development. And it never intends to become that either.

主要指标

概览
名称与所有者fitzgen/dodrio
主编程语言Rust
编程语言Shell (语言数: 3)
平台
许可证Mozilla Public License 2.0
所有者活动
创建于2018-11-26 21:50:59
推送于2021-03-01 06:20:06
最后一次提交2020-07-27 06:01:23
发布数1
最新版本名称0.2.0 (发布于 )
第一版名称0.2.0 (发布于 )
用户参与
星数1.2k
关注者数30
派生数49
提交数330
已启用问题?
问题数37
打开的问题数16
拉请求数98
打开的拉请求数10
关闭的拉请求数53
项目设置
已启用Wiki?
已存档?
是复刻?
已锁定?
是镜像?
是私有?