问题标签 [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.

0 投票
0 回答
686 浏览

reactjs - 如何使用 Rust 在 webview 中加载 WASM 模块?

我正在尝试在webview中托管一个 React 应用程序,它使用已编译的 Rust -> WebAssembly 模块。

我收到此错误:

WASM 模块在以下组件之一中被调用:

然后我使用 webpack 将它全部打包。

然后我在 webview 中加载它:

JavaScript 调试器中的错误导致这行代码:

0 投票
2 回答
2322 浏览

rust - 是否可以在 WebAssembly 中使用 Rust 进行动态链接?

我正在使用 wasm-bindgen 在 Rust 中为 web 制作图灵完备的 DSL。我希望能够从 Web 下载任意 WASM 代码,然后在我的 DSL 中使用该文件中的函数。dlopen我想到的是某种具有等价物的动态链接。

我不知道如何实际实现这一点。

通过阅读WebAssembly 文档,我得到的印象是它确实应该是可能的,但我没有足够的知识来理解本文档中的过程细节。

wasm-bindgen 参考中有一详细说明了如何从 WebAssembly 模块内部实例化 WebAssembly 模块!,但这似乎是通过 JavaScript 实现的,这似乎不是最理想的,而不是 WebAssembly 文档所描述的。

在 js-sys 中,可以从任意字符串创建 JavaScript 函数,但这本质上是Function(/* some arbitrary string */)从 JavaScript 端调用的,这似乎不是最理想的,而不是 WebAssembly 文档所描述的。

是否有可能或有其他更合适的方式来实现我的目标?

0 投票
1 回答
731 浏览

rust - Cloudflare Workers 中的 WebAssembly 实例化内存不足

我正在使用 Rust 构建一个 WebAssembly 模块,以在 Cloudflare Workers 中使用,通过wasm-bindgen. 该模块总体上非常基础;它有一个名为 的函数process,它将两个二进制文件(由两个 Uint8BitArray 表示)和一个 json_value(由 解释serde)作为输入,并产生 None 或字符串,通常是这样的。

实例化 WebAssembly 模块的胶水代码与wasm-bindgen --no-modules命令几乎相同,我只将第 93 行的初始化条件更改为true

我使用cloudworker试用了整个脚本,它运行没有问题。然后,我使用Preview Service API尝试了相同的脚本,并且它在几次尝试中运行良好,直到它开始抛出错误:

这发生在实例化时,无论发送的请求如何(初始化后发生的事情不是 .

我一直在尝试精简我的 Webassembly 脚本,但即使是 hello-world 类型的函数也被拒绝了。我不知道如何调试,这与胶水代码,锈代码或Cloudflare的预览服务有关吗?

0 投票
1 回答
2434 浏览

webpack - Rust/Wasm:找不到模块:错误:无法解析“env”

我正在尝试将这个箱子的包装器移植到 wasm 中。我目前的工具链是:

  • wasm包
  • 网页包
  • wasm-bindgen

关于构建系统的更多信息:

在我的 rust crate(这是一个--libcrate)中,我只调用wasm-pack build --target browser. 这将创建一个pkg包含 wasm blob 和相关 js 文件的文件夹。这里没有编译器的抱怨。

然后,在里面pkg,我跑npm link(只跑一次)。

然后,cargo generate --git https://github.com/rustwasm/wasm-pack-template创建所需的 Web 应用样板。在此命令生成的文件夹中,我运行npm link schnorrkel-js以使其可见。npm run start运行 webpack 开发服务器。

绑定简单计算函数和警报等初始测试工作正常。

当我开始使用提到的板条箱(示例)中的一些(不是任何)功能时,一切都会中断。不幸的是,我收到的错误消息信息量不大,根本没有帮助:

这是什么原因?我有一个强烈的猜测,一些底层功能不能移植到 wasm,但究竟是哪一个,为什么,以及错误消息试图说什么?


笔记:

  • 我正在使用最新的 rust nightly 版本 ( rustc 1.34.0-nightly (d17318011 2019-02-07))

  • 其余的设置步骤直接取自Rust 和 Webassembly 书

  • 货运.toml

示例代码:

0 投票
2 回答
1363 浏览

webassembly - 如何倾倒wasm?

我发现您可以在 chrome 中以开发人员模式查看 wasm 模块,并且我还在这里找到了一个 chromium 标志,但是我想使用不同的浏览器来转储 wasm 文件。我怎么做?

0 投票
2 回答
659 浏览

unit-testing - 如何比较 Rust 代码中两个 JsValue 的值?

在 JavaScript 中,我可以这样做:

在编译为 Wasm 的 Rust 中,我尝试了类似的方法:

它引发了一些wasm-pack test --chrome关于 no partialeqforJsString的错误 - 结果是JSON::stringify

如果我尝试转换为字符串并以其他方式进行比较(例如直接使用JsString方法),我总是会遇到相同的编译错误。

如果我尝试直接比较这个数组,我在 JavaScript 中有类似的行为:

Cargo.toml我有:

我该如何进行这种比较?

编辑。

我想出了这样的东西来通过这个测试:

0 投票
2 回答
763 浏览

javascript - 使用 Blob 中的 Wasm 模块热加载 Web Audio worklet 处理器时出现 DOMException?

我正在尝试使用 Emscripten 从 C++ 代码转译的 Wasm 模块导入加载动态 Web 音频工作集。

我想在内存中操作工作集代码,使用 Blob 创建对象,将它们作为模块注入音频工作集,并热交换它们。

我遵循了 web-audio-samples 解决方案中建议的设计模式来实现将作为 Wasm 模块导入工作集的工作集。当处理器代码在文件中时,这似乎工作得很好。

在没有外部 Wasm 模块导入的情况下从内存中热加载和交换工作集似乎也很有效。

这就是我为 Blob 创建代码的方式。为了说明,我使用了 simple-kernel.wasmmodule.js,它使用与 web-audio-samples 中的 Wasm 设计模式示例相同的 Emscripten 配置进行编译。

这就是我如何使用带有 Blob 的代码来创建一个对象并将其加载到工作集中。

我希望这可以像没有 Wasm 导入的处理器一样工作,或者当我从文件加载它们时。如果在 worklet 构造函数和处理方法中注释模块导入和模块代码,它可以工作。

但是,使用 Wasm 导入热加载工作集似乎不起作用......当我尝试这样做时,我得到“加载工作集时出错:DOMException”并且没有其他线索。

我怀疑这可能有点幼稚,并且可能需要更复杂的操作,例如动态导入......

我创建了一个 web-audio-samples 解决方案的分支,我在其中添加了一个小示例项目 ( wasm-hot-loading ),它创建了说明问题的条件。

它可以在这里找到:https ://github.com/mimic-sussex/web-audio-samples/tree/master/audio-worklet/design-pattern/wasm-hot-loading

任何人都可以帮助阐明问题可能是什么以及这是否可行?

谢谢

0 投票
2 回答
402 浏览

typescript - Rust WebAssembly 自定义元素内存释放错误

我的第一个 Rust 生成的 WASM 产生了以下错误,我不知道如何进行调试。

上下文:最新的 Chrome,从 TypeScript 自定义元素调用的 Rust wasm-bindgen 代码,在影子 DOM 中的画布上操作。渲染到画布的数据来自 HTML5 AudioBuffer。所有 rust 变量都是局部作用域的。

如果文档中只出现一个实例,则 Web 组件可以完美运行,但如果我进一步实例,则会像上面那样转储堆栈跟踪。代码运行没有任何其他问题。

我知道 Chrome 中存在突出的内存错误——它们看起来像这样吗,或者有经验的 rust/wasm 开发人员可以告诉我这是否不寻常?

rust 代码很小,只是将 AudioBuffer 的两个通道渲染到提供的 HTMLCanvasElement:

我试过注释掉功能,如果代码没有触及画布但做了上述,我得到了错误。进行以下更改会导致简单的“内存不足”错误。音频文件为 1,200 k。

编辑:后一个out of memory错误,对于上面的正确代码,真的让我失望,但它实际上是一个Chrome 错误

0 投票
0 回答
1547 浏览

rust - 如何处理来自 Result 的 Rust 错误作为返回值,而不是在 JavaScript 中抛出异常?

我想像这样编写 JavaScript:

看来,如果我使用标准Result类型,那么我需要使用try/ catch

产生错误的 Rust 代码:

这是基于rust-parcel-template中的示例。带有 Rust + WASM + JS 的完整 web 应用程序以及上面的小示例位于GitHub 上

0 投票
1 回答
1598 浏览

rust - 什么是元组变体?(了解编译器错误消息)

使用wasm_bindgenwith serde,我正在尝试JsValue使用惯用的 rust 返回一个复杂结构。我创建了一个孤立的示例来说明我看到的错误。

结构声明:

函数定义:

我得到这个编译错误:

您可以查看基于rust-parcel-template的完整示例

要重现错误,请从 repo 的根目录运行npm run startcd crate && cargo build