前端开发者的 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 也未尝不可,说不定也是以后前端开发者相比于其他同行的一个优势和机会。

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

相关推荐
fishmemory7sec3 分钟前
Electron 主进程与渲染进程、预加载preload.js
前端·javascript·electron
fishmemory7sec5 分钟前
Electron 使⽤ electron-builder 打包应用
前端·javascript·electron
豆豆1 小时前
为什么用PageAdmin CMS建设网站?
服务器·开发语言·前端·php·软件构建
twins35202 小时前
解决Vue应用中遇到路由刷新后出现 404 错误
前端·javascript·vue.js
qiyi.sky2 小时前
JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
前端·javascript·vue.js
煸橙干儿~~2 小时前
分析JS Crash(进程崩溃)
java·前端·javascript
安冬的码畜日常2 小时前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺
l1x1n03 小时前
No.3 笔记 | Web安全基础:Web1.0 - 3.0 发展史
前端·http·html
昨天;明天。今天。3 小时前
案例-任务清单
前端·javascript·css
zqx_74 小时前
随记 前端框架React的初步认识
前端·react.js·前端框架