Как использовать WebAssembly с Node.js - PullRequest
0 голосов
/ 18 ноября 2018

Я получил этот код по ссылке stackoverflow:

Как использовать WebAssembly из 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  

Используйте файл .wasm в приложении Node.js:

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 = «env» function = «abort» error: импорт функции требует вызова

1 Ответ

0 голосов
/ 19 ноября 2018

Загрузка сгенерированного emscripten SIDE_MODULE с использованием вашего собственного пользовательского кода будет сложной задачей, поскольку модуль, созданный вами с помощью emscripten, ожидает, что он будет хостом с помощью сгенерированного emscripten JavaScript. Если вы хотите, чтобы это работало, вам нужно предоставить совместимую среду. Если может быть проще удалить SIDE_MODULE и получить команду emscripten, выведите для вас модуль js с -o <something>.js, который сгенерирует как файл wasm, так и файл js, который его загружает.

Если вы хотите продолжать писать код загрузки вручную, похоже, что первое, что вам нужно сделать, - это приватность и реализация функции abort в env, которую вы передаете для создания экземпляра. Скорее всего, вам понадобятся и другие функции, и этот интерфейс может измениться по мере развития emscripten.

...