因此,在进行了广泛的搜索和阅读之后,我得到了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对象。