#server-side-rendering #leptos #wrapper #focused #upload #err #leptos-dom

nightly leptos_macabre

围绕 leptos_dom 的恐怖简单包装,专注于服务器端渲染

1 个不稳定版本

0.1.0 2024年1月16日

#25#err

MIT 许可证

34KB
199

Leptos Macabre

恐怖简单的服务器端渲染。由 Leptos 提供。

use leptos_macabre::*;

let result: Result<_, &str> = Ok("Done!");
let style = "color: green;";

section! {
    h1!{ "Uploads" },
    match result {
        Ok(msg) => div! {
            @htmx-get="/uploads";
            @style;
            p!{ "Status: ", msg },
        },
        Err(err) => strong! {
            @class="error";
            "Uh Oh: " err
        },
    }
};

语法

  • 属性@ 开头,以 ; 结尾。
  • 属性值 是返回 impl leptos::IntoAttribute 的表达式。
  • 属性值 可以缩写,当名称等于作用域内的变量时。不支持原始标识符(即 r#type)。
  • 子元素 是返回 impl leptos::IntoView 的表达式。
  • 子元素 可以用 可选的 逗号分隔(有助于 rustfmt 和自动缩进,有时)。

细节 & 便利

编译时间 & Lsp

由于一切都是最小递归的 macro_rules!,自动完成和建议非常迅速。

自动 .into_view()

此包中的每个宏都返回一个 View,这有意偏离了 Leptos,以避免在每个分支上都需要 .into_view()(一个可理解的要求)。

use leptos_macabre::*;
let result = Some(true);
let href = "#section";

match result {
    Some(true) => a!(@href; "Go here!"),
    Some(false) => p!(@class="bad"; "Uh-oh!"),
    None => div!(),
};

每个元素都是一个宏。

每个元素都是一个独立的宏。这可以节省许多按键。它不同于大多数 Rust HTML 宏。

use leptos::*;
use leptos_macabre::*;

view! { <button>"27 keystrokes"</button> }
button! { "10 keystrokes" }

重新导出

此包导出所需的工作的 leptos_dom 项。如果您只想在服务器上制作 HTML,则可以跳过添加 leptos 作为其自己的依赖项。

缺点

没有可以用 script! 或正常 HTML 事件处理程序实现的反应性。没有信号。性能可能比直接与 leptos::view! 相比更差。

仅对带属性(props)的 leptos 组件提供基本支持。生成的 Prop* 结构体需要作为参数提供,这意味着您将无法使用许多原本通过 #[component] (可选属性等)提供的便利。

use leptos_macabre::*;
use leptos::component;

#[component]
fn MyButton() -> impl leptos::IntoView {}

#[component]
fn MyA(href: &'static str) -> impl leptos::IntoView {}

p!{ MyButton };
p!{ MyButton() };
p!{ MyA(MyAProps { href: "#red" }) };

由于子元素只是返回 impl IntoView 表达式,您可以使用老式的函数来替换组件。

use leptos_macabre::*;

fn my_button() -> impl leptos::IntoView { }
fn my_a(href: &'static str) -> impl leptos::IntoView {}
fn my_b(inner: Option<bool>) -> impl leptos::IntoView {}

div! { 
    my_button,
    my_button(),
    my_a("#red"),
    my_b(Some(true)) ,
};

名称

我一直觉得 horrorshow crate 很有趣,而 leptos 则与疾病 莱姆病 很接近。这全部都显得有些凄凉。其次,这个 crate 是使用嵌套的 macro_rules! 创建的,这真的是令人毛骨悚然。

依赖关系

约 14-27MB
约 408K SLoC