所以经过广泛的搜索和阅读,我得到了web_sys
板条箱的用途和它的作用,但我仍然不知道它是如何做到的。
我的印象是,WebAssembly代码不能直接调用JS或访问其对象/方法。我的理解有误吗?如果没有,web_sys
如何调用WebGL/Canvas/DOM方法?
另外,更实际的问题。与仅使用 JS 调用相比,使用web_sys
的开销是多少(如果有的话(?
我的印象是,WebAssembly代码不能直接调用JS或访问它的对象/方法。我的理解有误吗?
你在这里的理解是错误的。WebAssembly 模块可以从其主机环境导出和导入函数。通过从JS主机环境导入函数,WebAssembly模块能够调用JavaScript函数。
但是,这里有一个问题 - WebAssembly 只有数字类型。为了以更丰富的类型(字符串、数组、对象(与 JavaScript 通信,这些值必须编码为线性内存,线性内存是 WebAssembly 模块和 JavaScript 都可以读取和写入的共享内存。
将类型编码/解码为线性存储器的过程是使用wasm-bindgen
自动化的。你会发现web-sys
利用这个包是为了允许在 Rust 中操作 DOM 对象。