53 个版本
0.7.0-preview2 | 2024年4月29日 |
---|---|
0.7.0-beta2 | 2024年8月15日 |
0.7.0-beta | 2024年7月24日 |
0.6.9 | 2024年3月4日 |
0.2.4 | 2023年3月21日 |
#816 in 网页开发
58,266 每月下载量
用于 186 个crate(直接使用4个)
49KB
896 行
网站 | 书籍 | 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 可以用于构建在浏览器(客户端渲染)或服务器(服务器端渲染)中运行的应用,或通过在服务器上渲染 HTML 然后在浏览器中添加交互性(服务器端渲染与激活)。这包括对数据(
Resource
)和 HTML(组件的有序或无序流)的 HTTP 流的支持。 - 同构:Leptos 提供了编写同构 服务器函数 的原语,即可以在客户端或服务器上以“相同形状”调用的函数,但仅在服务器上运行。这意味着您可以在与客户端组件一起消耗它的服务器端逻辑(数据库请求、身份验证等)旁边编写,就像它们在浏览器中运行一样调用服务器函数,而无需创建和维护单独的 REST 或其他 API。
- 网页: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
以及我们为 Actix 或 Axum 制作的启动模板。
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(λεπτός)是古希腊语中的一个单词,意为“瘦,轻,精致,细粒度”。对我来说,作为一个古典学者而不是狗的主人,它唤起了驱动框架的轻量级响应式系统。我后来了解到,这个词也是医疗术语“莱托斯菌病”的词根,这是一种影响人类和动物的血液感染... 我的错误。在创建此框架的过程中没有伤害任何狗。
它是否已准备好投入生产?
人们通常通过这个问题意味着三件事情。
- API 是否稳定? 即,我是否需要将我的整个应用程序从 Leptos 0.1 重写到 0.2,再重写到 0.3,然后到 0.4,或者我现在就可以编写它,并在新版本发布时从中受益于新功能和更新?
API基本已稳定。我们正在添加新功能,但对类型系统和模式落地的地方非常满意。在架构方面,我预计不会对您的代码进行重大破坏性更改以适应未来的版本。
- 有bug吗?
是的,我确信有。您可以从我们问题跟踪器的历史状态中看到,bug并不多,并且它们通常被迅速解决。但肯定的是,您可能会遇到需要框架级别修复的情况,这可能会被立即解决。
- 我是消费者还是贡献者?
这可能是最大的一个问题:“生产就绪”意味着对库的一种特定定位:您基本上可以使用它,而不需要了解其内部结构或贡献能力。每个人在其堆栈的某个级别上都有这种能力:例如,我(@gbj)目前没有能力或知识来贡献像wasm-bindgen
这样的东西:我仅仅依赖于它工作。
目前有几个人在社区中正在使用Leptos进行工作内部应用,他们也成为了重要的贡献者。我认为这是目前正确的生产使用水平。可能有一些您需要的缺失功能,您最终可能会自己构建它们!但对于内部应用,如果您愿意在过程中构建和贡献缺失的部分,框架现在肯定是可以使用的。
我可以用来做原生GUI吗?
当然可以!显然,view
宏是用来生成DOM节点的,但您可以使用响应式系统轻松地驱动任何使用与DOM相同类型的面向对象、基于事件回调的框架的原生GUI工具包。原则是相同的
- 使用信号、派生信号和memo创建您的响应式系统
- 创建GUI小部件
- 使用事件监听器更新信号
- 创建效果以更新UI
我创建了一个非常简单的GTK示例,以便您可以看到我的意思。
为0.7开发的新渲染方法支持“通用渲染”,即它可以使用支持一组小功能(6-8个函数)的任何渲染库。(这是在DOM、GTK等典型保留模式、面向对象风格的GUI工具包之上的一个层。)未来的渲染工作将允许以与网络框架使用的声明性方法更相似的方式创建原生UI。
这与Yew有什么不同?
Yew是Rust网络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与新的一相比较。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则在其框架核心中提供如服务器函数等原语。
依赖项
~1.3–1.9MB
~35K SLoC