# Wasm Bindings

> wasm-bindgen conventions for compiling a Rust core to WebAssembly for JavaScript: wasm-pack packaging, JsValue mapping, async futures, bundle-size tuning, web-sys/js-sys, and TypeScript defs. Load when generating or reviewing WebAssembly/JS bindings for a Rust library.

- Skill: `goldziher/wasm-bindings` (Agent Skill)
- Install (CLI): `npx skillmds@latest add goldziher/wasm-bindings`
- Raw SKILL.md: https://api.skillmd.com/api/skills/goldziher/wasm-bindings/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: goldziher (https://skillmd.com/u/goldziher)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/goldziher/wasm-bindings

---


- Use `wasm-bindgen` for JavaScript interop. Use `wasm-pack` for building and packaging.
- Map Rust types to JS with `#[wasm_bindgen]`. Use `JsValue` for dynamic types, typed wrappers for known types.
- Handle errors with `Result<T, JsValue>`. Convert Rust errors to descriptive JS error messages.
- Support both browser (ES modules) and Node.js (CommonJS/ESM) targets.
- Async: use `wasm-bindgen-futures` for Promise-returning functions. Never block the main thread.
- Bundle size: use `opt-level = "z"`, `lto = true`, `codegen-units = 1` in release profile.
- Use `web-sys` and `js-sys` for Web API access. Feature-gate platform-specific APIs.
- Test with `wasm-pack test --headless --firefox` and a JS test runner (e.g., Vitest or Jest) for JS integration tests.
- Generate TypeScript definitions automatically. Keep `.d.ts` files in sync with Rust exports.
- Anti-patterns: no `std::thread` (single-threaded), no synchronous I/O, no panics (becomes JS exception).

