WebAssembly 組件模型深度解析(2026):WIT、WASI 0.3 與跨語言組合實戰
為什麼組件模型是 WASM 的「第二幕」
WASM 第一幕:瀏覽器跑 C++ 遊戲引擎。第二幕:組件模型——任意語言程式碼透過型別安全介面組合,零序列化開銷。2026 年 WASI 0.2 穩定、0.3 凍結中。
模組 vs 組件
| 模組 | 組件 | |
|---|---|---|
| 介面 | 扁平 import/export | WIT 強型別 |
| 型別 | 整數/浮點/指標 | String, Record, Variant, List, Resource |
| 記憶體 | 共享線性(不安全) | 隔離+自動序列化 |
| 跨語言 | 手寫膠水 | wit-bindgen 自動 |
| 組合性 | 無 | 連結為新組件 |
WIT:組件的 IDL
package math:operations@0.1.0;
interface calculator {
record complex-number { real: float64, imag: float64 }
variant division-result { ok(float64), err(string) }
divide: func(a: float64, b: float64) -> division-result;
exp: func(base: float64, exponent: float64) -> float64;
}
World:完整契約
world app {
import wasi:http/handler@0.2.0;
export calculator: interface { compute: func(input: string) -> string; };
}
WASI 0.2 / 0.3
| 版本 | 能力 | 狀態 |
|---|---|---|
| 0.1 | 檔案/環境/時鐘 | ⚠️ 過渡 |
| 0.2 | + HTTP、IO 串流、Socket | ✅ 穩定 |
| 0.3 | 統一能力模型、非同步 | 🔄 凍結中 |
wasi:http 讓組件如 Lambda 處理 HTTP:
impl Handler for MyHandler {
fn handle(&self, req: IncomingRequest) -> Result<OutgoingResponse> {
Ok(OutgoingResponse::new(200, "Hello from WASM"))
}
}
四語言工作流
Rust
wit_bindgen::generate!({ world: "calculator-world" });
struct CalcImpl;
impl Calculator for CalcImpl { fn add(&self, a, b) -> i32 { a + b } }
cargo component build --release
Go
type calcImpl struct{}
func (c *calcImpl) Add(a, b int32) int32 { return a + b }
Python
class Calculator(exports.Calculator):
def add(self, a, b): return a + b
componentize-py -d ./wit -w calculator-world componentize app -o calculator.wasm
JavaScript(宿主側)
const calc = await Calculator.instantiate();
console.log(calc.add(2, 3)); // 5
🔥 JS 呼叫 Rust
add()——WIT 自動序列化,零膠水、零 JSON 開銷。
組件組合
wasm-tools compose http-server.wasm -d math-core.wasm -o combined.wasm
對外單一組件,內部依賴全解決。
生產架構
插件 SaaS
SaaS 宿主
├─ 插件 A (Rust)
├─ 插件 B (Go)
└─ Wasmtime(能力+沙箱)
完全隔離。WASM 沙箱保證安全。
邊緣 Multi-Tenant
CDN 邊緣
├─ 租戶 A:Rust 圖片壓縮
├─ 租戶 B:Go A/B 路由
└─ wasi:http, wasi:keyvalue
遷移:模組→組件
wasm-tools component new old.wasm --adapt adapter.wasm -o new.wasm
vs Docker
| 維度 | WASM 組件 | Docker |
|---|---|---|
| 冷啟動 | < 1 ms | 100 ms–2 s |
| 記憶體 | KB–數 MB | 數十–數百 MB |
| 隔離 | 語言沙箱 | 核心級 |
| 跨平台 | ✅ 一次,到處 | ⚠️ 分別建 |
| 組合 | 編譯期連結 | 執行期網路 |
互補非替代。容器管長期服務;組件管輕量毫秒函數。
FAQ
Q1:全語言寫 WIT?——一份 WIT,各團隊自產生繫結。
Q2:vs gRPC?——gRPC 跨行程,需序列化。組件行程內,零序列化。同主機→組件,跨網路→gRPC。
Q3:僅 Rust?——Go/Python/JS/C 全生產可用。
Q4:0.2+0.1 共存?——短期可。新建議 0.2。
Q5:生產穩定?——2026: Wasmtime 19+ 完整支援。Shopify 等已用。
總結
不是新 API——是範式轉變。舊問:Python 怎麼叫 Rust?→ C FFI。新答:一份 WIT、兩邊 wit-bindgen、連結。
學習路徑:裝 cargo-component + wasmtime → 簡易 WIT → Rust 實現 → Python/JS 呼叫。
#WASM#组件模型#WIT#WASI#多语言#插件化