web_sys 箱子是如何工作的?

How does the web_sys crate works?

所以经过广泛的搜索和阅读,我明白了 web_sys crate 的用途和作用,但我仍然不知道它是如何做到的。

我有一个印象,WebAssembly 代码不能直接调用 JS 或访问它 objects/methods。我的理解错了吗?如果不是,web_sys 如何调用 WebGL/Canvas/DOM 方法?

另外,比较实际的问题。与仅调用 JS 相比,使用 web_sys 的开销是多少(如果有的话)?

I had an impression, that WebAssembly code cannot directly call JS or access it's objects/methods. Is my understanding wrong?

你的理解有误。 WebAssembly 模块可以从其宿主环境中导出和导入函数。通过从 JS 宿主环境导入函数,WebAssembly 模块可以调用 JavaScript 个函数。

但是,这里有一个问题——WebAssembly 只有数字类型。为了与更丰富类型(字符串、数组、对象)的 JavaScript 通信,这些值必须编码在线性内存中,这是一个 WebAssembly 模块和 JavaScript 都可以读写的共享内存到.

使用 wasm-bindgen 自动将类型编码/解码到线性内存中。你会发现 web-sys 使用这个包来允许在 Rust 中操作 DOM 对象。