上一篇博客文章概述了 Rust 和 WebAssembly 领域工作组对 Rust 和 WebAssembly 的总体愿景。 在这篇博客文章中,我们将深入探讨 wasm-bindgen 的细节,我们对它的未来愿景,以及您如何帮助我们构建这个未来

wasm-bindgen 促进了 JavaScript 和编译到 WebAssembly 的 Rust 之间的通信。 它允许您使用 Rust 结构体、JavaScript 类、字符串等进行交流,而不仅仅是 WebAssembly 原生调用约定支持的整数和浮点数。您只为使用的部分付费,因此使用 alert 不会引入 requestAnimationFrame 的未用绑定。此外,它旨在支持即将推出的 “主机绑定”提案,该提案将消除 WebAssembly 函数和原生 DOM 函数之间任何 JavaScript shim 函数的需要。这有望实现比 JavaScript 更快的 DOM 访问速度,因为 DOM API 调用可以在 WebAssembly 编译时进行验证,并且不需要在每次调用时进行动态检查。

wasm-bindgen 是一个共享基础

我们正在为一个 Rust 库生态系统构建一个共享基础,这些库使用 wasm-bindgen 针对 JavaScript 环境。共享基础意味着共享原始 extern 导入。每个使用 Web 的 window.requestAnimationFrame 函数或 ECMAScript 的 Object.freeze 函数的库都不需要自己编写 extern 导入。

在同一个地方拥有所有这些 API 的绑定应该使人们更容易编写非常棒的库,例如 基于 postMessage API 构建的 MPSC 通道 和 Web 的其他实用程序库。

共享 ECMAScript 全局 API

通过 wasm_bindgen::js 模块提供在每个 JavaScript 环境中可用的全局 API,如 ECMAScript 标准所定义。例如,Object.freeze 函数可作为 wasm_bindgen::js::Object::freeze 使用。

但我们还没有完成,我们需要更多帮助! 添加更多这些全局 API 绑定是开始使用 wasm-bindgen 的一个好方法,并且可以从各种贡献者那里进行并发拉取请求,从而完成大量工作!

查看 ECMAScript 全局 API 元问题 以提供帮助!

共享 Web API

ECMAScript 的全局 API 并不是故事的结尾 - 我们还需要共享 Web 的 DOM API 的绑定,例如 window.requestAnimationFrameNode.prototype.appendChildWebSocket

Web 的所有 API 类型、函数和方法都使用 WebIDL 指定,因此我们正在为 wasm-bindgen 开发一个新的 WebIDL 前端。当 WebIDL 前端准备就绪时,我们计划从所有标准中获取所有 Web API 的接口定义,并自动从中生成一个大型 -sys 风格的库。

我们所说的“前端”是什么意思?回顾一下上一篇博客文章中对 wasm-bindgen 架构的简化描述。它是一个过程宏,它解析 #[wasm_bindgen] 注解,这些注解描述了 extern JavaScript 导入和要导出到 JavaScript 的 Rust 内容,并将其转换为抽象语法树 (AST)。然后,它遍历 AST 并生成两个结果:用于使用导入的 JavaScript 内容的 Rust 胶水,用于使用导出的 Rust 内容的 JavaScript 胶水。我们将负责将 #[wasm_bindgen] 声明解析为 AST 的代码称为“过程宏前端”。

wasm-bindgen's current architecture

使用 WebIDL 前端,我们引入了一种创建 AST 的新方法:解析 WebIDL 并将其定义转换为 wasm-bindgen 的 AST。使用 WebIDL 前端时,不再涉及 #[wasm_bindgen] 注解或过程宏,但构造 AST 后的其余管道保持不变。

wasm-bindgen's new architecture with a WebIDL frontend

这听起来很酷吗?查看 wasm-bindgen 存储库中标记为“frontend:webidl”的问题,帮助我们构建 WebIDL 前端! WebIDL 前端的代码位于 wasm-bindgen/crates/webidl 中,如果您有任何问题,请随时在 irc.mozilla.org 上的 #rust-wasm 中 ping fitzgen 或在相关问题中发表评论。

特别感谢 @ohanar,他一直在为将各种 WebIDL 结构转换为 wasm-bindgen 的 AST 提供支持而努力!我们需要更多像 @ohanar 这样的人以同样的方式站出来。🙏