【问题标题】:How do I load a cheerp-wasm program in absence of a 'path' module?在没有“路径”模块的情况下如何加载cheerp-wasm 程序?
【发布时间】:2020-06-17 16:41:18
【问题描述】:

Cheerp 有一个 cheerp-wasm 目标,它将 C++ 编译为 .js 及其关联的 .wasm 文件。我的理解是.js 文件实际上是 web 程序集的加载器。

这个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 代码?


虽然 Cheerp 提供了可以设置的 some flags,但似乎没有一个适用于当前情况。

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

【问题讨论】:

    标签: javascript c++ screeps cheerp


    【解决方案1】:

    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 函数(如果可用)。

    由于它似乎在您的环境中未定义,您可以在欢呼代码之前自己定义它,并使用您的require("mycode.wasm") 实现它。

    示例(未测试):

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

    【讨论】:

    • Screeps 玩家注意事项:不要在 require()s 后面加上 .wasm 后缀。 Screeps 不期望也不处理这个。
    猜你喜欢
    • 2019-09-26
    • 1970-01-01
    • 2014-07-11
    • 2019-11-06
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    相关资源
    最近更新 更多