如何在Node.js中使用WebAssembly

时间:2018-11-18 20:49:14

标签: node.js webassembly

我是从stackoverflow链接获得此代码的:

How to use WebAssembly from node.js?

创建一个test.c文件:

int add(int a, int b) {
  return a + b;
}  

构建独立的.wasm文件

emcc test.c -O2 -s WASM=1 -s SIDE_MODULE=1 -o test.wasm  

在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);
});  

使用

启动Node.js服务器时收到错误
node Node.js  

LinkError:WebAssembly实例化:导入#3 module =“ env” function =“ abort”错误:函数导入需要可调用的

1 个答案:

答案 0 :(得分:0)

使用您自己的自定义代码加载由脚本生成的SIDE_MODULE会很棘手,因为使用emscripten构建的模块希望由脚本生成的JavaScript托管。如果要使其工作,您将需要提供一个兼容的环境。如果可能更容易删除SIDE_MODULE并用-o <something>.js为您输出js模块的脚本,这将生成wasm文件和一个将其加载的js文件。

如果您确实想继续手写加载代码,则看起来您需要做的第一件事是私有的,并且您要实例化的abortenv函数的实现。您很有可能还会需要其他功能,并且该界面可能会随着脚本的发展而改变。