在 node.js 中运行 .wasm 文件

7 node.js webassembly

我读过很多关于在 node.js 中运行 wasm 文件的文章。每当我测试代码时,它都会抛出此错误

[TypeError: WebAssembly.instantiate(): Import #0 module="wasi_snapshot_preview1" 错误:模块不是对象或函数]

然后它不会在结果中显示任何内容。我正在使用此代码:

const sp = {
  env: {
    memoryBase: 0,
    tableBase: 0,
    memory: new WebAssembly.Memory({
      initial: 256
    }),
    table: new WebAssembly.Table({
      initial: 0,
      element: 'anyfunc'
    })
  },
  imports: {
    imported_func: arg => {
      console.log(arg);
    }
  }
}

const fs = require('fs')
, wasm = WebAssembly.instantiate(new Uint8Array(fs.readFileSync('./test.wasm')), sp)
.then(result => console.log(result));
Run Code Online (Sandbox Code Playgroud)

此代码抛出上述错误。

有什么我做错了吗?

解决方案:

我的代码没有任何问题,而是我编译代码的方式有问题。而不是使用

em++ test.cpp -o test.wasm
Run Code Online (Sandbox Code Playgroud)

我应该用过:

em++ -O1 test.cpp -o test.wasm -s WASM=1
Run Code Online (Sandbox Code Playgroud)

bds*_*bds 8

更改test.wasmtest.js应该也有效:

em++ -O1 test.cpp -o test.js -s WASM=1
Run Code Online (Sandbox Code Playgroud)

使用 .wasm 作为输出类型或-s STANDALONE_WASM需要运行时wasi_snapshot_preview1支持。


Col*_*inE 2

报错如下:

[TypeError: WebAssembly.instantiate(): Import #0 module="wasi_snapshot_preview1" 错误:模块不是对象或函数]

这表明您的 WebAssembly 模块test.wasm正在等待名为 的导入wasi_snapshot_preview1,这是实例化它所必需的。这与 Node 环境无关,您会在浏览器中看到相同的错误。

您如何构建和编译 WebAssembly 模块?此导入表明您正在使用 WASI。

我建议从一个更简单的 WebAssembly 示例开始。

  • 我所做的就是在我的 wasm 代码的 main 函数中返回 0 。我正在使用此命令来构建我的 wasm:`em++ test.cpp -o test.wasm` (7认同)