Bazel rules for WebAssembly Component Model
Production-ready Bazel rules for building WebAssembly components across multiple languages with native WASI 0.2 support.
Note
Part of the PulseEngine toolchain. Used across all PulseEngine projects for hermetic component builds.
- Multi-language: Build components from Rust, Go (TinyGo), C++, JavaScript/TypeScript
- Production Ready: OCI publishing, cryptographic signing, WAC composition, AOT compilation
- Bazel Native: Hermetic builds, aggressive caching, cross-platform (Windows/macOS/Linux)
- Zero Shell Scripts: Pure Bazel implementation for maximum portability
Add to your MODULE.bazel:
bazel_dep(name = "rules_wasm_component", version = "1.0.0")
load("@rules_wasm_component//rust:defs.bzl", "rust_wasm_component") rust_wasm_component( name = "my_service", srcs = ["src/lib.rs"], wit = ":service_wit", profiles = ["debug", "release"], )
load("@rules_wasm_component//go:defs.bzl", "go_wasm_component") go_wasm_component( name = "calculator", srcs = ["main.go"], wit = ":calculator_wit", world = "calculator", )
load("@rules_wasm_component//cpp:defs.bzl", "cpp_component") cpp_component( name = "calculator", srcs = ["calculator.cpp"], wit = ":calculator_wit", cxx_std = "c++20", )
load("@rules_wasm_component//wac:defs.bzl", "wac_compose") wac_compose( name = "full_system", components = { ":frontend": "app:frontend", ":backend": "app:backend", }, composition = ''' let frontend = new app:frontend { ... }; let backend = new app:backend { ... }; connect frontend.request -> backend.handler; export frontend as main; ''', )
- Rust (1.90.0+): Multi-profile builds, Clippy integration, Wizer pre-initialization
- Go (TinyGo 0.39.0): Native WASI 0.2, hermetic Go module resolution
- C++ (WASI SDK 27): C++17/20/23, cross-package headers, LTO optimization
- JavaScript/TypeScript (jco 1.4.0, Node.js 20.18.0): NPM dependencies, componentize-js
- WAC Composition: Official WebAssembly Composition standard for multi-component systems
- OCI Publishing: Push components to Docker/OCI registries
- Cryptographic Signing: wasmsign2 integration for supply chain security
- AOT Compilation: Wasmtime precompilation for 87% size reduction and faster startup
- Wizer Pre-initialization: 1.35-6x startup improvement for Rust components
- Multi-Profile Builds: Debug, release, and custom optimization profiles
- Hermetic Toolchains: All tools downloaded automatically, no system dependencies
- Cross-Platform: Native Windows/macOS/Linux support without WSL
- Comprehensive Examples: 20+ working examples from basic to advanced patterns
See MODULE.bazel for current versions — the single source of truth.
All toolchains are hermetically downloaded and version-pinned for reproducible builds.
Complete Rule Reference — All rules, attributes, and providers
Guides:
Examples:
- WIT-enabled Go components currently fail due to upstream TinyGo limitations
- Tracking: Issue #82
- Basic Go components (without WIT) work perfectly
- WASI disables C++ exceptions by default for size/performance
- Use
enable_exceptions = Truefor components that require exceptions (Issue #83)
Contributions welcome! See CONTRIBUTING.md for details.
Apache-2.0 — see LICENSE.
Part of the PulseEngine toolchain.