我在webassembly.org上运行教程,现在我想从我自己的页面运行hello.wasm
。
我按照教程的说明使用Emscripten编译代码。
在我的index.html
中关注these instructions:
const instantiate = (bytes, imports = {}) =>
WebAssembly.compile(bytes).then(m =>
new WebAssembly.Instance(m, imports)
)
fetch('hello.wasm')
.then(response => response.arrayBuffer())
.then(bytes => instantiate(bytes, {}))
但是我收到了这个错误:
所以我尝试使用MDN docs中的WebAssembly.instantiate()
代码:
const instantiate = (bytes, imports = {}) =>
WebAssembly.compile(bytes).then(m =>
WebAssembly.instantiate(m, imports)
)
我得到另一个:
知道怎么解决吗?
答案 0 :(得分:3)
您的问题并不清楚,但进一步的评论解释说您将导入对象保留为{}
,导致实例化失败。 WebAssembly使用双重命名空间,import object满足WebAssembly.Module
的{{3}}。每个导入都是imports作为模块+字段+种类,JavaScript导入对象必须满足。
Emscripten已生成HTML + JS,为您加载hello.wasm
,包括WebAssembly导入对象。 Emscripten生成的内容非常大,因为它模拟了操作系统。导入对象提供所有系统调用(到JavaScript)。您必须传递这些以使示例工作...或者只使用已生成的Emscripten。
您正在使用的代码需要一个名为env
的模块。 Emscripten包含以下代码:
let importObject = {
env: { foo: () => 42, bar: () => 3.14 }
};
这是我之前提到的双重命名空间:env
是一个模块,foo
/ bar
是字段。他们的类型是function
。 WebAssembly支持其他类型的导入和导出:table,memory和global。
缺少单个模块,模块的字段或类型不匹配会导致实例化失败。
答案 1 :(得分:1)
显然,您的示例模块想要从名为"env"
的模块导入某些内容。但是,您提供的imports
对象为空。要使模块的实例化成功,您需要提供{env: {...}}
形式的导入对象,其中点是与"env"
的每个导入相对应的属性。