Как использовать WebAssembly с Node.js

Я получил этот код из ссылки 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.info(util.inspect(result, true, 0));
  console.info(result.instance.exports._add(9, 9));
}).catch(e => {
  // error caught
  console.info(e);
});  

Ошибка получения при запуске сервера Node.js с

node Node.js  

LinkError: WebAssembly Instantiation: Import # 3 module = "env" function = "abort" error: для импорта функции требуется вызываемый

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 136
1

Ответы 1

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

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

Другие вопросы по теме