宣布 web-sys 仓库!
我们很高兴宣布 第一个 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 前端。
这个计划终于在 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-sys
、js-sys
和 wasm-bindgen
结合使用! 以下程序是这些示例中的一小部分。
一个简单的 2D 画布绘图程序
点击并拖动以绘制!
一个使用 Web Audio 的 FM 合成器
此示例使用 FM 合成器 和 WebAudio API 以及 web-sys
。
朋友 💖
对 web-sys
和 wasm-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