环境安装
如果你是 Windows,恭喜你,等待被环境折腾吧(当然如果你Visual Studio 安装得比较全:主要指 VC++ BuildTool,那环境问题就要好不少了)。Windows用户可以考虑搭配 Windows Subsystem for Linux(安装文档:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10)。
首先必须是先安装好 Rust 环境,详见:《Hello,Rust》。
之后是安装 wasm-pack,详见:https://rustwasm.github.io/wasm-pack/installer/。
安装指令为:
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
安装好后,会出现类似如下提示:
起步
先创建出项目
cargo new rust-wasm
在项目中的 cargo.toml 中录入:
[lib]crate-type = ["cdylib", "rlib"][dependencies]wasm-bindgen = "0.2.63"wee_alloc = { version = "0.4.5", optional = true }[profile.release]# Tell `rustc` to optimize for small code size.opt-level = "s"
将 src/main.rs 修改为 src/lib.rs 并录入内容:
use wasm_bindgen::prelude::*;// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global// allocator.#[cfg(feature = "wee_alloc")]#[global_allocator]static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;// 绑定 JS 方法#[wasm_bindgen]extern "C" {#[wasm_bindgen(js_namespace = console)]fn log(s: &str);fn alert(s: &str);}// 导出函数(可被 JS 调用)#[wasm_bindgen]pub fn print(s: &str) {log(s);}#[wasm_bindgen]pub fn wasm_alert(s: &str) {alert(s);}
接下来,执行 wasm-pack build 来构建 wasm 产物:
最后借助 webpack 编译 wasm 的能力实现互调用。
前端项目请参见:https://github.com/hstarorg/learning-rust/tree/master/rust-wasm/webroot,其中使用了 webpack5
性能差异
不涉及更细致的对比,仅仅通过计算“斐波拉切数列”(此处未作尾调用优化,优化后则不是耗时运算了)做了一个基本的测试,其结果如下:
| 数列 | JavaScript | Rust WebAssembly | 性能比值 | 截图 |
|---|---|---|---|---|
| 1 | ≈0.0042 | ≈0.0073 | ≈0.6 | ![]() |
| 10 | ≈0.0140 | ≈0.0068 | ≈2.1 | ![]() |
| 35 | ≈1676ms | ≈40ms | ≈41.9 | ![]() |
| 40 | ≈19068ms | ≈412ms | ≈46.3 | ![]() |
结果也符合常规的预期,在非计算密集时,由于 WebAssembly 额外的成本是有一定的性能下降的。之后随着计算量的增大,WebAssembly 的性能对比 JavaScript 则有数据级的提升(10倍+)




