rust - web_sys 板条箱是如何工作的?
问题描述
因此,经过广泛的搜索和阅读,我得到web_sys
了 crate 的用途和作用,但我仍然不知道它是如何做到的。
我有一个印象,WebAssembly 代码不能直接调用 JS 或访问它的对象/方法。我的理解错了吗?如果没有,如何web_sys
调用 WebGL/Canvas/DOM 方法?
另外,更实际的问题。web_sys
与仅 JS 调用相比,使用的开销是多少(如果有的话) ?
解决方案
我有一个印象,WebAssembly 代码不能直接调用 JS 或访问它的对象/方法。我的理解错了吗?
你这里的理解是错误的。WebAssembly 模块可以从其宿主环境中导出和导入函数。通过从 JS 宿主环境导入函数,WebAssembly 模块能够调用 JavaScript 函数。
但是,这里有一个问题——WebAssembly 只有数字类型。为了使用更丰富的类型(字符串、数组、对象)与 JavaScript 进行通信,这些值必须编码在线性内存中,这是 WebAssembly 模块和 JavaScript 都可以读取和写入的共享内存。
将类型编码/解码到线性存储器的过程是使用wasm-bindgen
. 你会发现web-sys
使用这个包来允许在 Rust 中操作 DOM 对象。
推荐阅读
- python - 如何更准确地划分大数
- php - Api 请求与邮递员和 resteasy 一起工作,但在 php curl 中不工作
- vhdl - 这种 VHDL 状态机设计方法的缺点是什么?
- python - 计数器无法正常工作
- c# - 计算大数的乘积
- javascript - 我的 AngularJS 路由正在向 URL 添加额外的输入
- python - 如何从函数返回元组并垂直打印它们?
- java - Java对String数组的ArrayList进行排序
- ios - 从 Swift UI 测试调用类 Objective C 时出错未定义符号
- angular - HttpClient错误处理程序中的角度调用自定义函数