WebAssembly 2023:现状、应用与未来前景
前言
2017 年 WebAssembly(简称 Wasm)首次出现在浏览器中,彼时的口号是"让 C/C++/Rust 代码跑在浏览器里"。六年过去,Wasm 早已跨越浏览器的边界,成为服务端、边缘计算、插件系统、IoT 等多个领域的通用运行时。2023 年是 Wasm 生态快速成熟的一年,本文将带你全面了解其现状与前景。
WebAssembly 的核心优势
要理解 Wasm 为何能走出浏览器,先看它的几个天生优势:
| 特性 | 说明 |
|---|---|
| 沙箱安全 | 模块运行在隔离的沙箱中,无权限访问宿主系统 |
| 可移植 | 一次编译,任何支持 Wasm 的环境都能运行 |
| 高性能 | 接近原生的执行速度,启动时间仅微秒级 |
| 体积小 | 模块二进制格式紧凑,传输和加载极快 |
| 多语言 | Rust、C/C++、Go、Zig、AssemblyScript 等均可编译到 Wasm |
Wasm 本质上是一个低级的二进制指令格式,相当于一个虚拟 CPU 的机器码。任何能编译到它的语言,都能在统一的运行时中执行。
2023 年 Wasm 在浏览器端
1. 性能大幅提升
各大浏览器全面支持 Wasm 已不是新闻。2023 年,Wasm-GC(垃圾回收)提案进入 Stage 3,意味着 Java、Kotlin、Dart 等带 GC 的语言也能高效编译到 Wasm。这为 Flutter Web 等框架带来了显著的性能提升。
2. 大型 3A 应用迁移到 Web
Unity 和 Unreal Engine 的 Web 导出已全面转向 Wasm。2023 年可以看到更多大型游戏和设计工具在浏览器中运行,例如:
- Figma 的 WebAssembly 内核持续优化
- Photoshop Web 的 beta 版使用 Wasm 实现核心图像处理
- Google Earth 的 Web 版依赖 Wasm 进行 3D 渲染
2023 年 Wasm 在服务端
这是 Wasm 2023 年最大的增长点。
Serverless 函数计算
Wasm 天然适合 Serverless 场景:冷启动微秒级 vs 容器的数百毫秒。2023 年多个 Serverless 平台原生支持 Wasm:
# Fermyon Spin 快速启动一个 Wasm 函数服务
spin new my-app
cd my-app
spin build
spin deployuse spin_sdk::http::{Request, Response};
use anyhow::Result;
#[spin_component]
fn handle_request(req: Request) -> Result<Response> {
Ok(http::Response::builder()
.status(200)
.header("content-type", "text/plain")
.body(Some("Hello from Wasm!".into()))?)
}相比容器,Wasm 在 Serverless 场景的优势是:启动时间快 100-1000 倍、内存占用低 10-100 倍。
插件与扩展系统
2023 年,越来越多的应用使用 Wasm 作为插件运行时:
- Envoy / Istio:使用 Wasm 实现可编程的代理 Filter
- Apache APISIX:支持 Wasm 插件热加载
- Extism:通用的 Wasm 插件框架,支持 Go、Rust、JS 等作为宿主语言
// Go 程序中加载 Wasm 插件
import "github.com/extism/go-sdk"
func main() {
ctx := context.Background()
manifest := extism.Manifest{
Wasm: []extism.WasmSource{extism.WasmFile("plugin.wasm")},
}
plugin, err := extism.NewPlugin(ctx, manifest, extism.PluginConfig{}, nil)
if err != nil {
log.Fatal(err)
}
output, err := plugin.Call("process", input)
fmt.Println(string(output))
}数据库中的 Wasm
- SQLite WASM:官方推出的浏览器版 SQLite
- SingleStore:支持用 Wasm 编写自定义数据库函数
- CockroachDB:用 Wasm 实现用户自定义聚合函数
边缘计算与 CDN
2023 年,Cloudflare Workers、Fastly Compute@Edge、Deno Deploy 等边缘平台全面拥抱 Wasm:
// Cloudflare Workers 中调用 Rust/Wasm 模块
import wasm from "./rust-wasm-module.wasm";
export default {
async fetch(request) {
const instance = await wasm();
const result = instance.transform(request);
return new Response(result);
}
};边缘计算选择 Wasm 的原因很明确:在数千个节点上分发小型 Wasm 模块,比维护完整的容器运行时成本低得多。
Wasm 生态工具链
2023 年,开发者工具链也有了长足进步:
| 工具 | 说明 |
|---|---|
| wasm-pack | Rust → Wasm 的标准构建工具,2023 年支持 WASI 0.2 |
| wasmtime | 最流行的 Wasm 运行时,由 Bytecode Alliance 维护 |
| wasmer | 高性能运行时,支持插件系统和包管理器 |
| WASI 0.2 | 2023 年发布的 WASI 标准重大更新,完善了文件 I/O、网络等系统接口 |
| wit-bindgen | 从 WIT 接口定义自动生成多语言绑定 |
WASI(WebAssembly System Interface)是 Wasm 在浏览器外运行的关键——它为 Wasm 模块提供了文件、网络、时钟等系统调用接口。WASI 0.2 是 2023 年的里程碑版本,首次实现了完整的 sockets API。
值得关注的项目
WasmEdge
由 CNCF 托管的 Wasm 运行时,支持 TensorFlow 等 AI 框架的模型推理:
# 在 WasmEdge 中运行 AI 推理
wasmedge --dir .:. inference.wasm --model mobilenet.tflite --image cat.jpgKrustlet
在 Kubernetes 中直接运行 Wasm 模块的 kubelet 实现:
# 部署一个 Wasm 工作负载到 Kubernetes
kubectl run my-wasm-app --image=wasm-app:v1Krustlet 让 K8s 集群中的节点可以原生调度 Wasm 模块,无需容器运行时。
Spin
Fermyon 推出的全栈 Wasm 应用框架:
# 快速开发 Wasm Web 应用
spin new --template http-rust hello-world
cd hello-world && spin build && spin up挑战与局限
尽管 2023 年 Wasm 发展迅猛,但仍有一些关键挑战:
- 多线程支持不完善:Wasm 的线程提案(threads & atomics)仍不是所有环境都支持
- 调试工具偏弱:相比原生二进制,Wasm 的调试体验还差一截
- 标准库碎片化:不同运行时对 WASI 的支持程度不一
- I/O 性能瓶颈:WASI 的 I/O 抽象层有一定开销,高频 I/O 场景仍有优化空间
- 学习曲线:需要理解 Wasm 的编译模型和宿主绑定方式
前景展望
展望 2024 年及以后,Wasm 的几个确定性趋势:
- Component Model 落地:Wasm 组件模型将实现多语言模块的互操作——用 Rust 写核心逻辑,用 Python 写胶水代码,编译成统一的 Wasm 组件
- WASI 1.0 正式发布:系统接口标准化后,Wasm 在服务端的生态将加速成熟
- AI/ML 推理的标准化运行时:WasmEdge 和 Wasmtime 正在推动 Wasm 作为 ONNX/TensorFlow 的推理运行时
- 边缘原生开发:越来越多的边缘计算框架默认使用 Wasm 作为部署单元
总结
2023 年的 WebAssembly 可以用一句话概括:“来自浏览器,但服务于全栈”。它在 Serverless、边缘计算、插件系统三个赛道上找到了明确的生态位,WASI 0.2 的发布和 Component Model 的推进为未来奠定了基础。如果你正在设计需要安全隔离、多语言互操作、快速启动的应用,Wasm 值得在 2024 年的技术选型中认真考虑。
| 关键要点 | 一句话 |
|---|---|
| 浏览器端 | Wasm-GC 到来,更丰富的应用可以编译到 Web |
| 服务端 | Serverless 函数的最佳运行时,启动微秒级 |
| 边缘计算 | 轻量分发,CDN 节点的新一代计算单元 |
| 插件系统 | Envoy、数据库、应用扩展均采用 Wasm |
| 生态状态 | WASI 0.2 发布,工具链日趋成熟,CNCF 接纳多个 Wasm 项目 |