目录

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 deploy
use 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.jpg

Krustlet

在 Kubernetes 中直接运行 Wasm 模块的 kubelet 实现:

# 部署一个 Wasm 工作负载到 Kubernetes
kubectl run my-wasm-app --image=wasm-app:v1

Krustlet 让 K8s 集群中的节点可以原生调度 Wasm 模块,无需容器运行时。

Spin

Fermyon 推出的全栈 Wasm 应用框架:

# 快速开发 Wasm Web 应用
spin new --template http-rust hello-world
cd hello-world && spin build && spin up

挑战与局限

尽管 2023 年 Wasm 发展迅猛,但仍有一些关键挑战:

  1. 多线程支持不完善:Wasm 的线程提案(threads & atomics)仍不是所有环境都支持
  2. 调试工具偏弱:相比原生二进制,Wasm 的调试体验还差一截
  3. 标准库碎片化:不同运行时对 WASI 的支持程度不一
  4. I/O 性能瓶颈:WASI 的 I/O 抽象层有一定开销,高频 I/O 场景仍有优化空间
  5. 学习曲线:需要理解 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 项目