问题标签 [wasm-bindgen]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rust - 如何将嵌套 Vecs 与 wasm-bindgen 一起使用?
似乎nested Vec
s 不能与 wasm-bindgen 一起使用。那是对的吗?
我的目标是在 Rust 中创建一个可以作为行返回的 Game of Life 网格,而不是Vec
需要 JavaScript 来处理索引的一维网格。我想到的两种解决方法是:
- 在 Rust 中实现一种自定义的“迭代器”,这是一种逐一返回行的方法。
- 将一维数组交给 JavaScript,但在 JavaScript 中编写一个包装器来处理索引并向消费者公开某种迭代器。
我对使用其中任何一个都犹豫不决,因为我希望这个库可以被 JavaScript 和原生 Rust 使用,而且我认为这两个库在纯 Rust 领域都不会非常惯用。还有其他建议吗?
rust - 如何将对象数组传递给 WebAssembly 并使用 wasm-bindgen 将其转换为结构向量?
可以像这样传递整数数组:
到 WebAssembly 并将其保存在这样的向量中:
也可以像这样传递单个对象:
到 WebAssembly 并将其保存为如下Element
结构:
我尝试的下一件事是传递一个对象数组,如下所示:
到 WebAssembly 并将其保存为Element
结构的向量,如下所示:
这可以编译,但是当我运行此代码时,出现错误:
传递一个充满数字的对象数组,如下所示:
Element
当结构仅包含u32
值时,可以使用 WebAssembly 。
似乎问题是由结构中的String
类型引起的Element
。
我做错了什么?
我找到了以下文章,但在其中找不到我的问题的解决方案:
-
这解释了如何将 JavaScript 对象转换为结构,而不是如何将对象数组转换为结构向量。
-
这个 crate 允许在 Rust 中使用 JavaScript 类型,如数组或对象,但这不是我想要的。我想将 JavaScript 值转换为对应的 Rust。据我所知,这个 crate 只允许在 Rust 中使用 JavaScript 内联......而且这不如仅使用 Rust 快。
compilation - 有没有办法在编译 rust 时有条件地编译 wasm_bindgen 属性?
我最近一直在阅读Rust Wasm Book。在其中,它wasm_bindgen
通过#[wasm_bindgen]
注释来利用。在第 5.5 节“调试”中,提到了以下内容:
请注意,为了在没有编译器和链接器错误的情况下运行 #[test]s,您需要注释掉 wasm-game-of-life/Cargo.toml 中的 crate-type = "cdylib" 位。
#[wasm-bindgen]
它同样建议在运行基准测试时在下一节中注释掉方法/结构的属性。
要为此添加更复杂的部分,在复杂的 wasm 应用程序中有这样的部分:
我还需要注释掉这些部分,以便让代码在本地运行。
当然,这看起来非常乏味。我的问题是是否有办法通过编译器(或通过货物脚本)自动完成这项工作,以便我可以指定一个命令,例如cargo build
or cargo test
,它将本机编译(禁用属性),也许还有什么喜欢cargo build --feature=wasm
在启用 wasm_bindgen 的情况下进行构建。
我考虑编写一个单独的build.rs
脚本,将所有源代码和Cargo.toml
文件复制到一个中间目录(因此您的源代码不会就地修改),自己进行注释,然后从这个源代码构建。当然,这里的问题是 1)构建脚本正在编辑您的源代码,因此行号将被关闭,并且 2)它看起来不干净 - 一种解决这个问题的 hacky 方法。
我想知道其他人是否有我可以使用的建议或他们使用过的东西,因为这似乎是非常可取的行为。
rust - 使用 wasm-bindgen 时,如何解决无法导出具有生命周期的函数的问题?
我正在尝试编写一个在浏览器中运行的简单游戏,考虑到浏览器、rust 和 wasm-bindgen 施加的限制组合,我很难对游戏循环进行建模。
浏览器中的典型游戏循环遵循以下一般模式:
如果我要在 rust/wasm-bindgen 中模拟这个精确的模式,它看起来像这样:
与 javascript 不同,我无法main_loop
从自身内部引用,所以这不起作用。
有人建议的另一种方法是遵循生命游戏示例中说明的模式。在高层次上,它涉及导出一个包含游戏状态的类型,并包括可以从 javascript 游戏循环中调用的公共tick()
和函数。render()
这对我不起作用,因为我的游戏状态需要生命周期参数,因为它实际上只是包装了规范 World
和Dispatcher
结构,后者具有生命周期参数。最终,这意味着我无法使用#[wasm_bindgen]
.
我很难找到解决这些限制的方法,并且正在寻找建议。
rust - 如何通过 WebAssembly 将 Rust 闭包返回给 JavaScript?
关于closure.rs的评论非常棒,但是我不能让它从WebAssembly 库返回一个闭包。
我有这样的功能:
在那个函数里面我做了一个闭包,假设Closure::wrap
是拼图的一部分,并从closure.rs复制):
我如何返回这个回调,start_game
应该ClosureTypeHere
是什么?
这个想法是start_game
创建本地可变对象——比如相机,JavaScript 端应该能够调用 Rust 返回的函数以更新该相机。
rust - 如何将宏属性应用于单独模块中定义的函数?
我有兴趣使用wasm-bindgen
viarust-webpack-template
将 Rust 代码编译为 WebAssembly。但是,我想避免直接用#[wasm_bindgen]
属性宏直接包装我的代码,以便我可以从生成的 WebAssembly 接口中分离出功能逻辑,以更好地组织我的项目。相反,我希望将绑定生成放在单独的文件中,例如:
我知道这#[wasm_bindgen]
是一个宏属性,它在通常遵循的函数定义的 AST 上运行,但是有没有一种方法可以将该宏应用于其他地方定义的代码?
javascript - 在 WebAssembly 中写入文件
我有以下一段C
代码要编译成WebAssembly
.
所以我使用下面的命令来生成一个wasm
文件和对应的js
文件:
但是,当我尝试使用 JS 引擎(如v8
)来执行这段代码时,我根本找不到生成的输出。我也没有收到任何错误:
所以根据我的理解,wasm
代码需要利用JS
一些与系统相关的功能,比如 I/O 相关的操作符。也许不允许在这个浏览器环境中“操纵”文件系统?因为通常浏览器内部发生的事情应该留在浏览器中。
所以我写信询问将文件 I/O 相关的 C 程序迁移到WebAssembly
环境中的最佳实践。任何评论将不胜感激。谢谢。
rust - FromWasmAbi 没有为 fn(SomeStruct) 实现,而 SomeStruct 是 #[wasm_bindgen]
我定义了 3 个结构和两种类型
所有 3 个结构都是wasm_bindgen
并且类型不能标记为wasm_bindgen
. 但是类型只是接受结构并返回的函数void
当我添加wasm_bindgen
时,Game
impl
我收到以下错误
那是因为new
具有以下签名
在我看来,转换类型应该很简单,因为它们是接受wasm_bindgen
结构的函数,但事实并非如此
这是一个错误还是我错过了什么?
完整的代码在这里。
javascript - 使用 web-sys 而不是普通的旧 JavaScript 是否有性能提升?
我曾经wasm-bindgen
编写过一个非常基本的 JS/Wasm webapp,其中将灰度转换(用 Rust 编写)应用于 webapp 用户通过 an 上传<input type="file">
并显示在<canvas>
.
这样做,我必须将图像加载到 WebAssembly 内存空间中,对每个像素应用转换,然后将结果返回到内存空间中,以便 JS 处理显示:
web-sys
如果我使用crate 中定义的 web 的 API 绑定,我想我可以避免将东西来回复制到内存空间的整个过程,从fetch
文件到灰度图片的显示。
这就是我感到困惑的地方:在性能方面,使用web-sys
它的 web 的 API 绑定而不是全部用 JavaScript 进行是否有好处?好吧,我想有,但它在哪里?
rust - 如何创建返回借用值的函数?
我有以下函数作为 Rust WASM 应用程序的一部分,用于将Box
ed 闭包转换为 JavaScript 函数的 Rust 表示。
但是,编译器抱怨返回值使用了借来的值(通过 获得callback.borrow()
),因此无法返回。
因此,我决定添加生命周期注释以通知编译器这个新引用应该与输入一样长。
不幸的是,这没有帮助,我得到了同样的错误。我在这里做错了什么?