54 个版本

0.7.0-preview22024 年 4 月 29 日
0.7.0-beta22024 年 8 月 15 日
0.7.0-beta2024 年 7 月 24 日
0.6.9 2024 年 3 月 4 日
0.2.4 2023 年 3 月 21 日

1172 in 网页编程

Download history 8571/week @ 2024-05-04 8947/week @ 2024-05-11 8691/week @ 2024-05-18 9816/week @ 2024-05-25 10595/week @ 2024-06-01 8129/week @ 2024-06-08 9345/week @ 2024-06-15 9565/week @ 2024-06-22 6460/week @ 2024-06-29 7164/week @ 2024-07-06 10306/week @ 2024-07-13 12164/week @ 2024-07-20 13942/week @ 2024-07-27 12408/week @ 2024-08-03 13973/week @ 2024-08-10 11307/week @ 2024-08-17

53,671 每月下载量
用于 160 个软件包 (3 直接)

MIT 许可证

63KB
1K SLoC

Rust 866 SLoC // 0.0% comments JavaScript 365 SLoC // 0.0% comments
Leptos Logo

crates.io docs.rs Discord Matrix

网站 | 书籍 | Docs.rs | 沙盒 | Discord

您可以在 awesome-leptos 中找到有用库和示例项目的列表。

Leptos

use leptos::*;

#[component]
pub fn SimpleCounter(initial_value: i32) -> impl IntoView {
    // create a reactive signal with the initial value
    let (value, set_value) = create_signal(initial_value);

    // create event handlers for our buttons
    // note that `value` and `set_value` are `Copy`, so it's super easy to move them into closures
    let clear = move |_| set_value(0);
    let decrement = move |_| set_value.update(|value| *value -= 1);
    let increment = move |_| set_value.update(|value| *value += 1);

    // create user interfaces with the declarative `view!` macro
    view! {
        <div>
            <button on:click=clear>Clear</button>
            <button on:click=decrement>-1</button>
            // text nodes can be quoted or unquoted
            <span>"Value: " {value} "!"</span>
            <button on:click=increment>+1</button>
        </div>
    }
}

// we also support a builder syntax rather than the JSX-like `view` macro
#[component]
pub fn SimpleCounterWithBuilder(initial_value: i32) -> impl IntoView {
    use leptos::html::*;

    let (value, set_value) = create_signal(initial_value);
    let clear = move |_| set_value(0);
    let decrement = move |_| set_value.update(|value| *value -= 1);
    let increment = move |_| set_value.update(|value| *value += 1);

    // the `view` macro above expands to this builder syntax
    div().child((
        button().on(ev::click, clear).child("Clear"),
        button().on(ev::click, decrement).child("-1"),
        span().child(("Value: ", value, "!")),
        button().on(ev::click, increment).child("+1")
    ))
}

// Easy to use with Trunk (trunkrs.dev) or with a simple wasm-bindgen setup
pub fn main() {
    mount_to_body(|| view! {
        <SimpleCounter initial_value=3 />
    })
}

关于框架

Leptos 是一个全栈、同构的 Rust 网页框架,利用细粒度反应性来构建声明式用户界面。

这意味着什么?

  • 全栈:Leptos 可以用于构建在浏览器(客户端渲染)或服务器(服务器端渲染)中运行的 app,或者通过在服务器上渲染 HTML 然后在浏览器中添加交互性(服务器端渲染与水合)。这包括对数据(Resource)和 HTML(无序或有序流 <Suspense/> 组件)的 HTTP 流的支持。
  • 同构:Leptos 提供了用于编写同构 服务器函数 的原语,即可以在客户端或服务器上以“相同形状”调用的函数,但只在服务器上运行。这意味着您可以在浏览器中调用服务器函数,就像它们正在运行一样,而无需创建和维护单独的 REST 或其他 API,同时编写您的服务器端逻辑(数据库请求、身份验证等),并与其将消费它的客户端组件一起。
  • Web:Leptos 是基于 Web 平台和 Web 标准构建的。该 路由器 设计用于利用 Web 基础(如链接和表单)并在此基础上构建,而不是试图取代它们。
  • 框架:Leptos 提供了构建现代 Web 应用所需的大部分功能:响应式系统、模板库以及在服务器端和客户端都适用的路由器。
  • 细粒度响应式:整个框架都是基于响应式原语构建的。这允许代码具有极低的开销并保持高性能:当一个响应式信号值变化时,它可以更新单个文本节点、切换单个类或从 DOM 中删除元素,而不需要其他任何代码运行。(因此,没有虚拟 DOM 的开销!)
  • 声明式:告诉 Leptos 页面应该如何显示,让框架告诉浏览器如何实现。

了解更多

以下是了解更多关于 Leptos 的资源

nightly 注意

大多数示例假设您正在使用 nightly 版本的 Rust 和 Leptos 的 nightly 功能。要使用 nightly Rust,您可以选择全局设置工具链或在每个项目的基础上进行设置。

要将 nightly 设置为所有项目的默认工具链(如果您还没有,则添加将 Rust 编译为 WebAssembly 的功能)

rustup toolchain install nightly
rustup default nightly
rustup target add wasm32-unknown-unknown

如果您只想在 Leptos 项目中使用 nightly,则添加以下内容的 rust-toolchain.toml 文件

[toolchain]
channel = "nightly"
targets = ["wasm32-unknown-unknown"]

nightly 功能启用了访问和设置信号的函数调用语法,而不是 .get().set()。这导致了一个一致的心理模型,即访问任何类型的响应式值(信号、memo 或衍生信号)总是表示为函数调用。这仅适用于 nightly Rust 和 nightly 功能。

cargo-leptos

cargo-leptos 是一个构建工具,旨在轻松构建同时运行在客户端和服务器上的应用,并提供无缝集成。现在开始一个真实的 Leptos 项目最好的方式是使用 cargo-leptos 和我们的 ActixAxum 入门模板。

cargo install cargo-leptos
cargo leptos new --git https://github.com/leptos-rs/start
cd [your project name]
cargo leptos watch

打开浏览器到 https://127.0.0.1:3000/

常见问题解答

这个名字是怎么回事?

Leptos(λεπτός)是古希腊的一个词,意为“薄、轻、精致、细粒度”。对我来说,作为一个经典主义者而不是狗主人,它让我想起了推动框架的轻量级响应式系统。我后来了解到,同样的词也是医学名词“莱波氏病”(leptospirosis)的根源,这是一种影响人类和动物的血液感染……我的错。在这个框架的开发过程中,没有狗受到伤害。

它是否已准备好投入生产?

人们通常通过这个问题来表达三个意思之一。

  1. API 是否稳定? 即,我是否需要从 Leptos 0.1 到 0.2 到 0.3 到 0.4 重新编写整个应用,或者我现在就可以编写它,并从新版本的新功能和更新中受益?

APIs基本已经稳定。我们正在添加新功能,但对类型系统和模式最终达到的状态非常满意。从架构的角度来看,我不期望未来的版本会有对您的代码造成重大破坏性的变化。

  1. 有没有bug?

是的,我确信有。您可以从我们问题跟踪器随时间的变化中看到,bug并不多,而且通常解决得相当快。但肯定的是,可能会有一些需要框架级别修复的情况,而这些情况可能不会立即得到解决。

  1. 我是消费者还是贡献者?

这可能是一个大问题:“生产就绪”意味着对库有一种特定的倾向:您基本上可以不用了解其内部结构或贡献能力就使用它。在您的堆栈中,每个人都处于某种程度的这种状态:例如,我(@gbj)目前没有能力或知识贡献给像wasm-bindgen这样的东西:我只是简单地依赖它工作。

现在社区中有几个人正在使用Leptos作为工作内部应用,他们也成为重要的贡献者。我认为这是目前正确的生产使用级别。可能缺少您需要的功能,您可能最终会自己构建它们!但对于内部应用,如果您愿意在构建过程中构建和贡献缺失的部分,框架现在肯定可用。

我能用它来制作原生GUI吗?

当然可以!显然,view宏是用来生成DOM节点,但您可以使用响应式系统轻松地驱动任何使用类似DOM的对象导向、基于事件回调的框架的原生GUI工具包。原理是相同的。

  • 使用信号、派生信号和memo来创建您的响应式系统
  • 创建GUI小部件
  • 使用事件监听器更新信号
  • 创建效果来更新UI

我创建了一个非常简单的GTK示例,您可以看看我的意思。

为0.7版本开发的新渲染方法支持“通用渲染”,即它可以使用支持一组小到6-8个函数的任何渲染库。(这是在典型的保留模式、面向对象风格的GUI工具包如DOM、GTK等之上的一层。)未来的渲染工作将允许以更类似于Web框架所使用的声明式方法来创建原生UI。

这与Yew有什么不同?

Yew是Rust Web UI开发中最常用的库,但Yew和Leptos在理念、方法和性能方面存在几个差异。

  • VDOM与细粒度:Yew基于虚拟DOM(VDOM)模型:状态变化导致组件重新渲染,生成新的虚拟DOM树。Yew将其与之前的VDOM进行对比,并将这些补丁应用到实际DOM上。组件函数在状态变化时重新运行。Leptos采取完全不同的方法。组件运行一次,创建(并返回)实际的DOM节点,并设置一个响应式系统来更新这些DOM节点。

  • 性能:这有巨大的性能影响:Leptos在创建和更新UI方面比Yew快得多。

  • 服务器集成:Yew是在浏览器渲染的单页应用(SPA)是主流的时代创建的。虽然Leptos支持客户端渲染,但它也专注于通过服务器函数和多种HTML服务模式(包括乱序流)与您的应用程序的后端集成。

  • 这与Dioxus有什么不同?

与Leptos一样,Dioxus是使用Web技术构建UI的框架。然而,在方法和功能方面存在重大差异。

  • VDOM与细粒度比较:虽然Dioxus拥有性能良好的虚拟DOM(VDOM),但它仍然使用粗粒度/组件作用域的反应性:改变一个有状态值会重新运行组件函数,并对比旧UI与新的UI。Leptos组件使用不同的思维模式,创建(并返回)实际的DOM节点,并设置一个反应性系统来更新这些DOM节点。

  • Web与桌面优先级:Dioxus在其全栈模式中使用Leptos服务器函数,但没有与<Suspense>类似的支持进行流式HTML渲染,或共享对整体Web性能的关注。Leptos倾向于优先考虑整体Web性能(流式HTML渲染、较小的WASM二进制大小等),而Dioxus在构建桌面应用方面拥有无与伦比的经验,因为您的应用程序逻辑以原生Rust二进制形式运行。

  • 这与Sycamore有何不同?

Sycamore和Leptos都受到SolidJS的强烈影响。到目前为止,Leptos拥有更大的社区和生态系统,并且更活跃地开发。其他不同之处

  • 模板DSL:Sycamore使用自定义模板语言为其视图,而Leptos使用类似JSX的模板格式。
  • 'static信号:Leptos的主要创新之一是创建具有优秀易用性的Copy + 'static信号。Sycamore正在采用相同的模式,但尚未发布。
  • Perseus与服务器函数:Perseus元框架提供了一种构建具有服务器功能的Sycamore应用的见解方式。Leptos则提供服务器函数等原语,作为框架的核心。

依赖项

~2–10MB
~94K SLoC