标签: wasm-bindgen

如何将一组对象传递给WebAssembly并将其转换为带有wasm-bindgen的结构向量?

可以像这样传递一个整数数组:

const js = import("./webassembly_rust");
let array_nums = [1,2,3,4,5,6,7,8,9];

js.then(js => {
  js.test( array_nums );
}); 
Run Code Online (Sandbox Code Playgroud)

到WebAssembly并将其保存在这样的向量中:

extern crate serde_json;
extern crate wasm_bindgen;

use wasm_bindgen::prelude::*;

#[macro_use]
extern crate serde_derive;

#[wasm_bindgen]
pub fn test(array: JsValue) {
    let elements: Vec<u32> = array.into_serde().unwrap();
}
Run Code Online (Sandbox Code Playgroud)

也可以像这样传递一个对象:

const js = import("./webassembly_rust");
let jsObject = {name: "hello world", id: "99", parent_id: "11"};

js.then(js => {
  js.test( jsObject );
}); 
Run Code Online (Sandbox Code Playgroud)

到WebAssembly并将其保存为这样的Element结构:

extern crate serde_json;
extern crate wasm_bindgen;

use wasm_bindgen::prelude::*;

#[macro_use]
extern crate serde_derive;

#[derive(Serialize, Deserialize)] …
Run Code Online (Sandbox Code Playgroud)

rust webassembly serde wasm-bindgen

11
推荐指数
1
解决办法
1709
查看次数

如何将闭包转换为 js_sys::Function?

如何将本地闭包转换为js_sys::Function

我想做这样的事情:

let canvas = document.get_element_by_id("canvas").unwrap();
let e: web_sys::HtmlElement = canvas.dyn_into().unwrap();
let f = || {};
e.set_onresize(Some(&f.into()));
Run Code Online (Sandbox Code Playgroud)

rust webassembly wasm-bindgen

11
推荐指数
1
解决办法
2444
查看次数

生成返回字符串的函数时,为什么 wasm-opt 在 wasm-pack 构建中失败?

我正在为康威的生命游戏学习 Rust WASM 教程

调用文件中最简单的函数之一Universe.render(它用于渲染表示游戏状态的字符串)。当我运行时它会导致错误wasm-pack build

Fatal: error in validating input
Error: failed to execute `wasm-opt`: exited with exit code: 1
  full command: "/home/vaer/.cache/.wasm-pack/wasm-opt-4d7a65327e9363b7/wasm-opt" "/home/vaer/src/learn-rust/wasm-game-of-life/pkg/wasm_game_of_life_bg.wasm" "-o" "/home/vaer/src/learn-rust/wasm-game-of-life/pkg/wasm_game_of_life_bg.wasm-opt.wasm" "-O"
To disable `wasm-opt`, add `wasm-opt = false` to your package metadata in your `Cargo.toml`.
Run Code Online (Sandbox Code Playgroud)

如果我删除该函数,则代码构建时不会出错。如果我用以下函数替换它,构建将失败并出现相同的错误:

pub fn wtf() -> String {
    String::from("wtf")
}
Run Code Online (Sandbox Code Playgroud)

似乎任何返回 a 的函数都会String导致此错误。为什么?

以下是我的全部代码:

mod utils;

use wasm_bindgen::prelude::*;

// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
// …
Run Code Online (Sandbox Code Playgroud)

rust webassembly wasm-bindgen wasm-pack rust-wasm

11
推荐指数
1
解决办法
1252
查看次数

是否可以将 wasm-bindgen 与 webpack 5 一起使用?

我遵循wasm-bindgenHello World 指南(我正在使用)。wasm-bindgen = "0.2.72"

不幸的是,指南中提到的 npm 包并不是最新的。因为我想有一个干净的起点,所以我尝试升级它们。

这是package.json指南中提到的:

{
  "scripts": {
    "build": "webpack",
    "serve": "webpack-dev-server"
  },
  "devDependencies": {
    "@wasm-tool/wasm-pack-plugin": "1.0.1",
    "text-encoding": "^0.7.0",
    "html-webpack-plugin": "^3.2.0",
    "webpack": "^4.29.4",
    "webpack-cli": "^3.1.1",
    "webpack-dev-server": "^3.1.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

我删除了text-encoding(因为我不关心不支持非基于 Chromium 的Edge版本)并升级,@wasm-tool/wasm-pack-plugin没有出现问题:

在职的package.json

{
  "scripts": {
    "build": "webpack",
    "serve": "webpack-dev-server"
  },
  "devDependencies": {
    "@wasm-tool/wasm-pack-plugin": "^1.3.3",
    "html-webpack-plugin": "^3.2.0",
    "webpack": "^4.29.4",
    "webpack-cli": "^3.1.1",
    "webpack-dev-server": "^3.1.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

在职的webpack.config.js

const path = …
Run Code Online (Sandbox Code Playgroud)

rust webpack webassembly wasm-bindgen wasm-pack

11
推荐指数
1
解决办法
3980
查看次数

如何让 webpack 嵌入我的 *.wasm 以在网络工作者中使用?

我有一些 Rust 代码,可以使用wasm-pack和编译为 Web 程序集wasm-bindgen。我想从网络工作集/工作人员调用此代码。整个应用程序最终应该只是一个 *.js 文件,其他所有内容都内联。

这就是我想象的构建过程:

  1. 用于wasm-pack将 Rust 代码编译为 *.wasm 和 *.js 绑定(此步骤效果很好)
  2. 用于webpack构建一个独立的 *.js 文件,我可以将其作为工作集/工作线程加载。*.wasm 必须包含在此文件中。(这一步失败)
  3. 再次使用webpack来构建我的最终应用程序/包,内联步骤 2 中的工作集/工作文件。(此步骤效果很好)

我的问题出在步骤 2 中:我无法将webpack*.wasm 内联到 worklet/worker 文件中。我在我的 webpack 配置中尝试了这个:

entry: {
    worker: {
        import: './src/worker.ts',
        filename: '../lib/worker.js',
    }
},

// ...

module: {
    rules: [
    
        // ...

        {
            test: /\.wasm$/,
            // 1st option: type: 'webassembly/sync',
            // 2nd option: type: 'asset/inline',
        },

        // ...

    ],
},
Run Code Online (Sandbox Code Playgroud)

无论我做什么,webpack …

webpack webassembly wasm-bindgen wasm-pack webpack-5

11
推荐指数
1
解决办法
1万
查看次数

无法执行“中继服务”

我正在研究 Rust 并查看 Yew 框架(Rust 的前端框架)的这些简单说明: https: //yew.rs/docs/tutorial

\n

我按照说明进行操作,直到收到命令

\n
trunk serve --open\n
Run Code Online (Sandbox Code Playgroud)\n

然而,某处出现故障。

\n

这就是我得到的:

\n
trunk serve --open\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的 Cargo.toml 文件:

\n
2022-05-06T19:07:54.087214Z  INFO  starting build\n2022-05-06T19:07:54.087870Z  INFO spawning asset pipelines\n2022-05-06T19:07:54.168329Z  INFO building yew-app\n    Finished dev [unoptimized + debuginfo] target(s) in 0.01s\n2022-05-06T19:07:54.232154Z  INFO fetching cargo artifacts\n2022-05-06T19:07:54.295124Z  INFO processing WASM for yew-app\n2022-05-06T19:07:54.301974Z  INFO downloading wasm-bindgen version="0.2.80"\n2022-05-06T19:07:54.302269Z ERROR \xe2\x9d\x8c error\nerror from HTML pipeline\n\nCaused by:\n    0: error from asset pipeline\n    1: failed downloading release archive\n    2: unsupported architecture\n2022-05-06T19:07:54.302531Z …
Run Code Online (Sandbox Code Playgroud)

rust webassembly wasm-bindgen yew trunk-rs

11
推荐指数
1
解决办法
6346
查看次数

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

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

我不知道如何实际实现这一目标.

通过阅读WebAssembly文档,我得到的印象是它确实应该可行,但我不够了解本文档中的过程细节.

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

在js-sys中,可以从任意字符串创建JavaScript函数,但这实际上是Function(/* some arbitrary string */)从JavaScript端调用,这似乎是次优的,而不是WebAssembly文档描述的内容.

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

rust webassembly wasm-bindgen

10
推荐指数
1
解决办法
433
查看次数

当目标架构是 WASM 时默认启用 Cargo 功能?

我的板条箱的 Cargo.toml 的一部分:

[features]
wasm = ["ed25519-dalek/nightly", "rand/wasm-bindgen", "js-sys"]
Run Code Online (Sandbox Code Playgroud)

当在另一个项目中使用该板条箱并且明确选择“wasm”功能时,这是有效的。

我想仅当目标架构是 WASM 时自动启用此功能。我尝试添加这个:

#[cfg(target_arch = "wasm32")]
default = ["wasm"]
Run Code Online (Sandbox Code Playgroud)

当我针对 WASM 以外的目标进行编译时,“wasm”作为默认值包含在内,如何仅当目标是 WASM 时才将“wasm”设为默认值?

rust rust-cargo wasm-bindgen

10
推荐指数
1
解决办法
4919
查看次数

是否可以在另一个板条箱中定义#[wasm_bindgen]公共结构和函数?

我有一个lib包含大量结构和实现的板条箱。然后我还有另一个叫做web它将核心移植lib到网络上的工具。还有一种api情况是我希望应用程序位于服务器端。

  • myproject-api
  • myproject-lib
  • myproject-web

我不想要的是将所有wasm依赖项添加到lib, 仅在web项目中并将主库的部分内容公开到网络。in#[wasm_bindgen]中定义的结构是否可能?myproject-libmyproject-web

rust wasm-bindgen

10
推荐指数
1
解决办法
1689
查看次数

如何在 WASM (Rust) 中导入 WASM 模块并传递 String 参数

我想按照这个 js-sys 示例从 Wasm 模块内部实例化 Wasm 模块。在示例中,add调用的函数传递 i32 参数。

我创建了一个 hello world 函数,它接受一个字符串作为参数并返回一个字符串。但是,调用此函数不起作用,因为它返回未定义。

通常,wasm bindgen 会生成粘合代码,该代码创建上下文并将字符串放入堆栈中。然而,Rust 不会生成这样的代码。

如何hello在 Rust 中加载并执行 Wasm 中的函数?

导入的_lib.rs
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn add(a: i32, b: i32) -> i32 {
 a + b
}

#[wasm_bindgen]
pub fn hello(name: String) -> String {
 format!("hello {:?}", name).into()
}
Run Code Online (Sandbox Code Playgroud)
main_lib.rs
use js_sys::{Function, Object, Reflect, WebAssembly};
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;
use wasm_bindgen_futures::{spawn_local, JsFuture};

// lifted from the `console_log` example
#[wasm_bindgen]
extern "C" { …
Run Code Online (Sandbox Code Playgroud)

rust webassembly wasm-bindgen

9
推荐指数
1
解决办法
4289
查看次数