标签: webassembly

在 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
查看次数

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
查看次数

如何在Vite中使用嵌入式WebAssembly?

我想使用这个很棒的包:https://github.com/hpcc-systems/hpcc-js-wasm 它将 Web assembly (graphizlib.wasm) 与要使用的 Javascript 函数捆绑在一起。我将其添加为 package.json 中的依赖项。

  "dependencies": {
    "@hpcc-js/wasm": "^1.13.0"
  },
Run Code Online (Sandbox Code Playgroud)

当我现在运行 Vite 开发服务器时,很容易找到 Javascript 代码。但 wasm 不可用。特别是,我收到此错误消息:

Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:3000/graphvizlib.wasm

我不确定如何使嵌入式 Web 程序集可用于我的网站。它位于依赖包中。请参阅 #1,在 node_modules (#2) 中,在 @hpcc-js/wasm/dist 文件夹中 (#3)在此输入图像描述

我也用 Vite 的构建配置尝试过 - 没有访问权限。

webassembly hpcc vite

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

如何从C/C++访问WebAssembly线性内存

我正在编写一个小型C程序,旨在编译为ism w/emcc并在Web浏览器中运行.因为wasm导出的函数只能接受简单的数值作为参数输入和返回值,所以我需要在JavaScript API和编译的WebAssembly代码之间共享内存,以便访问更复杂的数据类型,如字符串或char数组.问题是我不能为我的生活弄清楚如何从我的C程序内部访问WebAssembly线性内存.

我的最终目标是能够在我的C程序中读取在JavaScript中初始化的字符串,然后在Web浏览器的JavaScript代码中读取在我的C程序中修改/初始化的字符串.

这是我正在尝试做的基本示例:

main.js

const importObject = {
  'env': {
    'memoryBase': 0,
    'tableBase': 0,
    'memory': new WebAssembly.Memory({initial: 256}),
    'table': new WebAssembly.Table({initial: 0, element: 'anyfunc'})
  }
}

// using the fetchAndInstantiate util function from
// https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js
fetchAndInstantiate('example.wasm', importObject).then(instance => {

      // call the compiled webassembly main function
      instance.exports._main()
      console.log(importObject.env.memory)
})
Run Code Online (Sandbox Code Playgroud)

example.c

int main() {
    // somehow access importObject.env.memory 
    // so that I can write a string to it
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个问题让我成为了那里的一部分,但是,我仍然不明白如何从我的C代码中的WebAssembly内存缓冲区读/写.

emscripten webassembly

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

如何在 JetBrains CLion 中使用 `cmake` 来编译 Emscripten/WebAssembly?

我正在尝试正确设置JetBrains CLion 2019.1以从C源代码构建WebAssembly。我几乎尝试了所有方法,但是,没有任何效果。我没有得到任何WebAssembly构建。我得到的是:

  • WasmText.js
  • WasmTest.js.mem
  • WasmTest.cbp

当我em++ main.cpp -o out/index.html -s WASM=1 -O3在命令行上运行时,我实际上得到了

  • index.html
  • index.js
  • index.wasm

结果的尺寸也小得多。

我已经使用以下设置设置了构建、执行、部署-> CMake配置:

构建类型

最小相对

工具链

使用默认值:系统

(我曾尝试使用 emscripten sdk 设置我自己的工具链,但是,CLion 对设置执行了一些测试,并抱怨它无法使用em++.

CMake 选项

$EMSCRIPTEN_ROOT$在 CLion 中设置了一个路径变量。我可以确认它可以正常工作,将它传递${EMSCRIPTEN_ROOT}CMakeLists.txtas 参数。

-DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake
-G"Unix Makefiles"
--debug-output
Run Code Online (Sandbox Code Playgroud)

环境

EMSDK=/wrk/dev/emsdk
EMSCRIPTEN=/wrk/dev/emsdk/emscripten/1.37.12
EMSDK_NODE=/wrk/dev/emsdk/node/4.1.1_64bit/bin/node
LLVM_ROOT=/wrk/dev/emsdk/clang/e1.37.12_64bit
BINARYEN_ROOT=/wrk/dev/emsdk/clang/e1.37.12_64bit/binaryen
EMSCRIPTEN_NATIVE_OPTIMIZER=/wrk/dev/emsdk/clang/e1.37.12_64bit/optimizer
EM_CONFIG=/home/webmaster/.emscripten
PATH=/wrk/dev/emsdk:/wrk/dev/emsdk/clang/e1.37.12_64bit:/wrk/dev/emsdk/node/4.1.1_64bit/bin:/wrk/dev/emsdk/emscripten/1.37.12:/bin:/usr/bin:/usr/lib/bin
Run Code Online (Sandbox Code Playgroud)

构建选项

-j 2

(字段为空时自动设置)

源文件

#include <iostream>

int main()
{
  std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ cmake emscripten clion webassembly

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

是否可以将 Web Assembly (wasm) 文件反编译为特定的编程语言?

目前大多数编程语言,都可以编译成 WebAssembly(官方或者通过外部包)。

所以我想知道......是否可以反编译Web程序集文件?那么我们可以用一种语言编写的代码可以编译为.wasm,并使用另一种语言反编译它?然后,生成.java.js.py.go和等,从.wasm文件。是否可以?

webassembly

9
推荐指数
3
解决办法
8650
查看次数

在 Chrome 中调试 WebAssembly

我是 WebAssembly 的新手,但我已经使用它和 Emscripten 大约一个月了,并且对最小的构建工具包相当熟悉。

在调试方面,我发现我找不到如何充分利用 Chrome 和 Firefox 环境。

在 Firefox 68.0.1 中,我的 Source Map 文件加载,我可以将它们正确映射到我的 C/C++ 源文件。

但是,我无法看到本地堆栈。我可以看到所有的局部变量,但是当我逐步执行我的 wasm 代码时,当 FF 显示它时,它将事物推送到我看不到的堆栈中,并且手动跟踪它是一种痛苦。

相比之下,Chrome 76 给了我堆栈,让我添加 Source Map 来查看我的 C/C++ 引用,但我无法让它给我任何类型的 wasm 代码来逐步完成,要么是我自己的垃圾文件,要么自己的拆解版。

我从节点 http-server 或 emscripten emrun 加载的所有 wasm 在 DevTools 的“Sources”选项卡中向我展示了我的源代码,但在 localhost 下还有一个标记为“top/(无域)”的节点。我试过加载一个简单的模块但没有成功。

简单的你好世界演示

我想弄清楚如何在 FireFox 中查看本地堆栈或让 Chrome 向我展示 wasm 反汇编(最好是两者)。Chrome 似乎为 WebAssembly Studio 这样做,我不知道为什么

在此处输入图片说明

google-chrome-devtools emscripten firefox-developer-tools webassembly

9
推荐指数
0
解决办法
794
查看次数

如何满足 wasm 的严格 mime 类型检查?

我得到了一个使用 emscripten 编译的 webassembly 模块。现在我正在尝试使用 expressjs 在网页中提供它。

我已经尝试按照这个要点来通过 webpack 包含 webassembly,包括我发现的一个修改,因为这个要点有点旧。

webpack 看起来像这样:

const path = require('path');

module.exports = {
  optimization: {
    mangleWasmImports: false
  },
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, './dist/'),
    filename: 'dynamic-graph.bundle.js'
  },
  target: "web",
  module: {
    rules: [
      // Emscripten JS files define a global. With `exports-loader` we can 
      // load these files correctly (provided the global’s name is the same
      // as the file name).
      {
        test: /fourd\.js$/,
        loader: "exports-loader"
      },
      // wasm files …
Run Code Online (Sandbox Code Playgroud)

browser webpack server webassembly

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

将现有的 C# 代码编译为 WebAssembly

是否可以将现有的 C# 代码编译为 WebAssembly (.wasm),以便无需或几乎无需更改代码?
我必须为此使用 Blazor 还是其他可能性?

c# webassembly blazor blazor-webassembly

9
推荐指数
2
解决办法
3032
查看次数