🌐
Rust → WASM — ブラウザでRustを動かす
wasm-pack + wasm-bindgenでJSからRust関数を呼ぶ
Tooscut(ブラウザ映像エディタ)がなぜRust/WASMなのか前述した。ここでは実際にRustをWASMにコンパイルする方法を整理する。
基本フロー
wasm-pack build— Rustコードを.wasm+ JSバインディングにコンパイル- npm公開可能なパッケージが生成される
- 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ターゲット