如何在没有"路径"模块的情况下加载 cheerp-wasm 程序?

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

本文关键字:情况下 加载 cheerp-wasm 程序 路径 模块      更新时间:2023-10-16

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

此加载程序 调用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 提供了一些可以设置的标志,但似乎没有一个适用于当前坐姿。

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

Cheerp根据环境以不同的方式检索wasm文件。

支持的环境包括:浏览器、node.js、d8 和 js。

节点环境假定有一个用于从文件系统读取 wasm 的path模块。

这似乎在您的环境中不可用。

我们计划在未来传递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);
});
}