偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

探索頂級Rust Web框架,你學(xué)到了什么?

開發(fā) 架構(gòu)
Actix、Rocket、Axum和warp都使用Rust的async/await語法為web應(yīng)用程序提供非阻塞I/O操作。這允許更好的性能和可伸縮性,因?yàn)榭蚣芸梢酝瑫r(shí)處理多個(gè)請求而不會阻塞或減慢速度。

Web框架使開發(fā)人員更容易進(jìn)行Web開發(fā)和構(gòu)建桌面應(yīng)用程序,通過標(biāo)準(zhǔn)化構(gòu)建過程和自動化常見的活動和任務(wù),web框架可以節(jié)省開發(fā)人員的時(shí)間,甚至可以促進(jìn)代碼的重用以提高效率。

在本文中,我們將探索Rust生態(tài)系統(tǒng)中用于前端和后端開發(fā)的各種web框架。

如何選擇最好的Rust web框架

無論你的項(xiàng)目需要什么,web框架都可以提供開發(fā)團(tuán)隊(duì)需要的web服務(wù)、web資源和web api。在為項(xiàng)目選擇合適的web框架時(shí),開發(fā)團(tuán)隊(duì)?wèi)?yīng)該考慮以下因素的相對重要性。

安全性

Rust的內(nèi)存安全保證了安全性,這是通過它的所有權(quán)模型實(shí)現(xiàn)的。然而,并不是所有的Rust web框架都能處理安全特性,比如跨站腳本(XSS)和跨站請求偽造(CSRF)。因此,你應(yīng)該注意如何在框架中處理安全性。

靈活性

框架的靈活性通常歸結(jié)為你需要多少可控性,以及你希望在多大程度上依賴抽象和約定。根據(jù)你的經(jīng)驗(yàn)來考慮框架的靈活性以及它如何使你的項(xiàng)目受益。

項(xiàng)目大小

較小的項(xiàng)目可能傾向于使用更簡單、更高級的抽象,而較大的項(xiàng)目則需要可伸縮性和高效的并發(fā)性。

版本及時(shí)更新

與框架的開發(fā)保持同步是很重要的——你不會想要使用上一次更新是五年前的框架,因?yàn)樗赡軙绊懓踩院团c最新Rust特性的兼容性。

文檔

清晰、結(jié)構(gòu)良好的文檔可以顯著加快開發(fā)速度,尤其是在新開發(fā)人員入職時(shí)。

社區(qū)支持

社區(qū)的規(guī)模和參與度決定了在項(xiàng)目過程中出現(xiàn)問題時(shí)找到資源、庫和幫助的難易程度——“bug是工作的一部分”。

前端Web框架和WebAssembly

WebAssembly(Wasm)是一種可以在現(xiàn)代web瀏覽器中運(yùn)行的底層語言編碼,它支持C/C++, c#, Go和Rust,并可以編譯成目標(biāo)機(jī)器的字節(jié)碼,因此它可以以接近本機(jī)的性能運(yùn)行在web上。Wasm與JavaScript一起運(yùn)行,可以發(fā)布到npm和其他包中。Rust使用一個(gè)名為wasm-pack的工具來組裝和打包針對WASM的crate。

Yew

Yew是最流行的Rust框架之一(它目前在GitHub上有30.5萬顆星),用于構(gòu)建現(xiàn)代web應(yīng)用程序。受React的啟發(fā),它利用了基于組件的體系結(jié)構(gòu),并提供了對狀態(tài)管理、異步等的支持。

下面是一個(gè)使用Yew的Hello World應(yīng)用的簡單示例:

圖片圖片

可以通過運(yùn)行以下命令快速探索它是如何工作的:

cargo install generate
cargo install trunk
cargo generate --git https://github.com/yewstack/yew-trunk-minimal-template
trunk serve --open

上面的代碼片段將生成一個(gè)樣板代碼,可以用它作為Yew應(yīng)用程序的起始模板。安裝Trunk的原因是因?yàn)閅ew使用Trunk捆綁器來為web提供HTML。

Perseus

Perseus是一個(gè)Rust框架,用于構(gòu)建響應(yīng)式web應(yīng)用程序。它支持類似于Next.js的功能,但它是為Rust生態(tài)系統(tǒng)設(shè)計(jì)的。

Perseus的響應(yīng)式系統(tǒng)由Sycamore響應(yīng)式庫提供支持,并具有對服務(wù)器端渲染(SSR)和靜態(tài)站點(diǎn)生成(SSG)的原生支持。它目前有超過2.8k的GitHub顆星。

下面是一個(gè)如何用Perseus編寫一個(gè)簡單的Hello World應(yīng)用程序的例子:

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,運(yùn)行下面的命令創(chuàng)建一個(gè)示例應(yīng)用程序并啟動服務(wù)器:

cargo install perseus-cli
perseus new my-app
cd my-app/
perseus serve -w

Sauron

Sauron是一個(gè)受Elm Architecture啟發(fā)的微型前端框架。它支持事件、狀態(tài)管理、客戶端和服務(wù)器端web開發(fā)。一個(gè)最簡單的方法來試驗(yàn)它是如何工作的是通過使用html2sauron將HTML轉(zhuǎn)換為Sauron源代碼,如下所示:

圖片圖片

Sauron在GitHub上有超過2k顆星,對于一個(gè)新框架來說,這真是令人印象深刻,這表明人們對該框架的興趣正在增長。

Dioxus

Dioxus是一個(gè)Rust UI庫,可以讓你構(gòu)建響應(yīng)式跨平臺UI組件——它支持web、移動和桌面應(yīng)用程序開發(fā)。它借鑒了React的一些特性(包括鉤子),并使用了自己的虛擬DOM——可以把它看作是React與Rust的安全性和速度的混合體。

這是Dioxus應(yīng)用中組件的樣子:

fn app(cx: Scope) -> Element {
    let result: &mut u32 = cx.use_hook(|| 0);

    cx.render(rsx!(
        div { "Hello World" }
    ))
}

Dioxus擁有強(qiáng)大的社區(qū)支持之一,在GitHub上擁有超過20k顆星。

Iced

Iced是一個(gè)跨平臺開發(fā)GUI庫,它的架構(gòu)也受到Elm架構(gòu)的啟發(fā),并提供對響應(yīng)式編程、類型安全和速度的內(nèi)置支持。

Iced使用以下結(jié)構(gòu)來編寫代碼:

  • 狀態(tài):應(yīng)用程序的狀態(tài)
  • 消息:你關(guān)心的用戶交互或有意義的事件
  • 視圖邏輯:一種將狀態(tài)顯示為在用戶交互時(shí)產(chǎn)生消息的方法
  • 更新邏輯:一種對消息作出反應(yīng)并更新狀態(tài)的方法

這是一種將用戶界面劃分為不同概念的好方法,這些概念很容易推理。Iced社區(qū)也在迅速發(fā)展,GitHub上有超過2.4萬顆星星。

Tauri

Tauri是一個(gè)基于rust的庫,通過利用HTML、CSS和JavaScript等web技術(shù)為UI構(gòu)建輕量級桌面應(yīng)用程序。你可以使用任何可以編譯成HTML、CSS和JavaScript的前端框架。

與依賴于Chromium和Node.js的Electron(一個(gè)JavaScript桌面應(yīng)用開發(fā)框架)不同,Tauri使用的是系統(tǒng)的原生web視圖。這使得的二進(jìn)制文件更小和使用更有效的資源。

可以使用Tauri框架開發(fā)一個(gè)從前端到后端邏輯的全棧桌面應(yīng)用程序。Tauri也擁有強(qiáng)大的社區(qū)支持,擁有超過81k個(gè)GitHub顆星。

后端Web框架

后端開發(fā)是web開發(fā)中關(guān)注服務(wù)器端的一個(gè)方面,典型的后端框架包括數(shù)據(jù)庫管理、會話處理、模板、ORM和數(shù)據(jù)庫遷移等功能,用于構(gòu)建和維護(hù)可靠的web應(yīng)用程序。

Rocket

Rocket是一個(gè)流行的Rust異步web框架,它簡化了開發(fā)。它抽象了web開發(fā)的許多潛在復(fù)雜性,因此你可以專注于使用用戶友好的API構(gòu)建主要業(yè)務(wù)邏輯,而不會影響安全性和速度。

作為最早的Rust框架之一,它在GitHub上擁有超過24k顆星。

下面是一個(gè)簡單的Rocket服務(wù)器示例,它接受兩個(gè)查詢參數(shù)并返回一個(gè)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是一個(gè)基于參與者模型的后端Web框架,可以構(gòu)建大規(guī)模復(fù)雜的Web應(yīng)用程序。雖然它很復(fù)雜,但它公開了底層實(shí)現(xiàn)以支持進(jìn)一步的定制。

下面是一個(gè)簡單的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
}

它有一個(gè)龐大的開發(fā)者社區(qū),在GitHub上擁有超過21k顆星。

Axum

Axum是一個(gè)現(xiàn)代的、異步優(yōu)先的web框架,建立在流行的Tokio生態(tài)系統(tǒng)之上,旨在構(gòu)建可擴(kuò)展和可維護(hù)的web應(yīng)用程序。

Axum是一個(gè)非常健壯的web框架,但它并沒有暴露太多底層實(shí)現(xiàn)以避免復(fù)雜性,因?yàn)樗噲D對社區(qū)中的新開發(fā)人員更友好,所以與Actix相比,你不會看到很多可怕的泛型,因?yàn)樗橄罅似渲械囊恍?。它功能?qiáng)大,支持許多現(xiàn)代web api,如HTTP/2、WebSockets等。

與Actix Web相比,Axum讓初學(xué)者更容易構(gòu)建中間件,這是我認(rèn)為Axum最好的特性之一。

下面是一個(gè)簡單的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的社區(qū)規(guī)模很大,而且還在不斷增長,在GitHub上擁有超過18.3k顆星。

Warp

Warp的設(shè)計(jì)是快速、輕量級和可組合的,開始使用它并開始構(gòu)建高性能api是很容易的。

為了進(jìn)一步說明使用Warp是多么容易,這里有一個(gè)簡單的API,模仿我們一直在使用的相同的Happy Birthday示例。它現(xiàn)在看起來短了很多,但仍然很容易理解:

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顆星,它的開發(fā)者社區(qū)還在繼續(xù)增長!

Tide

Tide是一個(gè)小型框架,類似于Express.js (Node.js)、Sinatra (Ruby)和Flask (Python),用于快速開發(fā),異步構(gòu)建web應(yīng)用程序。它擁有在大多數(shù)成熟的web框架中可以找到的大部分功能,包括路由、認(rèn)證、套接字、日志、模板引擎、中間件、測試和其他實(shí)用程序。

下面是一個(gè)簡單的Happy Birthday應(yīng)用程序:

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,這是為了異步實(shí)現(xiàn)的速度和安全性而構(gòu)建的,它在GitHub上也有大約5k顆星。

比較最流行的Rust web后端框架

Actix、Rocket、Axum和Warp都是流行的Rust web框架,每個(gè)框架都有自己獨(dú)特的功能和優(yōu)勢。下面讓我們仔細(xì)看看它們的共同點(diǎn):

非阻塞IO

Actix、Rocket、Axum和warp都使用Rust的async/await語法為web應(yīng)用程序提供非阻塞I/O操作。這允許更好的性能和可伸縮性,因?yàn)榭蚣芸梢酝瑫r(shí)處理多個(gè)請求而不會阻塞或減慢速度。

中間件

中間件是web框架中的一個(gè)常見特性,它允許開發(fā)人員在請求-響應(yīng)周期中添加功能,例如日志記錄、身份驗(yàn)證和錯(cuò)誤處理。所有最流行的Rust web框架——Actix、Rocket、Tide和warp都支持中間件。

WebSocket

它們都支持WebSocket,但是使用WebSocket的具體語法和特性可能因框架而異,因此框架的選擇將取決于項(xiàng)目的具體需求。

高并發(fā)性

Actix和Axum可能更適合需要高并發(fā)性和高性能的應(yīng)用程序,而Rocket和warp可能更適合優(yōu)先考慮易用性和靈活性的應(yīng)用程序。

責(zé)任編輯:武曉燕 來源: coding到燈火闌珊
相關(guān)推薦

2024-07-31 09:28:56

2024-08-12 15:44:06

2023-10-16 08:55:43

Redisson分布式

2023-04-10 07:40:36

GraphQLRest通信模式

2024-11-13 09:22:40

2022-07-19 08:04:04

HTTP應(yīng)用層協(xié)議

2023-06-03 00:05:18

TypeScriptJSDoc掃描器

2020-07-21 18:54:21

Rust類型轉(zhuǎn)換語言

2024-04-12 08:54:13

從庫數(shù)據(jù)庫應(yīng)用

2023-12-07 08:35:22

2025-02-28 00:03:00

2023-06-06 08:14:18

核心Docker應(yīng)用程序

2023-04-26 22:52:19

視覺人臉檢測人臉對齊

2021-03-09 09:55:02

Vuejs前端代碼

2021-09-03 06:46:34

MyBatis緩存后端

2023-04-26 01:25:05

案例故障模型

2021-12-26 18:30:56

嵌入式ARM鏈接

2023-06-30 07:30:38

2021-07-29 18:46:52

可視化類型圖形化

2015-09-06 16:03:57

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號