如何从node.js使用WebAssembly



我目前正在处理一个个人Node.js(>=8.0(项目,该项目要求我调用C子例程(以提高执行时间(。我正在尝试使用WebAssembly来实现这一点,因为我需要在浏览器中打开最终代码时保持兼容。

我已经使用Emscripten将C代码编译到WebAssembly中,不知道如何继续。

在正确的方向上提供任何帮助都是非常好的。谢谢

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

创建一个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);
});

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

TypeError:WebAssembly实例化:必须存在Imports参数并且必须是对象在正在处理中_tickCallback(internal/process/next_tick.js:188:7(位于Function.Module.runMain(Module.js:695:11(启动时(bootstrap_node.js:19:16(在bootstrap_node.js:612:3

谢谢@sven。(仅翻译(

test.c:

#include <emscripten/emscripten.h>
int EMSCRIPTEN_KEEPALIVE add(int a, int b) {
return a + b;
}

编译:

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

test.js:

const util = require('util');
const fs = require('fs');
var source = fs.readFileSync('./test.wasm');
const env = {
__memory_base: 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(10, 9));
}).catch(e => {
// error caught
console.log(e);
});

相关内容

  • 没有找到相关文章

最新更新