#dom #node #simulated #replace #web-sys #sandbox #browser-independent

nightly rdom

基于Rust的模拟DOM(web-sys的浏览器无关替代品)

10个版本

0.2.0 2021年4月20日
0.1.8 2021年3月30日

#4 in #simulated

MIT许可证

37KB
863

rdom logo

无需浏览器的Rust DOM

此存储库已存档。由于我不再需要它,因此将此项目束之高阁。如果您需要在Rust中使用DOM,那么考虑您是否需要简单的DOM,或者是否需要类似JSDom的完整动态功能。如果是后者,我建议可能使用JSDOM + Deno。如果是前者,继续开发这个库可能值得。然而,我们遇到了一些复杂的情况,所以,我只是说可能会有困难。

旧介绍

你好,欢迎。此库提供服务器端或无浏览器DOM的模拟。

docs.rs CI status Discord Chat

示例用法

use std::sync::Arc;

use rdom::config::ScreenMetrics;
use rdom::node::concrete::*;
use rdom::node::contents::{CommentNodeStorage, NodeType, TextNodeStorage};
use rdom::node::element::{ElementNodeStorage, HtmlButtonElementStorage, HtmlHtmlElementStorage};
use rdom::node::{AnyNodeArc, NodeBehavior};
use rdom::sandbox::Sandbox;

fn main() {
    let metrics: ScreenMetrics = Default::default();
    let sbox = Sandbox::new(metrics);
    let doc = sbox.clone().window().document();

    let document_element = sbox
        .builder::<ElementNodeArc>()
        .build_html();

    // We don't use the text node, but those are available
    let _text = doc.create_text_node("Hello, world!".to_string());

    doc.append_child(document_element.into());

    println!("Doc has {} child node(s)", doc.child_nodes().length());
    // Prints out Doc has 1 child node(s)
}

这个库准备好了吗?

不,它仍然是一个预alpha版本的工作中。然而,它对合作持开放态度。

这个库和web-sys或Dodrio有什么区别?

Rdom尽可能模仿web-sys,因为它提供了一个看起来和表现都像DOM的DOM,就像Rust程序员通过与web-sys交互看到的DOM一样。

关键区别在于没有实际的浏览器。我的意思是,你可以有一个,但这不是必需的。

此外,此库支持多个沙盒的概念,因此并非所有节点都属于一个像web-sys那样的单个大节点池。相反,每个沙盒包含一个单独的文档树以及有关窗口的一些信息(如宽度和高度)。

与Dodrio相比,此库更加关注实际的DOM元素类型。Dodrio基本上对不同的标签类型是中立的,并且更多地关注如何操作DOM以匹配某些理想,例如React的虚拟DOM。如果这仍然不清楚,Dodrio以web-sys为目标(它是依赖项),理论上,这个库将来也可能成为Dodrio的后端。

并非所有的DOM都已实现。你是如何决定实现哪些部分的?

开发此库的原因是为了为Yew启用SSR支持。这是其唯一目的,因此虽然它构建得尽可能灵活,但我们目前主要满足的用例是这一点,尽管欢迎提交成为维护者的申请。


lib.rs:

基于Rust的模拟DOM(web-sys的浏览器无关替代品)

依赖关系

~275–730KB
~17K SLoC