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

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

相关推荐
青年夏日科技工作者4 分钟前
虚幻浏览器插件 UE与JS通信
前端·javascript·html
雷神乐乐1 小时前
创建前端项目的方法
前端·javascript·vue.js
prince_zxill1 小时前
JavaScript面向对象编程:Prototype与Class的对比详解
前端·javascript·ecmascript·原型模式
D.eL1 小时前
Vue 2 项目中 Mock.js 的完整集成与使用教程
前端·javascript·vue.js
brzhang2 小时前
墙裂推荐一个在 Apple Silicon 上创建和管理虚拟机的轻量级开源工具:lume
前端·后端
Along丶WG2 小时前
解决国内服务器 npm install 卡住的问题
前端·npm·node.js
prince_zxill3 小时前
Node.js 和 npm 安装教程
前端·javascript·vue.js·npm·node.js
弄不死的强仔3 小时前
可被electron等调用的Qt截图-录屏工具【源码开放】
前端·javascript·qt·electron·贴图·qt5
霸王蟹4 小时前
el-table组件样式如何二次修改?
前端·javascript·vue.js·笔记·学习·前端框架
美味小鱼4 小时前
Rust 所有权特性详解
开发语言·后端·rust