我们很高兴宣布 第一个 web-sys 仓库发布! 它提供了对所有 Web API 的原始绑定:从 DOM 操作到 WebGL、Web Audio、计时器到 fetch 等等!

大约三个月前,我们概述了 我们对 wasm-bindgen 的愿景:

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

我们观察到 Web 有大量的 API,手动添加对所有 API 的支持将是一项艰巨的任务。但是,所有这些 API 都使用相同的接口定义语言进行标准化,我们意识到我们可以利用这一点来机械地生成一个包含所有 Web API 的仓库。

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

wasm-bindgen 的新架构,带有 WebIDL 前端 wasm-bindgen 的新架构,带有 WebIDL 前端。

这个计划终于在 web-sys 仓库中实现了!我们在 wasm-bindgen 中添加了一个前端,它可以读取 WebIDL 接口定义并输出 wasm-bindgen 的内部抽象语法树 (AST)。这个前端就是 wasm-bindgen-webidl 仓库。一旦我们有了 AST,生成零开销的 Rust 和 JavaScript 粘合代码来进行类型转换和管理函数参数和返回值,就与普通的 #[wasm_bindgen] 注解一样。

使用 WebIDL 机械地生成粘合代码是一个新想法吗?不!这是每个浏览器引擎用来生成 JavaScript 到 C++ 粘合代码(或者在 Servo 的情况下,是 JavaScript 到 Rust)的相同经过实战检验的策略,用于实现这些 API。此外,这是 wasm-bindgen主机绑定提案 向后兼容的另一种方式。主机绑定提案将允许 WebAssembly 直接调用本机 DOM 方法,而无需通过 JavaScript shim,有望最终解锁比 JS DOM 更快的性能,因为来自 wasm 的调用可以在编译时静态验证以进行类型检查,而不是在每次调用时动态验证。该提案建议主机绑定的接口应从 WebIDL 机械地生成,而我们正在做的事情正是如此。

js-sys 仓库已 100% 功能完备!

另一个相关消息是,js-sys 仓库 现在已 100% 功能完备!它包含对每个 ECMAScript API 的原始绑定(这些 API 在 Node.js、Web 和任何其他 JS 环境中都可用)。

web-sys 仓库不同,这些 API 是手动编写的,因为没有 WebIDL 描述这些 API。如果能有 WebIDL 就太好了,因为这样实现 js-sys 仓库会更容易,而且我们还能避免一些错误。我们考虑过使用 TypeScript 前端,但没有优先考虑它,因为 TypeScript 没有描述函数是否会抛出异常。

示例程序

我们有一个不断增长的示例列表,展示了如何将 web-sysjs-syswasm-bindgen 结合使用! 以下程序是这些示例中的一小部分。

一个简单的 2D 画布绘图程序

点击并拖动以绘制!

更多信息和源代码。

一个使用 Web Audio 的 FM 合成器

此示例使用 FM 合成器WebAudio API 以及 web-sys

更多信息和源代码。

朋友 💖

web-syswasm-bindgen-webidl 的贡献者

衷心感谢所有帮助构建 web-sys 仓库和为 wasm-bindgen 构建 Web IDL 前端的人,正是他们让 web-sys 仓库成为可能!

  • afdw
  • Alex Crichton
  • Andrew Chin
  • Anton Danilkin
  • Benjamin Kampmann
  • Ben Merritt
  • Jonathan Kingston
  • Julius Rakow
  • Michael Hoffmann
  • Nick Fitzgerald
  • R. Andrew Ohana
  • Richard Dodd (dodj)
  • Ruben Schmidmeister
  • Sendil Kumar N
  • Stephan Wolski
  • teovoinea
  • twilco
  • Tyler Wilcock
  • YUyz

js-sys 的贡献者

再次感谢所有为 js-sys 仓库做出贡献的人!

  • Alexander Kryvomaz
  • Alex Crichton
  • Andrew Chin
  • Anton Danilkin
  • belfz
  • bokuweb
  • Camille TJHOA
  • Chris Kolodin
  • Craig Disselkoen
  • Danielle Pham
  • data-pup
  • Dimitrii Nemkov
  • Frazer McLean
  • gaurikholkar
  • Herman J. Radtke III
  • Ivan Enderlin
  • Jannik Keye
  • Joel Gallant
  • Johannes Henninger
  • Jonas Trollvik
  • Jonathan Sundqvist
  • Kevin Hoffman
  • kzvi
  • Lachezar Lechev
  • Liigo Zhuang
  • Marcin Baraniecki
  • Mason Stallmo
  • Matias Insaurralde
  • Matt Kraai
  • Matt Long
  • Michael Hoffmann
  • Nick Fitzgerald
  • R. Andrew Ohana
  • robertdurst
  • Roberto Huertas
  • Satoshi Amemiya
  • Sendil Kumar N
  • sepiropht
  • Stephan Renatus
  • Thomas Eizinger
  • Tim Ryan
  • T. Nagasawa
  • Tomohide Takao
  • toversus
  • Tyler Laing
  • Tyler Wilcock
  • xeqlol