🌐
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, Rust의 Vec<u8>과 JS의 Uint8Array는 메모리 레이아웃이 다르다. wasm-bindgen이 이 변환을 자동 생성한다.
#[wasm_bindgen]
pub fn greet(name: &str) -> String {
format!("Hello, {name}!")
}
JS에서 greet("world")를 호출하면 문자열 변환이 자동으로 일어난다.
성능
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 타겟