🌐

Rust → WASM — ブラウザでRustを動かす

wasm-pack + wasm-bindgenでJSからRust関数を呼ぶ

Tooscut(ブラウザ映像エディタ)がなぜRust/WASMなのか前述した。ここでは実際にRustをWASMにコンパイルする方法を整理する。

基本フロー

  1. wasm-pack build — Rustコードを.wasm + JSバインディングにコンパイル
  2. npm公開可能なパッケージが生成される
  3. JSからimport { my_function } from './pkg'で呼び出し

wasm-bindgen

RustのStringとJSのstringはメモリレイアウトが異なる。wasm-bindgenがこの変換を自動生成。

#[wasm_bindgen]
pub fn greet(name: &str) -> String {
    format!("Hello, {name}!")
}

性能

WASMはネイティブの90〜95%性能。CPU集約作業(画像処理、暗号化、パース)でJS比5〜50倍速い。DOM操作はJSが適切 — WASMからのDOM API呼び出しはオーバーヘッドが大きい。

キーポイント

1

rustup target add wasm32-unknown-unknown

2

cargo install wasm-pack

3

#[wasm_bindgen]でJSに公開する関数をマーキング

4

wasm-pack build --target webでビルド

5

JSからimport→呼び出し(npmパッケージのように使用)

メリット

  • JS比でCPU集約作業5〜50倍高速
  • Rustのメモリ安全性がブラウザでも維持

デメリット

  • DOM操作はJSが適切 — WASM↔JS呼び出しオーバーヘッド
  • .wasmバイナリサイズが大きくなる場合あり(wasm-optで最適化必要)

ユースケース

ブラウザ映像編集(Tooscut)— GPU合成エンジンをWASMで ブラウザゲーム — BevyエンジンのWASMターゲット