Rust Web 全栈开发(十):编写服务器端 Web 应用

从零开始:用 Rust 编写你的第一个 Web 服务 Rust 是一种现代、高性能的编程语言,近年来在 Web 开发领域也有了一席之地。本文将介绍如何使用 Rust 编写一个简单的 Web程序,从搭建开发环境到创建第一个 Web 页面。 阅读详情

Rust Web 全栈开发(十):编写服务器端 Web 应用

参考视频:https://www.bilibili.com/video/BV1RP4y1G7KF

继续之前的 Actix 项目。

我们已经实现了一个 Web Service,现在我们想创建一个 Web App,在网页端查看并操作数据库中的数据。

在这里插入图片描述

主要的技术是模板引擎,它的作用是以静态页面作为模板,把动态的数据渲染进页面,最后一同返回给用户。

创建成员库:webapp

回到顶层的工作空间,在终端执行命令 cargo new webapp,创建一个新的成员库 webapp。

工作空间的 Cargo.toml 会自动添加这个新成员:

在这里插入图片描述

修改 webapp 中的 Cargo.toml,添加如下依赖:

[package]
name = "webapp"
version = "0.1.0"
edition = "2021"

[dependencies]
actix-files = "0.6.0-beta.16"
actix-web = "4.0.0-rc.2"
awc = "3.0.0-beta.21"
dotenv = "0.15.0"
serde = { version = "1.0.136", features = ["derive"] }
serde_json = "1.0.79"
tera = "1.15.0"

在 webapp 目录下新建一个 .env 文件,内容如下:

HOST_PORT=127.0.0.1:8080

webapp 目录一览:

├── webapp
│   ├── src
│   │   ├── bin
│   │       └── svr.rs
│   │   └── mod.rs
│   │   └── errors.rs
│   │   └── handlers.rs
│   │   └── models.rs
│   │   └── routers.rs
│   ├── static
│   │   ├── css
│   │       └── bootstrap.min.css
│   │   ├── javascript
│   │       └── bootstrap.min.js
│   │       └── jquery.min.js
│   │   └── register.html
│   │   └── teachers.html
│   ├── .env
│   └── Cargo.toml

models

编辑 models.rs:

use serde::{Deserialize, Serialize};

/// 教师信息,用于应用注册
#[derive(Serialize, Deserialize, Debug)]
pub struct TeacherRegisterForm {
    pub name: String,
    pub picture_url: String,
    pub profile: String,
}

/// 教师信息,用于数据库查询
#[derive(Serialize, Deserialize, Debug)]
pub struct TeacherResponse {
    pub id: i32,
    pub name: String,
    pub picture_url: String,
    pub profile: String,
}

handlers

编辑 handlers.rs:

use crate::errors::MyError;
use crate::models::{TeacherRegisterForm, TeacherResponse};
use actix_web::{web, Error, HttpResponse, Result};
use serde_json::json;

pub async fn get_all_teachers(
    tmpl: web::Data<tera::Tera>
) -> Result<HttpResponse, Error> {
    // 创建 HTTP 客户端
    let awc_client = awc::Client::default();

    let res = awc_client
        .get("http://localhost:3000/teachers/")
        .send().await.unwrap()
        .json::<Vec<TeacherResponse>>().await.unwrap();

    // 创建一个上下文,可以向 HTML 模板里添加数据
    let mut ctx = tera::Context::new();
    // 向上下文中插入数据
    ctx.insert("error", "");
    ctx.insert("teachers", &res);

    // s 是渲染的模板,静态部分是 teachers.html,动态数据是 ctx
    let s = tmpl
        .render("teachers.html", &ctx)
        .map_err(|_| MyError::TeraError("Template error".to_string()))?;

    Ok(HttpResponse::Ok().content_type("text/html").body(s))
}

pub async fn show_register_form(
    tmpl: web::Data<tera::Tera>
) -> Result<HttpResponse, Error> {
    let mut ctx = tera::Context::new();
    ctx.insert("error", "");
    ctx.insert("current_name", "");
    ctx.insert("current_picture_url", "");
    ctx.insert("current_profile", "");

    let s = tmpl
        .render("register.html", &ctx)
        .map_err(|_| MyError::TeraError("Template error".to_string()))?;

    Ok(HttpResponse::Ok().content_type("text/html").body(s))
}

pub async fn handle_register(
    tmpl: web::Data<tera::Tera>,
    params: web::Form<TeacherRegisterForm>,
) -> Result<HttpResponse, Error> {
    let mut ctx = tera::Context::new();
    let s;

    if params.name == "Dave" {
        ctx.insert("error", "Dave already exists!");
        ctx.insert("current_name", &params.name);
        ctx.insert("current_picture_url", &params.picture_url);
        ctx.insert("current_profile", &params.profile);
        s = tmpl
            .render("register.html", &ctx)
            .map_err(|err| MyError::TeraError(err.to_string()))?;
    } else {
        let new_teacher = json!({
            "name": &params.name,
            "picture_url": &params.picture_url,
            "profile": &params.profile,
        });

        let awc_client = awc::Client::default();

        let res = awc_client
            .post("http://localhost:3000/teachers/")
            .send_json(&new_teacher)
            .await
            .unwrap()
            .body()
            .await?;

        let teacher_response: String =
            serde_json::from_str(&std::str::from_utf8(&res)?)?;
        s = format!("Message from Web Server: {}", teacher_response);
    }

    Ok(HttpResponse::Ok().content_type("text/html").body(s))
}

get_all_teachers 函数向 http://localhost:3000/teachers/ 发生 GET 请求,将得到的 Vec<TeacherResponse> 渲染到 teachers.html,最终返回一个包含渲染网页的 HTTP Response。

show_register_form 函数创建一个包含教师信息(name、picture_url、profile)的上下文 ctx,渲染到 register.html,最终返回一个包含渲染网页的 HTTP Response。

handle_register 函数判断传入的教师的 name 是否是 Dave 来做出不同的响应。如果是,则将 Dave already exists! 错误信息渲染到 register.html,作为 s。如果不是,则向 http://localhost:3000/teachers/ 发送 json 化的新教师信息,将服务器的响应作为 s。最终返回一个包含 s 的 HTTP Response。

routers

编辑 routers.rs:

use crate::handlers::{get_all_teachers, handle_register, show_register_form};
use actix_files;
use actix_web::web;

pub fn app_config(config: &mut web::ServiceConfig) {
    config.service(
        web::scope("")
            .service(actix_files::Files::new("/static", "./static/").show_files_listing())
            .service(web::resource("/").route(web::get().to(get_all_teachers)))
            .service(web::resource("/register").route(web::get().to(show_register_form)))
            .service(web::resource("/register-post").route(web::post().to(handle_register)))
    );
}

errors

编辑 errors.rs:

use actix_web::{error, http::StatusCode, HttpResponse, Result};
use serde::Serialize;
use std::fmt;

#[derive(Debug, Serialize)]
pub enum MyError {
    ActixError(String),
    #[allow(dead_code)]
    NotFound(String),
    TeraError(String),
}

#[derive(Debug, Serialize)]
pub struct MyErrorResponse {
    error_message: String,
}

impl std::error::Error for MyError {}

impl MyError {
    fn error_response(&self) -> String {
        match self {
            MyError::ActixError(msg) => {
                println!("Server error occurred: {:?}", msg);
                "Internal server error".into()
            }
            MyError::TeraError(msg) => {
                println!("Error in rendering the template: {:?}", msg);
                msg.into()
            }
            MyError::NotFound(msg) => {
                println!("Not found error occurred: {:?}", msg);
                msg.into()
            }
        }
    }
}

impl error::ResponseError for MyError {
    fn status_code(&self) -> StatusCode {
        match self {
            MyError::ActixError(_msg) | MyError::TeraError(_msg) => StatusCode::INTERNAL_SERVER_ERROR,
            MyError::NotFound(_msg) => StatusCode::NOT_FOUND
        }
    }
    fn error_response(&self) -> HttpResponse {
        HttpResponse::build(self.status_code()).json(MyErrorResponse {
            error_message: self.error_response(),
        })
    }
}


impl fmt::Display for MyError {
    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
        write!(f, "{:?}", self)
    }
}

impl From<actix_web::error::Error> for MyError {
    fn from(err: actix_web::error::Error) -> Self {
        MyError::ActixError(err.to_string())
    }
}

mod

mod.rs:

pub mod models;
pub mod handlers;
pub mod routers;
pub mod errors;

svr

bin/svr.rs 类似于 teacher_service.rs。

#[path = "../mod.rs"]
mod webapp;

use actix_web::{web, App, HttpServer};
use dotenv::dotenv;
use routers::app_config;
use std::env;
use webapp::{errors, handlers, models, routers};
use tera::Tera;

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    // 检测并读取 .env 文件中的内容,若不存在也会跳过异常
    dotenv().ok();

    let host_port = env::var("HOST_PORT")
        .expect("HOST_PORT is not set in .env file");
    println!("Listening on {}", &host_port);

    let app = move || {
        let tera = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/static/**/*")).unwrap();
        App::new()
            .app_data(web::Data::new(tera))
            .configure(app_config)
    };

    HttpServer::new(app).bind(&host_port)?.run().await
}

CARGO_MANIFEST_DIR 就是 webapp 目录的地址,这一句代码将该地址与 /static 连接起来,告诉 app 这些静态文件的位置。

static

这个目录下都是网页相关的静态文件。

├── static
│   ├── css
│       └── bootstrap.min.css
│   ├── javascript
│       └── bootstrap.min.js
│       └── jquery.min.js
│   └── register.html
│   └── teachers.html

teachers.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Teachers</title>
    <link rel="stylesheet" href="/static/css/bootstrap.min.css">
</head>

<body>
    <div class="container">
        <h1 class="mt-4 mb-4">Teacher List</h1>
        <ul class="list-group">
            {% for t in teachers %}
            <li class="list-group-item">
                <div class="d-flex w-100 justify-content-between">
                    <h5 class="mb-1">{{t.name}}</h5>
                </div>
                <p class="mb-1">{{t.profile}}</p>
            </li>
            {% endfor %}
        </ul>
        <div class="mt-4">
            <a href="/register" class="btn btn-primary">Register a Teacher</a>
        </div>
    </div>

    <script src="/static/javascript/jquery.min.js"></script>
    <script src="/static/javascript/bootstrap.min.js"></script>
</body>

</html>

register.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Teacher registration</title>
    <link rel="stylesheet" href="/static/css/bootstrap.min.css">
</head>

<body style="background-color: #f2f9fd;">
    <div class="container">
        <h2 class="header text-center mb-4 pt-4">Teacher Registration</h2>
        <div class="row justify-content-center">
            <div class="col-md-6">
                <form action="/register-post" method="POST" class="p-4 bg-white rounded shadow-sm">
                    <div class="form-group">
                        <label for="name">Teacher Name</label>
                        <input type="text" name="name" id="name" value="{{current_name}}" class="form-control">
                    </div>
                    <div class="form-group">
                        <label for="picture_url">Teacher Picture URL</label>
                        <input type="text" name="picture_url" id="picture_url" value="{{current_picture_url}}"
                               class="form-control">
                    </div>
                    <div class="form-group">
                        <label for="profile">Teacher Profile</label>
                        <input type="text" name="profile" id="profile" value="{{current_profile}}" class="form-control">
                    </div>
                    <div>
                        <p style="color: red">{{error}}</p>
                    </div>
                    <br/>
                    <button type="submit" id="button1" class="btn btn-primary">Register</button>
                </form>
            </div>
        </div>
    </div>
    <script src="/static/javascript/jquery.min.js"></script>
    <script src="/static/javascript/bootstrap.min.js"></script>
</body>

</html>

bootstrap.min.css

文件太长,见于:UestcXiye/Actix-Workspace/webapp/static/css/bootstrap.min.css

bootstrap.min.js

文件太长,见于:UestcXiye/Actix-Workspace/webapp/static/javascript/bootstrap.min.js

jquery.min.js

文件太长,见于:UestcXiye/Actix-Workspace/webapp/static/javascript/jquery.min.js

测试

因为路由中配置了 /static,访问 http://localhost:8080/static 会给出项目 static 文件夹的目录:

在这里插入图片描述

数据库中 teacher 表:

在这里插入图片描述

在一个终端 cd 到 webservice,执行命令 cargo run。

在另一个终端 cd 到 webservice,执行命令 cargo run。

在浏览器访问 http://localhost:8080,页面如下:

在这里插入图片描述

webapp 终端输出 Listening on 127.0.0.1:8080。

点击 Register a Teacher 按钮,跳转到 http://localhost:8080/register,可以填写表单,注册新的教师信息。

在这里插入图片描述

我们先测试无法新增的情况,也就是 Teacher Name 是 Dave 的情况:

在这里插入图片描述

再测试可以插入新教师信息的情况:

在这里插入图片描述

插入成功,跳转到 http://localhost:8080/register-post 页面:

在这里插入图片描述

数据库中 teacher 表新增一条教师信息:

在这里插入图片描述

Rust编程基础教程:Web开发入门 作者:禅与计算机程序设计艺术 1.背景介绍 近年来,云计算、大数据、物联网、人工智能等新兴技术带动了web应用的蓬勃发展。Web开发也从传统单页应用程序向多页面应用和全栈开发模式转变。Rust语言作为一门现代化的系统编程语言正在崭露头角。它具有以下特征: 有高效率的运行速度 阅读详情

相关推荐

使用 Rust 开发一个简单的 Web 应用(第一部分:服务器集成)

如果你还没有安装,可以在 Rust 的官方网站(https://www.rust-lang.org)上找到相应的安装说明。你已经成功地使用 Rust 和 actix-web 创建了一个简单的 Web 应用,并将其集成到一个服务器中。你可以根据自己的需求扩展和定制这个应用程序,添加更多的路由处理器和功能。在本文中,我们将使用 Rust 编程语言开发一个简单的 Web 应用,并进行服务器集成。我们将使用 Rust 的一些流行的库和框架来构建和管理我们的 Web 服务器。打开终端并导航到你想要创建项目的目录。

TpCode的博客 782

【小沐学Rust】Rust实现Web服务器

Rust: 一种使每个人都能够构建可靠且高效的软件的语言。如今,全球有数百家公司在生产环境中使用 Rust,以提供快速、资源少、跨平台的解决方案。您熟悉和喜爱的软件,例如Firefox、 Dropbox和Cloudflare,都使用 Rust。从初创公司到大公司,从嵌入式设备到可扩展的 Web 服务,Rust 都非常适合。高性能Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。可靠性。

爱看书的小沐 2793

17、Rust 中服务器端 Web 应用开发全解析

本文深入解析了使用 Rust 结合 Actix 和 Tera 进行服务器端 Web 应用开发的全过程。涵盖了静态页面服务、动态页面渲染、用户输入处理、数据列表展示以及客户端测试等关键环节,帮助开发者构建高性能、安全稳定的 Web 应用。

gpu4optimizer的博客 84

【从零开始的rust web开发之路 一】axum学习使用

目前rust 语言web开发相关的框架已经有很多,但还是和java,go语言比不了。这个系列想完整走一遍web开发,后续有时间就出orm,还有一些别的web用到的库教程。言归正传,开始学习axum框架Axum是一个专注于人体工程学和模块化的Web应用程序框架。

爱音乐的程序猿的博客 7804

【Actix Web】Rust Web开发JWT认证

在现代 Web 开发中,JWT(JSON Web Token)是一种常用的无状态认证方式。通过 JWT,服务端可以发放加密令牌给客户端,客户端每次请求时携带此令牌,服务器通过验证令牌来识别用户身份,省去了服务器端存储会话信息的负担。 Rust 作为一门性能与安全兼备的系统级编程语言,结合 Actix Web 框架开发高性能 Web 应用,成为后端开发的新趋势。

景天科技苑 1万+

Rust服务器端Web应用开发实战

本文详细介绍了如何使用Rust语言和Actix框架开发服务器端Web应用。通过实例演示了如何构建动态网页、处理用户输入和显示列表。同时,也讲述了如何为前端应用编写单元测试,确保代码质量。

weixin_35266799的博客 374

Rust Web 全栈开发(一):构建 TCP Server

Rust Web 全栈开发(一):构建 TCP Server

ProgramNovice的博客 1641

手把手教你校准垂起固定翼(VTOL)遥控器与电调:从零到飞的完整流程

本文详细介绍了垂起固定翼(VTOL)遥控器与电调的校准流程,从基础认知到飞行前检查,涵盖遥控器通道配置、电调校准、舵机方向调整等关键步骤。通过图文并茂的指导,帮助无人机爱好者安全完成VTOL调试,确保首飞成功。特别强调多旋翼模式、过渡模式和固定翼模式的设置要点,适合新手和进阶用户参考。

jenkins8butler的博客 361

Rust全栈开发桌面应用模板:Rust-Yew-Axum-Tauri

Rust全栈开发桌面应用模板:Rust-Yew-Axum-Tauri 项目介绍 rust-yew-axum-tauri-desktop template 是一个基于Rust语言的全栈开发桌面应用模板。它结合了Rust的强大性能、Yew的前端框架、Axum的后端服务、Tauri的桌面应用框架以及Tailwindcss的样式库,为开发者提供了一个高效、现代化的桌面应用开发环境。无论是RESTful A...

gitblog_00934的博客 1621

Dynamics CRM证书更换

  Dynamics CRM产品一般有两种认证方式。第一种是基于声明的内部访问也就是无证书单纯用账号密码验证。第二种就是联合身份认证,需要安装网站证书。   对于联合身份认证的情况因为需要安装证书,而且证书是有一个一年的有效期,所以运维人员每年都需要进行证书更换的操作。以下就是更换证书的方法及过程。 证书根据申请方式一般也分两种,第一种是自建证书,这种证书是没有机构认证的所以安装上之后网站因为没...

bzpfly的博客 878

癌症免疫治疗预测神器TIDE:从原理到实战(避坑指南)

本文详细解析了癌症免疫治疗预测工具TIDE的核心原理及实战应用。TIDE算法通过模拟肿瘤免疫逃逸的两种核心机制(T细胞功能障碍和排除),为临床决策提供精准预测。文章涵盖数据准备、标准化流程、网页工具操作指南及结果解读,帮助科研人员和临床医生避开常见误区,优化免疫治疗策略。

weixin_29309475的博客 199

Axum-Yew 全栈 Rust Web 应用项目教程

Axum-Yew 全栈 Rust Web 应用项目教程 1. 项目介绍 axum-yew-setup 是一个开源项目,旨在为开发者提供一个快速启动的模板,用于构建全栈 Rust Web 应用程序。该项目结合了 axum 和 yew 两个强大的 Rust 库,axum 是一个高性能的 Web 框架,而 yew 是一个用于构建 Web 前端的 Rust 框架。通过这个项目,开发者可以轻松地搭建一个前后...

gitblog_00487的博客 1261

Tessy学习系列(三):单元测试——官方例程isValueInRange

注意:工程名称以及路劲不能包含空格和中文

不吃鱼的猫的博客 2348

WebApp.rs:用Rust构建全栈Web应用的终极指南

WebApp.rs 是一个完全使用 Rust 语言构建的全栈 Web 应用项目,它将后端与前端功能整合在单一 Rust 代码库中,通过现代化技术栈实现高效开发与部署。本指南将带你了解这个项目的核心架构、功能特性以及快速上手的方法,帮助你掌握用 Rust 构建全栈 Web 应用的关键要点。 ## 🚀 为什么选择 WebApp.rs? 在现代 Web 开发中,Rust 凭借其内存安全、高性能和丰

gitblog_00435的博客 865

ubuntu18.04 升级Ubuntu 20.04

Ubuntu 18.04升级20.04指南:首先备份重要数据,更新当前系统并检查新版本可用性(sudo do-release-upgrade -c)。确认升级后执行sudo do-release-upgrade,按提示完成操作。升级过程需耐心等待,完成后重启系统。注意:升级前务必备份数据,确保系统为最新版本,以降低风险。升级后即可使用Ubuntu 20.04系统。

https://ophome.blog.youkuaiyun.com,在IT行业有多年的工作经验,尤其是在Python、Linux、负载均衡、Nginx和服务器运维等领域。 1061

K230+canMV开发中常见的数据类型转换参考示例

【代码】K230+canMV开发中常见的数据类型转换参考示例。

weixin_47446386的博客 68

Leptos与Axum集成:构建全栈Rust应用的最佳组合

在Rust生态系统中构建全栈Web应用时,选择合适的框架组合至关重要。Leptos作为现代化的前端框架,与Axum这一高性能Web框架的结合,为开发者提供了前所未有的开发体验和性能优势。 **读完本文你将掌握:** - Leptos与Axum集成的核心原理 - 完整的全栈Rust应用搭建流程 - 服务器函数(Server Functions)的实现与使用 - 路由配置与状态管理的最佳实践 - 生...

gitblog_00009的博客 1091

海康Visionmaster-通讯管理:使用 Modbus TCP 通讯 协议与流程交互

海康Visionmaster-通讯管理:使用 Modbus TCP 通讯 协议与流程交互

视觉人机器视觉的博客 9183

推荐文章:领略未来Web开发新境界 —— Rust on Nails

推荐文章:领略未来Web开发新境界 —— Rust on Nails 在技术的浪潮中,每当一种新的编程语言或框架崭露头角,都可能引领一场开发模式的变革。今天,我们要深入探讨的,正是这样一位潜在的颠覆者 —— Rust on Nails。这不仅是一个项目的名字,它更是 Rust 编程语言在全栈web开发领域的一次大胆尝试和完美演绎。 项目介绍 Rust on Nails,正如其名,旨在打造一个基于R...

gitblog_00251的博客 1058

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

如何使用 Create Rust App:快速构建现代 Rust+React Web 应用的完整指南

Create Rust App 是一个强大的工具,通过运行一个命令就能快速搭建现代化的 Rust+React Web 应用。它集成了后端框架选择、数据库支持、前端开发环境等多种功能,让开发者能够专注于业务逻辑而非配置细节。 ## 🌟 为什么选择 Create Rust App? Create Rust App 提供了一站式解决方案,帮助开发者快速启动全栈 Rust 应用开发。它的核心优势包括

gitblog_00020的博客 865

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Leptos:使用Rust构建高性能Web应用指南

Leptos:使用Rust构建高性能Web应用指南 【免费下载链接】leptos Build fast web applications with Rust. 项目地址: https://gitcode.com/GitHub_Tr...

gitblog_00286的博客 936

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Rust Web 应用教程

Rust Web 应用教程 项目介绍 Rust Web 应用是一个使用 Rust 语言开发的完整 Web 应用程序。该项目旨在展示如何使用 Rust 构建高性能、内存安全的 Web 应用。项目包含客户端前端和服务器端后端,两者都使用 Rust 编写,并通过 WebAssembly (Wasm) 进行交互。 项目快速启动 环境准备 安装 Rust:确保你已经安装了 Rust 编程语言。可以通过以...

gitblog_01180的博客 804

WebAssembly技术前瞻:全栈Web开发的终极性能革命 [特殊字符]

在当今快速发展的Web开发领域,**WebAssembly**正成为改变游戏规则的关键技术。作为全栈Web开发的重要突破,WebAssembly为开发者提供了前所未有的性能优势。如果你正在学习全栈Web开发,理解WebAssembly技术将是提升你技能树的关键一步。这个强大的二进制指令格式让Web应用能够以前所未有的速度运行,为性能敏感型应用开辟了全新的可能性。 ## 📊 WebAssembl

gitblog_00383的博客 824

Rust语言的Web开发

Rust是一种由Mozilla研究院开发的系统编程语言,首次发布于2010年。它的设计目标是帮助开发者构建快速且安全的系统,尤其是在并发和内存管理方面。Rust在内存安全和数据竞争方面采用了独特的所有权系统,从根本上减少了运行时错误的可能性。内存安全:通过所有权、借用和生命周期机制,Rust能够在编译时检查内存的使用情况,防止常见的内存错误如悬空指针、双重释放等。高性能:Rust的性能可与C和C++媲美,在需要高性能和低延迟的场景中表现优异。并发支持。

2501_90425705的博客 489

探索Silkenweb:构建响应式Web应用的新选择

探索Silkenweb:构建响应式Web应用的新选择 项目介绍 Silkenweb 是一个用于构建响应式Web应用的Rust库。它通过细粒度的响应式信号(signals)来最小化DOM API调用,从而实现高效的性能。与传统的虚拟DOM(VDOM)不同,Silkenweb 采用了一种更为直接的方式来处理DOM更新,减少了不必要的计算开销。此外,Silkenweb 使用纯Rust语法,避免了宏DSL...

gitblog_01199的博客 856
上一篇: Rust Web 全栈开发(九):增加教师管理功能
下一篇: Rust Web 全栈开发(十一):WebAssembly 尝鲜
UestcXiye
博客等级 码龄8年 9031粉丝 1306原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值