WASM 标准化路线图GC、组件模型和 WASI 的成熟时间表解读保持学习保持输出。WASM 的标准化在加速推进我在 GitHub 上跟踪了好几个提案仓库整理了一份可执行的路线图。但 WASM 的标准化进程很复杂。GC 提案、组件模型Component Model、WASIWebAssembly System Interface这三个方向各自推进经常让人搞不清楚现在到底能不能用。我用了一个周末把各提案的 Phase 状态梳理了一下整理出下面的时间线。一、WASM 标准化提案全景图WASM 的标准化有一个严格的五阶段流程Phase 0 → Phase 5。我先用一个总览图展示关键提案的当前状态几个关键节点值得画个重点GC、组件模型和 WASI 的状态应以各自官方仓库为准。它们的提案阶段、浏览器/运行时支持和工具链成熟度并不总是同步。WASI Preview 2 已在官方仓库标注为 stable。采用前仍需核对目标运行时对所需接口的支持而不是只依据 Preview 名称判断。组件模型适合用于评估跨语言接口与封装边界。是否能投入生产还取决于运行时、绑定生成工具和依赖分发的具体组合。二、GC 提案WASM 终于像一门正经语言了GC垃圾回收提案对 WASM 的意义不只是加了一个垃圾回收器这么简单。它改变了 WASM 能支持的语言范围。GC 能减轻部分依赖垃圾回收语言在 WASM 目标上的运行时负担但实际包体变化取决于编译器、应用代码和目标运行时应使用项目构建产物测试而不应预设固定比例。但对 Rust 开发者来说GC 的直接影响比较小——Rust 靠所有权系统做内存管理不需要 GC。反而是 GC 的结构体类型系统对 Rust 和 WASM 的互操作有间接好处// GC 提案引入了新的 wasm 类型struct、array、i31ref // 这让 WASM 层面的类型更丰富也方便了跨语言交互 // 例如Rust 传给 JS 的结构体现在不再必须序列化为字节数组 #[wasm_bindgen] pub struct User { pub name: String, pub age: u32, } #[wasm_bindgen] impl User { pub fn greet(self) - String { // GC 标准化后JS 端可以直接持有 User 的引用 // 不需要手动管理生命周期 format!(你好我是 {}今年 {} 岁, self.name, self.age) } }三、组件模型WASM 生态的npm如果说 GC 是语言层面的增强组件模型就是生态层面的革命。它的定位可以简单理解为WASM 世界的软件包管理器 ABI 标准。组件模型的核心价值是跨语言组合。一个 Rust 写的 HTTP 路由器可以调用一个 Python 写的数据分析组件再调用一个 C 写的加密库——所有这些都编译为 WASM 组件通过标准接口通信。// 用 WIT 定义一个组件接口 // 文件: user-service.wit // // interface user-service { // record user { // name: string, // age: u32, // } // // get-user: func(id: string) - optionuser; // } // Rust 实现这个接口 use bindings::user_service::{User, get_user}; struct UserServiceImpl; impl UserServiceImpl { fn get_user(self, id: String) - OptionUser { // 实际的用户查询逻辑 if id 001 { Some(User { name: 张三.to_string(), age: 23, }) } else { None } } } // 这个 Rust 组件可以被任何支持 WASM 组件的语言调用 // Python: user wasm_component.get_user(001) // JS: const user await component.getUser(001) // Go: user, err : component.GetUser(001)这对选手的利好很明显你不需要学会所有语言才能做全栈。你可以用 Rust 写核心逻辑因为你喜欢它的安全性和性能然后通过组件模型暴露给用其他语言写的上层应用。语言选型从绑定变为选择最合适的那个。但组件模型的推进也是最慢的。它不是标准定好了大家实现就行而是需要运行时支持wasmtime, wasmcloud工具链支持cargo component,wit-bindgen注册表基础设施类似 npm registry社区接受度这可能是最难的部分四、WASI 的发展从文件系统访问到完整操作系统抽象WASI 是 WebAssembly 脱离浏览器、走向服务器端/边缘计算的关键基础设施WASI Preview 2 是这个路线图中的一个关键里程碑。它在 Preview 1 的基础上补了几个大坑支持异步 I/O通过wasi:io/poll接口标准化了HTTP支持wasi:http——不需要每个语言自己实现 HTTP 客户端了引入了组件模型作为接口定义标准参考资料WebAssembly GC ProposalWebAssembly Component ModelWebAssembly System Interface (WASI)// 使用 WASI Preview 2 的 HTTP 接口通过 wit-bindgen 生成绑定 // 这个代码运行在 WASM 沙箱中直接使用 WASI 提供的 HTTP 能力 use wasi::http::outgoing_handler; use wasi::http::types::{self, Method, Scheme}; fn make_request(url: str) - ResultVecu8, Boxdyn std::error::Error { // 解析请求目标 URL let headers types::new_fields([ (User-Agent.to_string(), WASI-HTTP/0.1.as_bytes().to_vec()), (Accept.to_string(), application/json.as_bytes().to_vec()), ]); let request types::new_outgoing_request( Method::Get, None, // 不指定路径参数 Some(Scheme::Https), // HTTPS 协议 api.github.com.to_string(), // 目标主机 Some(/users/octocat.to_string()), // URL 路径 Some(headers), )?; // 发送 HTTP 请求通过 WASI 提供的系统级支持 let response outgoing_handler::handle(request, None)?; // 读取响应体 let body response.body(); let mut buffer Vec::new(); // 从 WASI 流中读取数据 body.read_to_end(mut buffer)?; Ok(buffer) }以前要在 WASM 里发 HTTP 请求需要把 JavaScript 的fetch包装成wasm-bindgen的导出函数。WASI 把这个能力原生化了——不需要 JavaScript 中间层。这对 Serverless/边缘计算平台如 Cloudflare Workers、Fastly ComputeEdge来说是重大利好。五、总结梳理完 WASM 标准化的路线图我有几点核心判断GC 提案标准化是多语言 WASM的起点。之前只有 Rust/C/C 能高效产出 WASM现在 Java/Kotlin/Dart 都加入了。WASM 不再是系统语言的专属编译目标。组件模型是生态成型的关键变量。如果它能像 npm 之于 Node.js 那样建立生态WASM 就能从编译目标变成完整的软件分发平台。但这个目标至少需要 2-3 年才能在生产中广泛使用。WASI Preview 2 是服务器端 WASM 的里程碑。异步 I/O 原生 HTTP 让 WASM 在 Serverless 场景下不再受限于 JavaScript 桥接的性能开销。对选手来说现在学 WASM 不算早。虽然很多提案还没完全稳定但 Rust → WASM → 浏览器/Serverless 这条技术链已经在生产环境中运行Cloudflare Workers 每天处理亿万级请求。现在入局一两年后提案稳定时你已经是有经验的开发者了。保持学习保持输出。WASM 是我的长期研究方向之一下周计划写一个 Rust 组件模型的实际案例看看它到底好不好用。