WebAssembly
问题
Rust 如何编译为 WebAssembly?有哪些前端应用场景?
答案
Rust 是编译到 WebAssembly 的最佳语言之一——没有 GC 运行时、二进制小、性能接近原生。
关于 WebAssembly 的基础概念请参考 WebAssembly 基础。
wasm-pack 工作流
# 安装
cargo install wasm-pack
# 创建项目
cargo new --lib my-wasm
Cargo.toml
[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.2"
src/lib.rs
use wasm_bindgen::prelude::*;
// 导出给 JavaScript 调用
#[wasm_bindgen]
pub fn fibonacci(n: u32) -> u32 {
match n {
0 | 1 => n,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
// 调用 JavaScript 函数
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_namespace = console)]
fn log(s: &str);
}
#[wasm_bindgen]
pub fn greet(name: &str) {
log(&format!("Hello, {}!", name));
}
wasm-pack build --target web
index.js
import init, { fibonacci, greet } from './pkg/my_wasm.js';
await init();
console.log(fibonacci(40)); // 比 JS 快 10-50x
greet("World");
前端 Wasm 应用场景
| 场景 | 示例 | 性能提升 |
|---|---|---|
| 图片处理 | Photon(Rust Wasm) | 5-10x |
| 加密计算 | 哈希、签名 | 10-20x |
| 代码编辑器 | tree-sitter 语法高亮 | 显著提升 |
| PDF 渲染 | PDF.js + Wasm | 提升 |
| 游戏引擎 | Bevy (Wasm) | 接近原生 |
常见面试问题
Q1: Rust Wasm 适合前端的什么场景?
答案:
适合:CPU 密集型计算(算法、加密、编解码、图文处理) 不适合:DOM 操作(JS 更快,因为 Wasm→JS→DOM 有桥接开销)
经验法则:如果一个操作在 JS 中需要 > 16ms(影响帧率),考虑移到 Wasm。
Q2: Wasm 的体积怎么优化?
答案:
[profile.release]
opt-level = "z" # 优化体积
lto = true
strip = true
再用 wasm-opt -Oz 进一步压缩。典型的 Rust Wasm 模块:10-100KB(gzip 后)。