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 对象。
所以经过广泛的搜索和阅读,我明白了 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 对象。