MiniJinja是一个功能强大但依赖最小化的Rust模板引擎,基于Python的Jinja2模板引擎的语法和行为。
它基于serde
实现,只有它作为唯一的必需依赖。它支持Jinja2的一系列功能,包括继承、过滤器等。其目标是使Rust程序能够使用一些模板,而不必担心为了解决一个小问题而引入复杂的依赖。此外,它尽量不重新发明轮子,而是保持与现有技术一致,以利用已有的编辑器集成生态系统。
$ cargo tree
minimal v0.1.0 (examples/minimal)
└── minijinja v2.1.2 (minijinja)
└── serde v1.0.144
此外,minijinja还可作为(可选预编译的)命令行可执行文件使用,名为minijinja-cli
:
$ curl -sSfL https://github.com/mitsuhiko/minijinja/releases/latest/download/minijinja-cli-installer.sh | sh
$ echo "Hello {{ name }}" | minijinja-cli - -Dname=World
Hello World
你可以在浏览器playground中在线试用MiniJinja,该playground由MiniJinja的WASM构建驱动。
目标:
- 文档完善,API简洁
- 依赖最小化,编译时间合理,运行时性能出色
- 尽可能接近Jinja2
- 支持表达式求值,允许作为DSL使用
- 支持所有
serde
兼容类型 - 测试充分
- 支持带方法和动态属性的动态运行时对象
- 错误描述详细
- 可编译为WebAssembly
- 可与Python配合使用
- 附带方便的CLI工具
- 实验性C语言绑定
示例
示例模板:
{% extends "layout.html" %}
{% block body %}
<p>Hello {{ name }}!</p>
{% endblock %}
在Rust中调用:
use minijinja::{Environment, context};
fn main() {
let mut env = Environment::new();
env.add_template("hello.txt", "Hello {{ name }}!").unwrap();
let template = env.get_template("hello.txt").unwrap();
println!("{}", template.render(context! { name => "World" }).unwrap());
}
使用案例和用户
以下是一些有趣的MiniJinja开源用户和使用案例。这些例子直接链接到使用引擎的位置,以便你可以看到它是如何被使用的:
-
HTML生成:
- Zine 用它来生成静态HTML
- Oranda 用它来生成HTML登陆页面
-
结构生成:
- Astral的Rye 用它来生成项目结构
- Maturin 用它来生成项目结构
- cargo-dist 用它来生成CI和项目配置
-
AI 聊天模板:
- HuggingFace 使用它来渲染 LLM 聊天模板
- mistral.rs 使用它来渲染 LLM 聊天模板
- BoundaryML 的 BAML 使用它来渲染 LLM 聊天模板
- LSP-AI 使用它来渲染 LLM 聊天模板
-
数据和处理:
- Cube 使用它进行数据建模
- PRQL 使用它处理 DBT 风格的管道
获取帮助
如果您在使用 MiniJinja
时遇到困难、有建议或需要帮助,可以使用 GitHub 讨论区。
相关 Crate
- minijinja-autoreload:提供环境的自动重载功能
- minijinja-embed:提供将模板嵌入二进制文件的工具
- minijinja-contrib:提供对核心来说过于特定的额外工具
- minijinja-py:使 MiniJinja 可用于 Python
- minijinja-cli:命令行工具
- minijinja-cabi:MiniJinja 的 C 语言绑定
类似项目
以下是 Rust 中相关的模板引擎:
- Askama:受 Jinja 启发,类型安全,需要模板预编译。在某些方面与 Jinja 语法有显著差异。
- Tera:受 Jinja 启发,动态,与 Jinja 有一些差异。
- TinyTemplate:占用空间小的模板引擎,语法受到 Jinja 和 Handlebars 的启发。
- Liquid:Rust 的 Liquid 模板实现。Liquid 受到 Django 的启发,而 Jinja 也从 Django 汲取了灵感。
从 MiniJinja 1.x 升级
MiniJinja 目前有两个主要版本,都在维护中。大多数用户应该升级到 2.x,它有一个更完善的对象系统。但是,如果您过去一直使用动态对象,升级可能会相当复杂。有关升级信息,请参考 UPDATING,其中有一个指南,列举了两个引擎版本之间的变化示例。
要查看 MiniJinja 1.x 的示例和代码,您可以浏览 minijinja-1.x 分支。
赞助
如果您喜欢这个项目并发现它有用,您可以成为赞助者。
许可证和链接
- 文档
- 讨论
- 示例
- 问题追踪
- MiniJinja 演练场
- 许可证:Apache-2.0