

Wasm Component Model: Modular hóa WebAssembly cho mọi môi trường
Wasm Component Model là chuẩn mới cho phép tách thành phần WebAssembly làm việc độc lập trên nhiều môi trường – từ cloud edge đến embedded devices. Bài viết khám phá cách chuẩn này giải quyết vấn đề “write once, run anywhere” thực sự cho WebAssembly.
Vấn đề mà Wasm Component Model giải quyết
WebAssembly ban đầu tập trung vào trình duyệt, dẫn đến rào cản khi dùng ngoài môi trường web. Mỗi runtime (Wasmtime, Wasmer, V8) có API riêng, khiến việc di chuyển module giữa các platform phức tạp.
Ví dụ: bạn viết module Rust compile thành Wasm để chạy trong V8. Khi cần chuyển sang Wasmtime serverless, phải viết lại binding thủ công. Component Model loại bỏ khoảng cách này bằng interface chuẩn hóa.
Thêm vào đó, WASI (WebAssembly System Interface) mới chỉ giải quyết phần I/O, không quy định cách component giao tiếp với nhau. Component Model bổ sung tầng trên cùng WASI – tương tự nhưng cao hơn – giải quyết orchestration giữa các module.

Cách hoạt động của Component Model
Component Model giới thiệu khái niệm “component” – đơn vị đóng gói có interface rõ ràng định nghĩa qua WIT (WebAssembly Interface Types). Các component có thể liên kết với nhau như lego, bất kể ngôn ngữ nguồn là gì.
WIT (WebAssembly Interface Types)
WIT định nghĩa kiểu dữ liệu (string, list, record, variant) mà component expose hoặc require. Không giống WebAssembly type đoạn, WIT là high-level type có thể map tự động sang Rust struct, TypeScript class, hoặc Go interface.
File WIT mô tả contract giữa hai component:
// example.wit
package my-app:component;
interface database {
record row { name: string, value: u32 }
query: func(sql: string) -> list
}
world app {
import database;
export logger: func(msg: string)
}
Composition runtime
Runtime kiểm tra compatibility giữa import/export interface trước khi link component. Nếu version không match, runtime báo error sớm thay vì crash lúc runtime.
Capability-based security
Component chạy với quyền hạn được khai báo rõ, giống WASI. Runtime kiểm tra capability trước khi cho phép component gọi function khác. Nếu component yêu cầu filesystem access nhưng manifest chỉ cho phép network, runtime sẽ reject.
- Interface-based: Định nghĩa rõ ràng input/output qua WIT
- Language-agnostic: Có thể viết bằng Rust, C++, Go và kết hợp cùng nhau
- Secure by default: Capability-based security model
- Versioned: Runtime kiểm tra semantic version compatibility trước link

So sánh với module system khác
Component Model khác với NPM modules hay Docker image ở điểm quan trọng: component được isolate bởi hardware-level sandbox. Không có file system implicit access, không có network implicit, chỉ có capability được cấp rõ.
Docker container chia sẻ kernel với host, vẫn có attack surface lớn. Component Model chạy trong VM hoặc microkernel runtime nhẹ, tăng cường security.
NPM modules chứa arbitrary code – có thể thay đổi hành vi sau khi publish. Component Model chuyển đổi thành WebAssembly bytecode chạy trong sandbox, không thể escape. Đây là lợi thế lớn cho plugin security.
| Module system | Security | Cross-language | Cold start |
|---|---|---|---|
| NPM | Chạy native JS, full OS access | JS only | ~100ms |
| Docker | Process-level isolation | Any (OS) | ~1-5s |
| Wasm Component | Hardware sandbox | Any (compile) | <1ms |
Ứng dụng thực tế
Component Model đang được áp dụng trong:
- Serverless functions (Fermyon Spin, Cloudflare Workers) – các function gọi nhau qua standard interface
- Plugin systems (Envoy, Apache APISIX) – plugin developer viết bằng ngôn ngữ bất kỳ, host app load bình thường
- Embedded IoT devices – module WASM cắm được giữa các sensor và gateway
- Cross-platform CLI tools – single binary chứa nhiều component
Bắt đầu với Wasm Component Model
Các công cụ hiện tại hỗ trợ:
- wit-bindgen: Tạo binding cho nhiều ngôn ngữ
- Wasmtime: Runtime đầy đủ tính năng
- WASI: Hệ thống giao diện chuẩn
Ví dụ đơn giản khởi tạo component với Rust:
# Cargo.toml
[dependencies]
component-bindgen = { git = "https://github.com/bytecodealliance/wit-bindgen" }
wit-parser = "0.18.0"
Thách thức vẫn còn về ecosystem maturity và debugging toolchain. Component Model cần tương thích ngược với module module non-component – nhiều ecosystem đang transition chậm. Dự báo 2025-2026 sẽ là giai đoạn Component Model chạy trưởng thành trong production workloads.
Kết luận và dự báo
Component Model là bước tiến quan trọng giúp WebAssembly thoát khỏi trình duyệt. Không chỉ là module system, nó là language-agnostic IPC mechanism chạy ở gần-native speed.
Đối thủ trực tiếp là gRPC và Protobuf, nhưng Component Model không cần code generation phức tạp, không cần server stub, và có native sandbox security. Tốc độ cold start <1ms, dùng memory ~100KB trái ngược với process-based container thường dùng 50MB+.
Hạn chế hiện tại: toolchain unstable, debugging phức tạp, ecosystem adoption chậm. Nếu bạn đang start project mới và quan tâm đến cross-language modular, Component Model xứng đáng thử nghiệm ngay bây giờ.
Nguồn tham khảo: WebAssembly Component Model Official, Wasmtime Component Model Docs
