ご注意:このフレームワークは活発に開発中です。現時点では0.0.xリリースのサイクルで保持しており、0.1.0の準備ができていないことを示しています。ドキュメントと機能に関する活発な作業が行われており、APIは必ずしも安定していると見なされるべきではありません。同時に、それはおもちゃのプロジェクトや概念実証以上のものであり、私は自分のアプリケーション開発に積極的に使用しています。
use leptos::*;
#[component]
pub fn SimpleCounter(cx: Scope, initial_value: i32) -> Element {
// create a reactive signal with the initial value
let (value, set_value) = create_signal(cx, 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);
// this JSX is compiled to an HTML template string for performance
view! {
cx,
<div>
<button on:click=clear>"Clear"</button>
<button on:click=decrement>"-1"</button>
<span>"Value: " {move || value().to_string()} "!"</span>
<button on:click=increment>"+1"</button>
</div>
}
}
// Easy to use with Trunk (trunkrs.dev) or with a simple wasm-bindgen setup
pub fn main() {
mount_to_body(|cx| view! { cx, <SimpleCounter initial_value=3 /> })
}
Leptos は、フルスタックの同型 Rust ウェブフレームワークで、きめ細かな反応性を活用して宣言型のユーザーインターフェイスを構築します。
Resource
<Suspense/>
Leptosについてもっと学ぶためのいくつかのリソースがあります:
nightly手記
ほとんどの例は、あなたが使用していることを前提としています Rust.安定版 (stable) を使用している場合は、次の点に注意してください。
nightly
"stable"
Cargo.toml
leptos = { version = "0.0", features = ["stable"] }
nightlyシグナルにアクセスして設定するための関数呼び出し構文を有効にします。ご利用の場合は、 あなたはただ電話します、、または手動で。正しい API の例については、
カウンタ安定版の例
を確認してください。stable
.get()
.set()
.update()
サーバー上のLeptosのHTMLレンダリングをTera、Yew、Sycamoreと比較するベンチマークを作成しました。ここでベンチマークを見つけて、自分で実行できます。LeptosはHTMLをTeraとほぼ同じ速さでレンダリングし、テンプレートが大きくなるにつれて適切にスケーリングされます。これは、同様のフレームワークによって行われるサーバー側のHTMLレンダリングよりも大幅に高速です。
cargo bench
ns/iter | テラ | レプトス | 櫟 | プラタナス |
3 カウンター | 3,454 | 5,666 | 34,984 | 32,412 |
TodoMVC (todos なし) | 2,396 | 5,561 | 38,725 | 68,749 |
TodoMVC (1000 todos) | 3,829,447 | 3,077,907 | 5,125,639 | 19,448,900 |
平均 | 1.08 | 1.65 | 6.25 | 9.36 |
フロントエンドWebフレームワークの生のレンダリングパフォーマンスをテストするためのゴールドスタンダードは、js-framework-benchmarkです。公式の結果には、Leptosが最速のRust / Wasmフレームワークとしてリストされており、SolidJSよりもわずかに遅く、Svelte、Preact、Reactなどの一般的なJSフレームワークよりも大幅に高速です。
もちろん!明らかにマクロはDOMノードを生成するためのものですが、リアクティブシステムを使用して、DOMと同じ種類のオブジェクト指向のイベントコールバックベースのフレームワークを使用するGUIツールキットをネイティブに簡単に駆動できます。原則は同じです。
view
私は非常に簡単なGTKの例をまとめたので、私が何を意味するのかがわかります。
表面的には、これらのライブラリは似ているように見えるかもしれません。もちろん、YewはWeb UI開発のための最も成熟したRustライブラリであり、巨大なエコシステムを持っています。ダイオクサスは多くの点で似ており、Reactに大きく影響を受けています。Leptosとこれらのフレームワークの概念的な違いは次のとおりです。
概念的には、これら 2 つのフレームワークは非常に似ています: どちらもきめ細かい反応性に基づいて構築されているため、ほとんどのアプリは 2 つの間で非常によく似ており、Sycamore または Leptos アプリはどちらも SolidJS アプリによく似ています。
大きな違いを生むいくつかの実際的な違いがあります。
view
view
<template>
document.createElement()
create_rw_signalを使用して統一された読み取り/書き込みシグナルを提供できます)。
let (count, set_count) = create_signal(cx, 0);
count()
count.get()
let (count, set_count) = create_signal(cx, 0); // a signal
let double_count = move || count() * 2; // a derived signal
let memoized_count = create_memo(cx, move |_| count() * 3); // a memo
// all are accessed by calling them
assert_eq!(count(), 0);
assert_eq!(double_count(), 0);
assert_eq!(memoized_count(), 0);
// this function can accept any of those signals
fn do_work_on_signal(my_signal: impl Fn() -> i32) { ... }
静的です。
LeptosとSycamoreはどちらも、クロージャ(特にイベントリスナー)で信号を動かす苦痛を和らげ、RustUIコードで非常に馴染みのある信号を回避します。Sycamoreは、バンプ割り当てを使用してシグナルの有効期間をスコープに結び付けることによってこれを行います:参照はクロージャに移動できます。Leptosは、アリーナの割り当てを使用し、インデックスを回すことによってこれを行います:、のようなタイプは、実際にはインデックスをアリーナにラッパーします。これは、スコープとシグナルの両方がボタンディンレプトスであることを意味し、生涯の複雑さを追加することなく、クロージャに簡単に移動できることを意味します。Copy
{ let count = count.clone(); move |_| ... }
Copy
&'a Signal<T>
ReadSignal<T>
WriteSignal<T>
Memo<T>
Copy
'static