6 个版本 (3 个重大更新)
0.17.2 | 2023 年 10 月 30 日 |
---|---|
0.17.1 | 2023 年 10 月 29 日 |
0.16.0 | 2023 年 10 月 28 日 |
0.15.0 | 2023 年 10 月 28 日 |
0.14.0 | 2023 年 10 月 21 日 |
在 模板引擎 中排名第 154
每月下载量 64
90KB
2K SLoC
纯 Rust 实现的快速 Mustache 模板引擎。
Ramhorns-ext 基于 Ramhorns,它在运行时加载和处理模板。它包含一个 derive 宏,允许模板从原生 Rust 数据结构渲染,无需进行临时分配、中间 HashMap
或其他类似操作。
凭借一点魔法 🎩,友情的力量 🥂 和 FNV 哈希的闪光 ✨,渲染时间可以轻松与静态模板引擎(如 Askama)相媲美。
你还需要什么,贴纸吗?
Cargo.toml
[dependencies]
ramhorns-ext = { version = "0.17", features = ["chrono", "uuid"] }
示例
use ramhorns_ext::{Template, Content};
#[derive(Content)]
struct Post<'a> {
id: uuid::Uuid,
create_time: chrono::NaiveDateTime,
title: &'a str,
teaser: &'a str,
}
#[derive(Content)]
struct Blog<'a> {
title: String, // Strings are cool
posts: Vec<Post<'a>>, // &'a [Post<'a>] would work too
}
// Standard Mustache action here
let source = "<h1>{{title}}</h1>\
{{#posts}}<article><h2>{{id}}</h2><h2>{{title}}</h2><p>{{teaser}}</p></article>{{/posts}}\
{{^posts}}<p>No posts yet :(</p>{{/posts}}";
let tpl = Template::new(source).unwrap();
let rendered = tpl.render(&Blog {
title: "My Awesome Blog!".to_string(),
posts: vec![
Post {
id: uuid::Uuid::parse_str("02f09a3f-1624-3b1d-8409-44eff7708201").unwrap(),
create_time: chrono::Utc::now().naive_utc(),
title: "How I tried Ramhorns and found love 💖",
teaser: "This can happen to you too",
},
Post {
id: uuid::Uuid::parse_str("12f09a3f-1624-3b1d-8409-44eff7708202").unwrap(),
create_time: chrono::Utc::now().naive_utc(),
title: "Rust is kinda awesome",
teaser: "Yes, even the borrow checker! 🦀",
},
]
});
assert_eq!(rendered, "<h1>My Awesome Blog!</h1>\
<article>\
<h2>02f09a3f-1624-3b1d-8409-44eff7708201</h2>\
<h2>How I tried Ramhorns and found love 💖</h2>\
<p>This can happen to you too</p>\
</article>\
<article>\
<h2>12f09a3f-1624-3b1d-8409-44eff7708202</h2>\
<h2>Rust is kinda awesome</h2>\
<p>Yes, even the borrow checker! 🦀</p>\
</article>");
特性
- Vec 等等的 <{$value}>。
- uuid 和 chrono DateTime 支持
- 渲染部分
{{?foo}} ... {{/foo}}
。 - 渲染常见类型,例如
&str
、String
、bool
和数字到{{变量}}
。 - 使用
{{{三重括号-花括号}}}
或{{&ersand}}
进行未转义的打印。 - 渲染部分
{{#foo}} ... {{/foo}}
。 - 渲染逆部分
{{^foo}} ... {{/foo}}
。 - 渲染部分
{{>file.html}}
。 - 从标记为
#[md]
的字段进行零拷贝 CommonMark 渲染。
基准
渲染一个小型模板
test a_simple_ramhorns ... bench: 82 ns/iter (+/- 4) = 1182 MB/s
test b_simple_askama ... bench: 178 ns/iter (+/- 8) = 544 MB/s
test c_simple_tera ... bench: 416 ns/iter (+/- 98) = 233 MB/s
test c_simple_tera_from_serialize ... bench: 616 ns/iter (+/- 33) = 157 MB/s
test d_simple_mustache ... bench: 613 ns/iter (+/- 34) = 158 MB/s
test e_simple_handlebars ... bench: 847 ns/iter (+/- 40) = 114 MB/s
渲染带有部分的小型模板
test pa_partials_ramhorns ... bench: 85 ns/iter (+/- 7) = 1141 MB/s
test pb_partials_askama ... bench: 210 ns/iter (+/- 9) = 461 MB/s
test pc_partials_mustache ... bench: 827 ns/iter (+/- 39) = 117 MB/s
test pd_partials_handlebars ... bench: 846 ns/iter (+/- 29) = 114 MB/s
从字符串编译模板
test xa_parse_ramhorns ... bench: 190 ns/iter (+/- 10) = 821 MB/s
test xb_parse_mustache ... bench: 3,229 ns/iter (+/- 159) = 48 MB/s
test xe_parse_handlebars ... bench: 6,883 ns/iter (+/- 383) = 22 MB/s
值得注意的是,Askama 在编译时处理模板,并生成用于渲染的静态 Rust 代码。这对于性能来说很好,但也意味着您不能在不重新编译 Rust 可执行文件的情况下替换模板。在某些情况下,例如对于静态网站生成器,这不幸地成为了致命缺陷。
尽管在运行时解析模板永远不会免费,但 Ramhorns 在 Logos 上构建了一个非常快的解析器,这使得整个过程都非常快速。
设计上和功能集上与 Ramhorns 最接近的是 Mustache crate。
许可
Ramhorns 是免费软件,并根据 GNU 通用公共许可证第 3 版发布。请参阅 LICENSE。
依赖项
~3.5MB
~37K SLoC