标签: webassembly

是否可以将 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
查看次数

Blazor WASM 项目中的未绑定断点

我无法在 VS 2022 v17.3.6 中调试 WASM 项目以取消绑定断点。断点在不运行时看起来很好,但在运行项目时变成一个空圆圈,里面有警告标志。消息是 \xe2\x80\x9c当前不会命中断点。未绑定断点\xe2\x80\x9d。可以调试同一解决方案中的其他项目。团队中的三名开发人员有此问题,其中一名没有。现在所有的 VS 都使用相同版本。我们尝试了稍旧版本的VS 2022(v17.3.4),它也有这个问题。

\n

以下是我尝试使用其他帖子中的许多建议来解决问题的几种方法。

\n\n

c# breakpoints webassembly blazor

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

是否可以在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
查看次数

如何将 WebAssembly 编译为常规汇编/本机代码(或 Cpp 等)?

有很多关于从 C++ 或 Rust 等语言编译WebAssembly 的信息,Fe 有很多关于 LLVM 到 Wasm 的搜索结果,但是 WASM 到 LLVM 呢?

但是有没有办法WebAssembly 编译为常规汇编(或其他“本机”语言,如 C++ 或 ASM)?

请注意,这不是如何将 javascript 转换为 LLVM IR?的重复内容。。这个问题不是关于将 JavaScript 转换为本机代码,而是关于将 WebAssembly 转换为本机代码(fe 本机机器代码)。JavaScript 和 WebAssembly 是不同的东西。

c c++ assembly llvm webassembly

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

在 npm 上发布 wasm 库的首选方式是什么?

有没有一种在 npm 上发布使用 wasm 二进制文件的库的好方法?

到目前为止,我遇到了几个问题。理想情况下,我想要的东西是:

  • 对用户完全透明。他们可以简单地npm install打包,然后import {my_function} from my_package,甚至不必担心包是否使用 wasm 二进制文件。

  • 与所有主要的资产捆绑器兼容。无论用户使用webpackrollupparcel还是其他东西,他都不需要配置任何东西来打包我的 wasm 文件,将它与其他资产一起分发,并使其可从我的库中访问。

  • 高效。理想情况下,WASM文件将内联一个js文件中,以便它可以被解析并以流方式编译。这一点不如其他点重要,但是能够利用 wasm 提供的所有速度会很好。

javascript package npm webassembly

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

如何在 create-react-app 中使用 WebAssembly (wasm)

我使用名为sax-wasm 的create-react-app库。稍微修改网络的示例代码我得到了这个:wasm

import { SaxEventType, SAXParser } from 'sax-wasm';

async function loadAndPrepareWasm() {
  const saxWasmResponse = await import('sax-wasm/lib/sax-wasm.wasm');
  const saxWasmbuffer = await saxWasmResponse.arrayBuffer();
  const parser = new SAXParser(SaxEventType.Attribute | SaxEventType.OpenTag, {
    highWaterMark: 64 * 1024,
  });

  const ready = await parser.prepareWasm(new Uint8Array(saxWasmbuffer));
  if (ready) {
    return parser;
  }
}

loadAndPrepareWasm().then(console.log);
Run Code Online (Sandbox Code Playgroud)

当我运行yarn start命令时,我的构建失败了:

Failed to compile.

./node_modules/sax-wasm/lib/sax-wasm.wasm
Module parse failed: magic header not detected
File was processed with these loaders:
 * ./node_modules/file-loader/dist/cjs.js
You may need …
Run Code Online (Sandbox Code Playgroud)

webpack webassembly create-react-app

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

没有 Emscripten,如何用标准库将 C++ 编译成 WebAssembly

我在构建独立的 webassembly 时遇到了问题,我想要完全控制内存和布局。我不想使用 emscripten 因为,正如下面的帖子所说,它没有给我我想要的所有编译时选项(例如堆栈大小控制,能够选择在独立模式下导入内存等。 ) 我一直在关注以下页面:如何使用 emscripten 生成独立的 webassembly 此外,emscripten 是矫枉过正。

到目前为止我所做的:我有一个通过自制软件下载的完全可用的 llvm 9 工具链(我在 macos 10.14 上。)我正在关注https://aransentin.github.io/cwasm/https:// depth-first.com/articles/2019/10/16/compiling-c-to-webassembly-and-running-it-without-emscripten/ 我使用 wasi 来获取 C 标准库。使用链接器标志,就像-Wl,-z,stack-size=$[1024 * 1024]我可以控制堆栈大小一样。编译成功。伟大的!

但是,我需要使用 C++ 标准库来支持我自己的一些和其他第三方库。据我所知,似乎没有任何简单的方法可以获得 libc++ 和 libc++abi。

我尝试了一个“hack”,我下载了 Emscripten 并让它构建了自己的 libc++ 和 libc++abi 文件。然后我尝试将这些文件和标题复制到正确的位置。然后我收到了关于缺少线程 API 的错误消息,这显然是由于没有使用 EMSCRIPTEN 编译造成的。所以我定义了EMSCRIPTEN宏并且这样工作。然后我想也许我可以删除 wasi 依赖项并使用 emscripten 的 libc 版本来保持一致,但随后也存在冲突/缺少标头。

简而言之,我想我已经接近我需要去的地方了,但事情变得非常混乱。我怀疑我采用了最简单的非脚本方法。

有没有人成功地为独立的 webassembly 创建了一个构建系统,让您可以使用 c 和 c++ 标准库?

编辑:

这是我现在拥有的超级 hacky 构建脚本(它是我在网上找到的东西的大量修改版本):

DEPS = 
OBJ = library.o
STDLIBC_OBJ = $(patsubst %.cpp,%.o,$(wildcard stdlibc/*.cpp)) …
Run Code Online (Sandbox Code Playgroud)

c++ compilation llvm-clang webassembly

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

Webassembly:可能有共享对象吗?

我想知道是否可以使用 C(或 C++ 或 Rust)和 javascript 对共享数据对象执行 CRUD 操作。使用最基本的示例,这里将是一个示例或每个操作:

#include <stdio.h>
typedef struct Person {
    int age;
    char* name;
} Person;

int main(void) {

    // init
    Person* sharedPersons[100];
    int idx=0;

    // create
    sharedPersons[idx] = (Person*) {12, "Tom"};

    // read
    printf("{name: %s, age: %d}", sharedPersons[idx]->name, sharedPersons[idx]->age);

    // update
    sharedPersons[idx]->age = 11;

    // delete
    sharedPersons[idx] = NULL;

}
Run Code Online (Sandbox Code Playgroud)

然后,我希望能够在 Javascript 中做完全相同的事情,并且都能够写入同一个共享sharedPersons对象。这怎么可能?或者设置是否需要类似于“主从”,其中一个只需要将信息传递给另一个,然后主执行所有相关操作?我希望有一种方法可以对 webassembly 中的共享数据对象进行 CRUD,任何帮助将不胜感激。

作为参考:https : //rustwasm.github.io/wasm-bindgen/contributing/design/js-objects-in-rust.html

javascript c c++ rust webassembly

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