首页 > 解决方案 > web_sys 板条箱是如何工作的?

问题描述

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

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

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

标签: rustwebassembly

解决方案


我有一个印象,WebAssembly 代码不能直接调用 JS 或访问它的对象/方法。我的理解错了吗?

你这里的理解是错误的。WebAssembly 模块可以从其宿主环境中导出和导入函数。通过从 JS 宿主环境导入函数,WebAssembly 模块能够调用 JavaScript 函数。

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

将类型编码/解码到线性存储器的过程是使用wasm-bindgen. 你会发现web-sys使用这个包来允许在 Rust 中操作 DOM 对象。


推荐阅读