我正在webassembly.org上运行教程,现在我想从我自己的页面上运行hello.wasm。按照教程的说明,我正在使用埃斯兰编译代码。
在我的index.html中遵循index.html,我正在做:
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, {}))但我知道这个错误:

因此,我尝试在下面的代码中使用来自WebAssembly.instantiate()的MDN文档:
const instantiate = (bytes, imports = {}) =>
WebAssembly.compile(bytes).then(m =>
WebAssembly.instantiate(m, imports)
)我得到了一个不同的:

知道怎么修吗?
发布于 2017-03-09 11:25:10
从您的问题中还不清楚,但是进一步的注释解释说,您将导入对象保留为{},从而导致实例化失败。WebAssembly使用双重命名空间,其中导入对象实现WebAssembly.Module的导入。每个导入都是规定作为module+field+kind,JavaScript导入对象必须实现这一点。
Emscripten已经生成了HTML+JS,它为您加载hello.wasm,包括WebAssembly导入对象。Emscripten生成的内容非常大,因为它模拟了一个操作系统。导入对象提供所有的syscalls (到JavaScript)。你得把这些传递给这个例子才行.或者直接使用已经生成的那些。
您使用的代码需要一个名为env的模块。Emscripten包含代码,如:
let importObject = {
env: { foo: () => 42, bar: () => 3.14 }
};这就是我前面提到的双重命名空间:env是一个模块,foo / bar是字段。他们的类型是function。WebAssembly支持其他类型的导入和导出:表、内存和全局。
缺少单个模块,或模块的字段,或者不匹配这类模块,都会导致正在获取的实例化失败。
发布于 2017-03-08 11:34:14
显然,您的示例模块希望从一个名为"env"的模块中导入一些东西。但是,您提供的imports对象是空的。要成功地实例化模块,需要提供表单{env: {...}}的imports对象,其中点是对应于从"env"生成的每个导入的属性。
https://stackoverflow.com/questions/42668708
复制相似问题