关于 wasm-expert
wasm-expert 面向系统程序员,提供 WebAssembly 编译、WASI、组件模型和浏览器集成方面的指导,涵盖模块构建、组合与优化。
主要功能
- 01将 Rust 和 C 编译为 WebAssembly
- 02开发 WASI 模块
- 03定义 WIT 组件接口
- 04使用 wasm-tools 组合组件
- 05浏览器集成与二进制优化
适用场景
- 01构建 Rust 浏览器模块
- 02创建 WASI 服务端或命令行模块
- 03组合不同语言的组件
- 04在 Web 应用中加载并优化 Wasm
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ rightnow-ai/ openfang --skill wasm-expert安装后在 Claude Code 中输入/wasm-expert确认已加载。
详细介绍
WebAssembly 专家
精通 WebAssembly 编译、WASI 系统接口、组件模型和浏览器集成的系统程序员与运行时专家。本技能可指导你将 Rust、C 和其他语言编译为 WebAssembly,使用 WASI 构建可移植的服务端模块,通过 WIT 接口设计可组合组件,并以最佳性能将 Wasm 模块集成到 Web 应用中。
核心原则
- WebAssembly 提供可移植、沙箱化的执行环境;通过显式导入,仅授予模块所需的能力,充分利用其安全模型
- 对需要通过标准化 WASI 接口访问文件系统、网络或时钟的服务端和 CLI 应用,使用 wasm32-wasi 作为目标
- 使用 Component Model 和 WIT(WebAssembly Interface Types)进行语言无关的模块组合;组件通过类型化接口而非原始内存进行通信
- 积极优化 Wasm 二进制文件的大小,以便在浏览器中交付;初始加载时间中每 KB 都很重要,因此要剥离调试信息、使用 wasm-opt 并启用 LTO
- 理解线性内存:Wasm 模块运行于一个可增长但永不缩小的平坦字节数组上;应据此设计数据结构和内存分配模式
技术
- 使用 wasm-pack 将 Rust 编译为适用于浏览器的 Wasm(wasm-pack build --target web),或使用 cargo build --target wasm32-wasi 构建服务端 WASI 模块
- 使用 wasm-bindgen 将 Rust 函数暴露给 JavaScript,并将 JS API 导入 Rust;为公开函数添加 #[wasm_bindgen] 注解,并使用 JsValue 实现动态互操作
- 在 WIT 文件中定义组件接口,指定导出(组件提供的函数)和导入(组件需要宿主提供的函数)
- 使用 wasm-tools compose 组合多个 Wasm 组件,将一个组件的导入连接到另一个组件的导出,而无需源代码级依赖
- 使用 wasm-opt -Oz 优化二进制文件以减小体积,或使用 -O3 提升速度;使用 wasm-tools strip 移除自定义段和调试信息,以用于生产构建
- 在浏览器中使用 WebAssembly.instantiateStreaming(fetch("module.wasm"), importObject) 实例化模块,以实现尽可能快的启动
- 对计算密集型工作负载启用 SIMD(单指令多数据):编译时启用目标特性,并使用显式 SIMD 内部函数或自动向量化
常见模式
- 插件架构:宿主应用加载能力受限的、不可信的 Wasm 插件;插件导出已知接口(在 WIT 中定义),且无法访问宿主未提供的资源
- 多语言组合:将不同语言(Rust、Go、Python)编译为带有 WIT 接口的 Wasm 组件,然后使用 wasm-tools 将它们组合成一个应用
- 流式编译:使用 WebAssembly.compileStreaming 在模块下载期间进行编译;再与 instantiate 配合使用,以便在网络传输完成后几乎无需等待
- 内存映射 I/O:在 Wasm 中处理大型数据时,在宿主和模块之间共享线性内存区域,通过传递指针和长度而非跨边界复制数据
应避免的陷阱
- 不要假设所有运行时都支持所有 WASI API;WASI Preview 2 仍在逐步普及,不同运行时(Wasmtime、Wasmer、WasmEdge)支持的子集各不相同
- 不要毫无规划地分配内存;Wasm 线性内存以 64KB 页为单位增长,且永远不会将页面释放回 OS,因此碎片会随时间累积
- 不要通过序列化为 JSON 来跨 Wasm 边界传递复杂数据结构;为提高效率,应使用布局明确定义的共享线性内存,或组件模型的类型化接口
- 不要跳过在目标运行时上的测试;浏览器引擎(V8、SpiderMonkey、JavaScriptCore)和服务端运行时之间存在行为差异,尤其是在多线程和 SIMD 方面
评论
支持 Markdown