Как загрузить программу cheerp-wasm при отсутствии модуля path? - PullRequest
0 голосов
/ 16 июня 2020

Cheerp имеет цель cheerp-wasm, которая компилирует C ++ как в .js, так и в связанный с ним .wasm файл. Насколько я понимаю, файл .js фактически является загрузчиком для веб-сборки.

Этот загрузчик? вызывает require("path") для импорта необходимых функций файловой системы для загрузки .wasm как файл. Среда, в которой выполняется мой код (Screeps), не предоставляет доступ к этому модулю "path".


[8:39:54 AM][shard3]Error: Unknown module 'path'
                        at Object.requireFn (<runtime>:31712:23)
                        at fetchBuffer (main:10:5)
                        at main:30:1
                        at main:42:3
                        at Object.exports.evalCode (<runtime>:15584:76)
                        at Object.requireFn (<runtime>:31730:28)
                        at Object.exports.run (<runtime>:31673:60)

Как мне загрузить мой код wasm, если загрузчик Cheerp зависит от функциональности, которую я не могу предоставить ?


Хотя Cheerp предоставляет некоторые флаги , которые можно установить, ни один из них не подходит для текущей ситуации.

Могу я намекнуть Cheerp, чтобы он просто позвонил bytecode = require("mycode.wasm") и использовал это? Может быть, Cheerp сможет встроить wasm как байт-код в сам файл. js? Лучше написать свой загрузчик?

1 Ответ

1 голос
/ 17 июня 2020

Cheerp извлекает wasm-файл разными способами в зависимости от среды.

Поддерживаемые среды: браузер, node.js, d8 и js.

Среды узлов предполагают, что есть модуль path для чтения wasm из файловой системы.

Похоже, что он недоступен в вашей среде.

Мы планируем обеспечить большую гибкость при передаче файла wasm в в будущем, но сделать это в общем случае - непростая задача.

А пока я могу предложить обходной путь.

Это текущее определение функции, которая извлекает wasm :

function fetchBuffer(p){
    var b=null,f='function';
    if(typeof fetch===f)b=fetch(p).then(r=>r.arrayBuffer());
    else if(typeof require===f){
        p=require('path').join(__dirname, p);
        b=new Promise((y,n)=>{
            require('fs').readFile(p,(e,d)=>{
                if(e)n(e);
                else y(d);
            });
        });
    }else b=new Promise((y,n)=>{
        y(read(p,'binary'));
    });
    return b;
}

Как видите, сначала он пытается использовать функцию fetch, если она доступна.

Поскольку в вашей среде она кажется неопределенной, вы можете определить ее самостоятельно перед cheerp code и реализуйте его, используя свой require("mycode.wasm").

Пример (не проверено):

function fetch(path) {
  return new Promise((y,n)=> {
    let ret = {
      arrayBuffer: () => {
        return require("mycode.wasm");
      }
    };
    y(ret);

  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...