Rust for Web 面向 NodeJS 开发人员的 Rust Web 开发简介

2025-05-24

Rust for Web面向 NodeJS 开发人员的 Rust Web 开发简介

您可以在此处找到本系列的第二篇文章(“部署您的第一个 Rust 应用程序”)

Rust 则不同。你可以在周末学习 Python 或 Ruby,创建第一个 CRUD 应用程序,并对结果感到满意。

用 Rust……你会很费劲地把一个字符串传递给不同的方法,修改后再返回。然后你会订购 Rust 的书,看看它的大小,叹息一声,然后开始学习。

下班后,经过几周的努力,你终于可以放弃,等待别人制作出简单易懂的教程。

这是您的“简单”教程

我也曾遇到过同样的问题。然而,生活环境给了我几个月的空闲时间,让我能够真正专注于 Rust。

以下是初步概述、概念和后续步骤。在接下来的几周和几个月里,我将发布一系列文章,帮助您从概念到产品。

NodeJS 与 Rust

安装它们之后(本例中我选择了 macOS 的 brew,安装方法无关紧要),底层堆栈看起来有所不同。NodeJS 需要 V8(来自 Google 的运行时引擎)以及与 JavaScript 库的绑定才能运行 JavaScript 代码。

Rust 几乎完全依赖于 Rust 本身。只有编译器使用了用 C 和 C++ 编写的llvm 库。

os_difference_node_rust

Rust 中有多少“网络”?

Rust 的设计决定是不再包含标准 http 库。因此,OSI 层的覆盖范围有所不同:

osi_layer_rust_node

Node 覆盖整个堆栈,并提供 Koa 和 Express,这两个著名且“坚如磐石”的 Web 框架可帮助您在 HTTP 之上构建应用程序。

Rust 方面,Rust 核心只实现了TCP。不过,目前的 Web 框架(actixrocket)实现了 HTTP 之前的所有内容。所以你不需要关心这些协议的来源。

如果您想使用纯 HTTP 调用而不使用任何更大的框架,您可以安装实现 HTTP 协议(​​如hypertiny_http )的“crates”(相当于 Node 世界中的 npm 包)

npm 与 cargo

Node 使用 npm 进行包管理:

  • npm install正在安装依赖项
  • npm run xyz正在执行内部脚本package.json

在 Rust 方面,cargo处理与您的项目相关的所有事情

  • cargo new NAME --bin正在创建一个应用程序
  • cargo new NAME --lib创建一个图书馆
  • cargo run正在执行代码
  • cargo build正在创建可执行文件
  • cargo test正在运行项目内的所有测试

有一个开放的 PR需要添加cargo add以安装依赖项。现在您必须手动将它们添加到您的Cargo.toml文件中。如您所见,您无需在文件中包含脚本来package.json运行测试或构建和测试您的应用程序。

cargo run思维转变:Cargo 会在版本号发生变化后才获取软件包。因此,第一次获取时会获取所有软件包,第二次获取时则仅在版本号发生变化时才获取。与npm iwhich 不同,Cargo 会立即获取软件包,并将其添加到package.json带有save注释的版本号中。

生态系统

Node 的成功并非毫无道理。它的生态系统丰富而繁荣。Rust 仍在发展中,但已经拥有许多优秀的“crates”。网站arewewebyet.org正在跟踪 Rust 的进展,并向您展示 Rust 世界中一些有趣的软件包。

此外,我们还在尝试创建一个名为Tide的官方 Rust Web 框架。它已经相当成熟,可以用于一些业余项目。欢迎您贡献自己的力量,帮助打造一个优秀的 Rust Web 开发环境。

Asnyc 编程又名 Promises 又名 Futures

Node 的杀手级特性是 Promises。虽然 Promises 和事件循环并不总是那么容易理解和使用,但它们正是 Node 如此赚钱的关键所在。

Rust 也正在实现一种异步机制,但尚未最终版本。它被称为Futures 。一个名为Tokio的库已经提供了异步运行时。您可以在areweasyncyet上跟踪 Rust 异步编程的进展

如何开始?

  1. 安装 Rust:curl https://sh.rustup.rs -sSf | sh
  2. 创建新项目:cargo new web-app --bin
  3. cd web-app

现在,您可以选择所需的 Web 框架。您可以从rocketactix开始。您可以按照网站上的教程来运行第一个 Web 应用程序。

注意:undefined、借用和类型

为了不让我在下一篇文章之前感到沮丧,以下是有关 Rust 的四个主要方面,你必须习惯它们(一段时间后它们会变得非常棒)。

updated_reqwest_example

  1. 没有 undefined。Rust 没有真正的空值。这是一个特性。Rust 有一种名为Option的类型,它封装了返回值或 None。在本例中,我们使用Result类型来返回值。您可以返回一个可能包含 String 值的 Option 而不是返回 String,或者如果我们要获取的网站不包含任何文本,则返回 None。一种简单的解决方案(不应在生产环境中使用)是.unwrap()从封装中获取 String 的结果。家庭作业:尝试检查 GET 请求是否出错,并在这种情况下返回 Error 而不是 Ok()。
  2. 你肯定听说过借用。简而言之:每次对非平凡类型(所有没有固定大小的类型)赋值 (=) 都会转移所有权。该方法fetch_text()并非获取 URL 的所有权,而只是(通过 )使用对它的引用&作业:弄清楚这段代码失败的原因以及如何解决。
  3. 你总是需要知道方法返回的是哪种类型。在这个例子中,我们的 HTTP cratereqwest返回了一个实现了特定方法的 Response 结构体(类型)。和许多 crate 一样,它的文档非常出色。所以可以看看这里
  4. 你无需输入任何代码return即可从方法中返回值。只要不在;语句末尾添加 ,它就会成为你的返回值。

使用此示例进行尝试,看看哪里会出现错误并学习如何修复它们。

就这些吗?

两种观点:

  • “很遗憾,没有!”
  • “不,但那是件好事!”

实际上,你需要学习相当多的 Rust 知识才能入门。这正是我来这里的目的。在接下来的几天、几周和几个月里,我将涵盖从基础知识到创建可靠 Web 应用程序的整个过程。

在此之前,我可以推荐Exercism.io 上的 Rust 轨迹和 Rust Book,您也可以在当地书店或亚马逊上找到纸质版本。

正如我在第一篇文章中提到的,Rust 正在帮助你成为更优秀的开发者,所以这条路有时会很漫长,但总是值得的。请在TwitterMediumdev.to上关注我,获取最新资讯!

文章来源:https://dev.to/gruberb/intro-to-web-programming-in-rust-for-nodejs-developers-lp
PREV
Java Script 游戏代码 10+ 最佳 JavaScript 游戏代码
NEXT
什么是 HTTP/3?