探索頂級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可能更適合優先考慮易用性和靈活性的應用程序。