在没有 '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);
});
}
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);
});
}