探索頂級 Rust web 框架
Web 框架使開發人員更容易進行 Web 開發和構建桌面應用程序,通過標準化構建過程和自動化常見的活動和任務,web 框架可以節省開發人員的時間,甚至可以促進代碼的重用以提高效率。
在本文中,我們將探索 Rust 生態系統中用於前端和後端開發的各種 web 框架。
如何選擇最好的 Rust web 框架
無論你的項目需要什麼,web 框架都可以提供開發團隊需要的 web 服務、web 資源和 web api。在爲項目選擇合適的 web 框架時,開發團隊應該考慮以下因素的相對重要性。
安全性
Rust 的內存安全保證了安全性,這是通過它的所有權模型實現的。然而,並不是所有的 Rust web 框架都能處理安全特性,比如跨站腳本(XSS)和跨站請求僞造(CSRF)。因此,你應該注意如何在框架中處理安全性。
靈活性
框架的靈活性通常歸結爲你需要多少可控性,以及你希望在多大程度上依賴抽象和約定。根據你的經驗來考慮框架的靈活性以及它如何使你的項目受益。
項目大小
較小的項目可能傾向於使用更簡單、更高級的抽象,而較大的項目則需要可伸縮性和高效的併發性。
版本及時更新
與框架的開發保持同步是很重要的——你不會想要使用上一次更新是五年前的框架,因爲它可能會影響安全性和與最新 Rust 特性的兼容性。
文檔
清晰、結構良好的文檔可以顯著加快開發速度,尤其是在新開發人員入職時。
社區支持
社區的規模和參與度決定了在項目過程中出現問題時找到資源、庫和幫助的難易程度——“bug 是工作的一部分”。
前端 Web 框架和 WebAssembly
WebAssembly(Wasm)是一種可以在現代 web 瀏覽器中運行的底層語言編碼,它支持 C/C++, c#, Go 和 Rust,並可以編譯成目標機器的字節碼,因此它可以以接近本機的性能運行在 web 上。Wasm 與 JavaScript 一起運行,可以發佈到 npm 和其他包中。Rust 使用一個名爲 wasm-pack 的工具來組裝和打包針對 WASM 的 crate。
Yew
Yew 是最流行的 Rust 框架之一(它目前在 GitHub 上有 30.5 萬顆星),用於構建現代 web 應用程序。受 React 的啓發,它利用了基於組件的體系結構,並提供了對狀態管理、異步等的支持。
下面是一個使用 Yew 的 Hello World 應用的簡單示例:
可以通過運行以下命令快速探索它是如何工作的:
cargo install generate
cargo install trunk
cargo generate --git https://github.com/yewstack/yew-trunk-minimal-template
trunk serve --open
上面的代碼片段將生成一個樣板代碼,可以用它作爲 Yew 應用程序的起始模板。安裝 Trunk 的原因是因爲 Yew 使用 Trunk 捆綁器來爲 web 提供 HTML。
Perseus
Perseus 是一個 Rust 框架,用於構建響應式 web 應用程序。它支持類似於 Next.js 的功能,但它是爲 Rust 生態系統設計的。
Perseus 的響應式系統由 Sycamore 響應式庫提供支持,並具有對服務器端渲染(SSR)和靜態站點生成(SSG)的原生支持。它目前有超過 2.8k 的 GitHub 顆星。
下面是一個如何用 Perseus 編寫一個簡單的 Hello World 應用程序的例子:
use perseus::prelude::*;
use sycamore::prelude::*;
#[perseus::main(perseus_axum::dflt_server)]
pub fn main<G: Html>() -> PerseusApp<G> {
PerseusApp::new()
.template(
Template::build("index")
.view(|cx| {
view! { cx,
p { "Hello World!" }
}
})
.build()
)
}
要開始使用 Perseus,運行下面的命令創建一個示例應用程序並啓動服務器:
cargo install perseus-cli
perseus new my-app
cd my-app/
perseus serve -w
Sauron
Sauron 是一個受 Elm Architecture 啓發的微型前端框架。它支持事件、狀態管理、客戶端和服務器端 web 開發。一個最簡單的方法來試驗它是如何工作的是通過使用 html2sauron 將 HTML 轉換爲 Sauron 源代碼,如下所示:
Sauron 在 GitHub 上有超過 2k 顆星,對於一個新框架來說,這真是令人印象深刻,這表明人們對該框架的興趣正在增長。
Dioxus
Dioxus 是一個 Rust UI 庫,可以讓你構建響應式跨平臺 UI 組件——它支持 web、移動和桌面應用程序開發。它借鑑了 React 的一些特性(包括鉤子),並使用了自己的虛擬 DOM——可以把它看作是 React 與 Rust 的安全性和速度的混合體。
這是 Dioxus 應用中組件的樣子:
fn app(cx: Scope) -> Element {
let result: &mut u32 = cx.use_hook(|| 0);
cx.render(rsx!(
div { "Hello World" }
))
}
Dioxus 擁有強大的社區支持之一,在 GitHub 上擁有超過 20k 顆星。
Iced
Iced 是一個跨平臺開發 GUI 庫,它的架構也受到 Elm 架構的啓發,並提供對響應式編程、類型安全和速度的內置支持。
Iced 使用以下結構來編寫代碼:
-
狀態:應用程序的狀態
-
消息:你關心的用戶交互或有意義的事件
-
視圖邏輯:一種將狀態顯示爲在用戶交互時產生消息的方法
-
更新邏輯:一種對消息作出反應並更新狀態的方法
這是一種將用戶界面劃分爲不同概念的好方法,這些概念很容易推理。Iced 社區也在迅速發展,GitHub 上有超過 2.4 萬顆星星。
Tauri
Tauri 是一個基於 rust 的庫,通過利用 HTML、CSS 和 JavaScript 等 web 技術爲 UI 構建輕量級桌面應用程序。你可以使用任何可以編譯成 HTML、CSS 和 JavaScript 的前端框架。
與依賴於 Chromium 和 Node.js 的 Electron(一個 JavaScript 桌面應用開發框架)不同,Tauri 使用的是系統的原生 web 視圖。這使得的二進制文件更小和使用更有效的資源。
可以使用 Tauri 框架開發一個從前端到後端邏輯的全棧桌面應用程序。Tauri 也擁有強大的社區支持,擁有超過 81k 個 GitHub 顆星。
後端 Web 框架
後端開發是 web 開發中關注服務器端的一個方面,典型的後端框架包括數據庫管理、會話處理、模板、ORM 和數據庫遷移等功能,用於構建和維護可靠的 web 應用程序。
Rocket
Rocket 是一個流行的 Rust 異步 web 框架,它簡化了開發。它抽象了 web 開發的許多潛在複雜性,因此你可以專注於使用用戶友好的 API 構建主要業務邏輯,而不會影響安全性和速度。
作爲最早的 Rust 框架之一,它在 GitHub 上擁有超過 24k 顆星。
下面是一個簡單的 Rocket 服務器示例,它接受兩個查詢參數並返回一個 Happy Birthday 消息:
#[macro_use] extern crate rocket;
#[get("/<name>/<age>")]
fn birthday(name: &str, age: u8) -> String {
format!("Yayyy, {}, you are {} years old! Happy Birthday to you.", name, age)
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/birthday-message", routes![hello])
}
Actix Web
Actix Web 是一個基於參與者模型的後端 Web 框架,可以構建大規模複雜的 Web 應用程序。雖然它很複雜,但它公開了底層實現以支持進一步的定製。
下面是一個簡單的 Happy Birthday API 的例子,使用 Actix Web 來了解它是什麼樣子的:
use actix_web::{get, web, App, HttpServer, Responder};
#[get("/birthday-message/{name}/{age}")]
async fn birthday(name: web::Path<(String, u8)>) -> impl Responder {
format!(
"Hello, {}, you are {} years old! Happy Birthday!",
name.0, name.1
)
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new().service(birthday))
.bind("127.0.0.1:8080")?
.run()
.await
}
它有一個龐大的開發者社區,在 GitHub 上擁有超過 21k 顆星。
Axum
Axum 是一個現代的、異步優先的 web 框架,建立在流行的 Tokio 生態系統之上,旨在構建可擴展和可維護的 web 應用程序。
Axum 是一個非常健壯的 web 框架,但它並沒有暴露太多底層實現以避免複雜性,因爲它試圖對社區中的新開發人員更友好,所以與 Actix 相比,你不會看到很多可怕的泛型,因爲它抽象了其中的一些。它功能強大,支持許多現代 web api,如 HTTP/2、WebSockets 等。
與 Actix Web 相比,Axum 讓初學者更容易構建中間件,這是我認爲 Axum 最好的特性之一。
下面是一個簡單的 Happy Birthday API 的例子:
use axum::{extract::Path, routing::get, Router};
async fn birthday(Path((name, age)): Path<(String, u8)>) -> String {
format!(
"Yayyy, {}, you are {} years old! Happy Birthday to you.",
name, age
)
}
#[tokio::main]
async fn main() {
let app = Router::new().route("/birthday/:name/:age", get(birthday));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
Axum 的社區規模很大,而且還在不斷增長,在 GitHub 上擁有超過 18.3k 顆星。
Warp
Warp 的設計是快速、輕量級和可組合的,開始使用它並開始構建高性能 api 是很容易的。
爲了進一步說明使用 Warp 是多麼容易,這裏有一個簡單的 API,模仿我們一直在使用的相同的 Happy Birthday 示例。它現在看起來短了很多,但仍然很容易理解:
use warp::Filter;
#[tokio::main]
async fn main() {
let birthday = warp::path!("birthday" / String / u8)
.map(|name, age| {
format!("Yayyy, {}, you are {} years old! Happy Birthday to you.", name, age)
});
warp::serve(birthday)
.run(([127, 0, 0, 1], 3030))
.await;
}
Warp 在 GitHub 上有超過 9.5k 顆星,它的開發者社區還在繼續增長!
Tide
Tide 是一個小型框架,類似於 Express.js (Node.js)、Sinatra (Ruby)和 Flask (Python),用於快速開發,異步構建 web 應用程序。它擁有在大多數成熟的 web 框架中可以找到的大部分功能,包括路由、認證、套接字、日誌、模板引擎、中間件、測試和其他實用程序。
下面是一個簡單的 Happy Birthday 應用程序:
use tide::Request;
async fn birthday(_req: Request<()>) -> tide::Result<String> {
Ok("Happy Birthday!
".into())
}
#[async_std::main]
async fn main() -> tide::Result<()> {
let mut app = tide::new();
app.at("/birthday").get(birthday);
app.listen("127.0.0.1:8080").await?;
Ok(())
}
Tide 使用 async-std,這是爲了異步實現的速度和安全性而構建的,它在 GitHub 上也有大約 5k 顆星。
比較最流行的 Rust web 後端框架
Actix、Rocket、Axum 和 Warp 都是流行的 Rust web 框架,每個框架都有自己獨特的功能和優勢。下面讓我們仔細看看它們的共同點:
非阻塞 IO
Actix、Rocket、Axum 和 warp 都使用 Rust 的 async/await 語法爲 web 應用程序提供非阻塞 I/O 操作。這允許更好的性能和可伸縮性,因爲框架可以同時處理多個請求而不會阻塞或減慢速度。
中間件
中間件是 web 框架中的一個常見特性,它允許開發人員在請求 - 響應週期中添加功能,例如日誌記錄、身份驗證和錯誤處理。所有最流行的 Rust web 框架——Actix、Rocket、Tide 和 warp 都支持中間件。
WebSocket
它們都支持 WebSocket,但是使用 WebSocket 的具體語法和特性可能因框架而異,因此框架的選擇將取決於項目的具體需求。
高併發性
Actix 和 Axum 可能更適合需要高併發性和高性能的應用程序,而 Rocket 和 warp 可能更適合優先考慮易用性和靈活性的應用程序。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/T_PO3oyKl0hSdFddpKPDbw