在没有 'path' 模块的情况下如何加载 cheerp-wasm 程序?

How do I load a cheerp-wasm program in absence of a 'path' module?

Cheerp 有一个 cheerp-wasm 目标,可以将 C++ 编译成 .js 及其关联的 .wasm 文件。我的理解是 .js 文件实际上是 webassembly 的加载器。

loader 调用 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)

如果 Cheerp 加载程序依赖于我无法提供的功能,我该如何加载我的 wasm 代码?


虽然Cheep提供了可以设置的some flags,但是none似乎适用于当前的情况。

我可以暗示 Cheerp 直接调用 bytecode = require("mycode.wasm") 并使用它吗? 也许 Cheerp 可以将 wasm 作为字节码嵌入 .js 本身? 我应该改为编写自己的加载器吗?

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代码前自己定义,用你的require("mycode.wasm").

实现

示例(未测试):

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

  });
}