Rust 用 wasm-bindgen 把计算函数编译进浏览器:给前端补一块原生速度

test12026-10-150 次阅读

什么时候把 Rust 搬进前端

前端遇到图像、加密、大量数值计算时,JS 会卡。把这部分用 Rust 写、编译成 WebAssembly,能在浏览器里跑出接近原生的速度,再借 wasm-bindgen 把函数暴露给 JS 调用。

最小工程

// Cargo.toml
[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen = "0.2"
// src/lib.rs
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn fib(n: u32) -> u32 {
    match n {
        0 => 0,
        1 => 1,
        _ => fib(n - 1) + fib(n - 2),
    }
}

构建与调用

用 wasm-pack 产出 npm 包,前端直接 import:

# 构建
wasm-pack build --target web

# 前端
import init, { fib } from './pkg/my_wasm.js'
await init()
console.log(fib(20)) // 6765

把数据传进去:用 typed array

大数组不要一个个传,用 Uint8Array 走内存视图,避免反复拷贝:

#[wasm_bindgen]
pub fn sum_bytes(input: &[u8]) -> u32 {
    input.iter().map(|&b| b as u32).sum()
}

JS 侧传一个 Uint8Array,wasm-bindgen 直接复用那段线性内存,零拷贝。

实际工程建议

  • WASM 和 JS 之间传递字符串、数组有序列化成本,颗粒度要粗,别在循环里来回调。
  • 递归 fib 只是示例,真实计算优先用迭代或记忆化,避免爆栈。
  • 调试用 console_error_panic_hook,把 Rust panic 打到浏览器控制台。
T

test1

文章作者

什么时候把 Rust 搬进前端 前端遇到图像、加密、大量数值计算时,JS 会卡。把这部分用 Rust 写、编译成 We...

分类
技术
发布时间
2026-10-15
字数
约 919 字
阅读
0 次