15个版本
0.1.14 | 2024年2月15日 |
---|---|
0.1.13 | 2024年2月15日 |
0.1.11 | 2023年10月1日 |
0.1.9 | 2023年9月20日 |
#1855 in 过程宏
每月 29 次下载
在 3 个包中使用(通过 rscx)
25KB
433 行
RSCx - Rust服务器组件
RSCx是一个具有良好开发体验和出色性能的服务器端HTML渲染引擎库。
特性
⚠️ 注意:尚未准备好投入生产。它缺少重要功能,例如HTML转义!
用法
所有示例均可在 rscx/examples/ 中找到。
use rscx::{component, html, props, CollectFragment};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let app = app().await;
println!("{}", app);
Ok(())
}
// simple function returning a String
// it will call the Items() function
async fn app() -> String {
let s = "ul { color: red; }";
html! {
<!DOCTYPE html>
<html>
<head>
<style>{s}</style>
</head>
<body>
// call a component with no props
<Section />
// call a component with props and children
<Section title="Hello">
<Items />
</Section>
</body>
</html>
}
}
#[component]
/// mark functions with #[component] to use them as components inside html! macro
fn Section(
// you can use `builder` attributes to specify a default value (makes this prop optional)
#[builder(default = "Default title".into(), setter(into))] title: String,
#[builder(default)] children: String,
) -> String {
html! {
<div>
<h1>{ title }</h1>
{ children }
</div>
}
}
#[component]
async fn Items() -> String {
let data = load_data_async().await;
html! {
<ul>
{
data
.into_iter()
.map(|item| html! { <li>{ item }</li> })
.collect_fragment() // helper method to collect a list of components into a String
}
</ul>
}
}
/// async functions can be easily used in the body of a component, as every component is an async
/// function
async fn load_data_async() -> Vec<String> {
vec!["a".to_string(), "b".to_string(), "c".to_string()]
}
基准测试
RSCx非常快。
免责声明:RSCx是针对服务器的,正如其名称所示。因此,以下与Leptos的比较是不公平的。该库仅包含Leptos功能的一小部分。
免责声明2:基准测试非常基础,不应影响您是否使用此库的决定。关注DX。它们被包含在内,因为我一直在运行它们以确保我不会落后太多于替代方案。
中间的时间是平均值。
在本地运行基准测试
cd bench
# cargo install criterion
cargo criterion
基准测试1:单个元素,很多HTML属性
many_attrs/maud_many_attrs
time: [205.89 ns 208.35 ns 211.53 ns]
many_attrs/horrorshow_many_attrs
time: [37.221 µs 37.304 µs 37.401 µs]
many_attrs/html_node_many_attrs
time: [67.726 µs 67.830 µs 67.939 µs]
many_attrs/leptos_many_attrs
time: [923.31 ns 928.46 ns 935.04 ns]
many_attrs/rscx_many_attrs
time: [207.96 ns 212.82 ns 219.28 ns]
RSCx和Maud几乎相同,因为它们的宏输出实际上是包含结果的静态字符串。
基准测试2:带有props和子元素的元素
small_fragment/maud_small_fragment
time: [107.60 ns 107.71 ns 107.81 ns]
small_fragment/horrorshow_small_fragment
time: [405.98 ns 406.08 ns 406.21 ns]
small_fragment/leptos_small_fragment
time: [1.7641 µs 1.7652 µs 1.7662 µs]
small_fragment/rscx_small_fragment
time: [101.79 ns 101.87 ns 101.97 ns]
RSCx提供了比Maud更好的DX,因为语法更优雅,可以将i32等值作为props/attributes传递,而在Maud中每个属性都必须是静态字符串。
基准测试3:动态属性(读取为变量)
many_dyn_attrs/horrorshow_many_dyn_attrs
time: [50.445 µs 50.702 µs 50.977 µs]
many_dyn_attrs/leptos_many_dyn_attrs
time: [100.13 µs 100.52 µs 101.00 µs]
many_dyn_attrs/rscx_many_dyn_attrs
time: [33.953 µs 33.990 µs 34.037 µs]
基准测试 4:异步渲染 100 项列表组件
async_list/maud_async_list
time: [2.3114 µs 2.3241 µs 2.3377 µs]
async_list/leptos_async_list
time: [55.149 µs 55.228 µs 55.315 µs]
async_list/rscx_async_list
time: [5.4809 µs 5.4987 µs 5.5151 µs]
我再次强调免责声明:Leptos 并非专门为服务器端渲染(SSR)而设计。通过其反应性系统(使用异步资源)会增加开销。
依赖项
~1.2–1.7MB
~34K SLoC