如何从node.js使用WebAssembly?

Che*_*hil 8 node.js emscripten webassembly

我目前正在开发一个个人的Node.js(> = 8.0.0)项目,它要求我调用C子程序(以改善执行时间).我正在尝试使用WebAssembly来执行此操作,因为我需要在浏览器中打开时最终代码兼容.

我使用Emscripten将C代码编译成WebAssembly,并且在此之后不知道如何继续.

任何正确方向的帮助都会很棒.谢谢!

yus*_*ulx 13

您可以在没有JS glue文件的情况下构建.wasm文件(独立).有人回答了类似的问题.

创建一个test.c文件:

int add(int a, int b) {
  return a + b;
}
Run Code Online (Sandbox Code Playgroud)

构建独立的.wasm文件:

emcc test.c -O2 -s WASM=1 -s SIDE_MODULE=1 -o test.wasm
Run Code Online (Sandbox Code Playgroud)

在Node.js应用程序中使用.wasm文件:

const util = require('util');
const fs = require('fs');
var source = fs.readFileSync('./test.wasm');
const env = {
    memoryBase: 0,
    tableBase: 0,
    memory: new WebAssembly.Memory({
      initial: 256
    }),
    table: new WebAssembly.Table({
      initial: 0,
      element: 'anyfunc'
    })
  }

var typedArray = new Uint8Array(source);

WebAssembly.instantiate(typedArray, {
  env: env
}).then(result => {
  console.log(util.inspect(result, true, 0));
  console.log(result.instance.exports._add(9, 9));
}).catch(e => {
  // error caught
  console.log(e);
});
Run Code Online (Sandbox Code Playgroud)

关键部分是WebAssembly.instantiate()的第二个参数.没有它,您将收到错误消息:

TypeError:WebAssembly实例化:Imports参数必须存在,并且必须是在启动时在Function.Module.runMain(module.js:695:11)的process._tickCallback(internal/process/next_tick.js:188:7)处的对象(bootstrap_node.js:191:16)在bootstrap_node.js:612:3

  • 获取`LinkError:WebAssembly实例化:导入#0 module ="env"function ="__ memory_base"错误:全局导入必须是一个数字` (2认同)