前端开发者的 Rust 尝鲜之路

本文并不是劝大家学 rust,只是最近它实在有点火🔥,特别是前端基建中 rust 的大量应用,还有 vivo 用 rust 写了自家蓝河操作系统,这代表着以后 rust 说不定是前端的又一条路,所以特地来看看 rust 到底是个怎样的存在,同时分享一下自己的体验感受。

1. 使用 rustup 安装 rust

1.1 Linux or MacOS 安装 rustup

bash 复制代码
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

以上命令通过下载运行远程的 shell 脚本一键安装 rustup 工具,rustup 是 rust 的工具链管理工具,作为前端的或 node.js 工程师,可以把它类比为 nvm,但它又不是单纯的管理 rust 的版本,而是 rust 一系列工具链。

运行命令可以看到该脚本会提示我们即将安装 rust 的官方编译工具 rustc 以及它的包管理器 Cargo(例如 nodejs 的包管理工具 npm, Cargo 是 rust 的包管理工具), 将会在根目录下创建一些目录:

  • ~/.rustup:rustup 的元数据以及工具链会安装到这里,RUST_HOME 环境变量也会指向这里
  • ~/.cargoCargo 的根目录,CARGO_HOME 环境变量会指向这里
  • ~/.cargo/bincargorustcrustup 以及一些其他命令工具都会安装在这里

在输入上述命令后,还需要选择如何安装,直接选择 1 回车即可,后续过程会将会下载 以下组件:

  • cargo:rust 包管理器
  • clippyrustfmt:类似 eslint 这样的工具 cargo fmt 与 cargo clippy 用于帮助开发者统一代码风格
    • 其中 clippy 是静态代码分析工具,包含了一系列 lint 规则,比较类似 eslint,用于检查代码错误
    • rustfmt 是个代码格式化工具,可以自动格式化代码,来遵循 rust 社区的代码风格规范,比较类似 prettier
  • rust-doc:为 rust 项目生成文档
  • rust-std:rust 标准库
  • rustc:rust 的编译器

1.2 重新载入 shell 终端配置

安装完之后需要重新载入配置,安提示运行

shell 复制代码
source $HOME/.cargo/env

此时输入 rustccargo 等命令就可以识别了,通过 rustc --version 可以查看 rust 编译器版本,输出结构为 rustc 版本号 (commit hash 日期)

2. rust 更新与卸载

检查更新:rsutup check 可以检查当前 rustup 以及工具链的更新情况

更新:rustup update 可以更新 rustup 以及工具链到最新版本

卸载:rustup self uninstall 卸载 rustup 以及 rust

3. 你的第一个 rust 程序

3.1 通过 cargo 快速创建 rust 项目

运行 cargo new project 可以快速创建一个干净的 rust 项目

shell 复制代码
cargo new hello-rust

可以看到,创建的 rust 项目只有一个 src 文件夹,其中有个 rust 入口文件,并且帮我们生成了 Hello World 模板。

3.2 编译和运行 rust 程序

执行 cargo run 即可编译当前 rust 程序,并且自动运行它,编译结束后,在项目中会生成一个 target 文件,这就是编译后的内容,其中我们可以看到在 Running 时候,运行的是 target/debug/hello-rust,这个文件就是 rust 程序编译后生成的二进制文件,通过再次执行 target/debug/hello-rust,可以看到再次运行输出。

cargo run 其实会先执行:cargo build 编译程序,然后再运行编译好的二进制文件,如果你只想编译不想运行,可以只运行 cargo build

3.3 rust 的项目配置与依赖安装

相对于 node.js 的项目配置在 package.json 中,rust 的项目配置文件则为 Cargo.toml,打开对应的文件,可以看到以下内容,了解 package.json 的同学,对他也有种熟悉感。

toml 复制代码
[package]
name = "hello-rust"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

在 node.js 中我们使用 npm 安装依赖,在 rust 中,则使用 cargo 安装,与 https://www.npmjs.com/ 相对应,查找 rust 依赖的地址为 https://crates.io/,rust 中的项目包被称为 crate

随便找一个仓库 rand 点进去,可以看到相关文档,根据文档中 cargo add rand,我们来安装一下 rand,体验一下 rust 中的依赖安装

运行命令之后,可以看到 Cargo.toml 中内容变为了这样:

toml 复制代码
[package]
name = "hello-rust"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rand = "0.8.5"

在 rust 中还存在一个 Cargo.lock 文件,其作用于 package-lock.json 作用一致,用来锁定项目依赖版本。

我们再来按文档使用一下 rand 库吧

rust 复制代码
// 使用 rand 库中的 random
use rand::random;

fn main() {
    println!("Hello, world!");
  	// 通过 random() 生成一个随机数并打印
    let x: u8 = random();
    println!("random num: {}", x)
}

然后再运行 cargo run 即可编译并运行代码

3.4 rust 代码体验感受

首先要说的是,Rust 是一种系统级编程语言,它的设计目标之一是零成本抽象和无运行时开销,意味着 Rust 代码可以在没有任何额外运行时支持的情况下直接编译成机器码,并且不需要依赖运行时环境来执行,不过这也造成了它略微有点长的编译时间,这让我回想起了 c 语言。相比于 node.js、python、go、java 等,rust 更接近底层,它不借助运行时、虚拟机,是有机会替换 c 语言的存在,所以最近看到 vivo 的蓝河,直接就是用 rust 写的操作系统。

对于 rust 与 c 以及其他编程语言的对比,这里不说太多,作为一个前端开发者,习惯了 node.js 带来的方便后,有时候内心真的是有点排斥别的语言,不是因为他们不好,而是有很多限制,比如 java 创建一个应用,jdk 配置半天,可能还会死在这一步,创建的应用光是包的结构就来好几层,看着真的不舒服;切换到 python 虽然好了很多,但稍不注意,pip 各种安装的全局包,有时候把自己搞得挺乱,虽然有虚拟环境之后好了很多,但它的切换还是有点麻烦。

在体验了 rust 之后,感觉就跟 node.js 的流程非常像了,首先安装简单,其次概念相近(不是严谨的对比):

rust node.js
rustup nvm
cargo npm
Cargo.toml package.json
Cargo.lock package-lock.json
https://crates.io/ https://www.npmjs.com/
clippy eslint
cargofmt prettier
rustc rust-sdt node

除此之外就是项目简洁,也不那么挑IDE,直接一个 src 里面就是 rust 代码,与 node 也很相似。在 rust 程序的编译运行过程中,也让我回想到学习 c 语言的时候,他们的过程非常相似,但相比于 c,rust 的流程又更加简洁。单从下载 rust 到编译 hello world 程序,安装依赖,就有种非常熟悉的感觉。

3.5 几个常见的 rust 的 vscode 插件

  • Rust Extention Pack:这不是一个有着自己功能的插件,而是包含了三个常用插件的插件包:
    • rust-analyzer: 可以替换官方的 rust vscode 插件,对预览进行实时分析、提示
    • crates:通过 Cargo.toml (类似 nodejs 项目中的 package.json)分析当前项目的依赖是否是最新版本
    • Even Better TOML:rust 的项目配置文件使用的是 toml,这个插件是针对 toml 文件的,可以实现 toml 文件的语法高亮与错误提示
  • Rust-Syntax:rust 代码高亮

4. 小结

到这里我们的 rust 体验就结束了,本文主要从 rust 的安装到第一个 rust 程序,将其与 node 生态相对比,发现两者在管理项目上是基本相同的,也没有什么乱七八糟的结构、编译器,从安装到使用的过程都很丝滑。在前端大量基建使用 rust 来构建提效的背景下,一些前端基建相关的同学去学习 rust 也变得不是那么奇怪了,在之前,个人感觉前端没啥必要学习 rust,不过在 vivo 采用了 rust 构建自家蓝河操作系统的情况下,前端开发者在有空余的时间看看 rust 也未尝不可,说不定也是以后前端开发者相比于其他同行的一个优势和机会。

个人对它还是有点兴趣,如果有时间,后面的深入学习也会不定时进行分享。

相关推荐
欢脱的小猴子16 分钟前
VUE3加载cesium,导入czml的星座后页面卡死BUG 修复
前端·vue.js·bug
高级测试工程师欧阳18 分钟前
CSS 基础概念
前端·css·css3
前端小巷子18 分钟前
JS 实现图片瀑布流布局
前端·javascript·面试
Juchecar25 分钟前
AI教你常识之 npm / pnpm / package.json
前端
薛定谔的猫232 分钟前
前端工程化系列(一):编码规范相关
前端·代码规范·前端工程化
ZKshun35 分钟前
[ 前端性能优化 - 图片压缩 ] WebP格式的的图片性能到底有多优秀?
前端
杜蒙39 分钟前
React Hooks 详解
前端·javascript
南囝coding39 分钟前
Claude Code 从入门到精通:最全配置指南和工具推荐
前端·后端
索马里亚纳海参炒贩40 分钟前
useCallback useMemo memo 三个区别和作用
前端·react native
非ban必选1 小时前
netty-scoket.io路径配置
java·服务器·前端