使用WebAssembly调用Web API方法

时间:2016-12-01 06:34:41

标签: webassembly

是否可以将Web APIs与WebAssembly一起使用?如果是这样,怎么样?我对Navigator interface感兴趣。

1 个答案:

答案 0 :(得分:20)

是的,这是可能的。

在使用WebAssembly工具链时,如何调用JavaScript API取决于特定的工具链。它实际上是FFI的一种形式:从C ++代码看起来你正在调用外部函数,但工具链与嵌入器(这里是浏览器的JavaScript)桥接。几个例子:

Emscripten等工具链会自动为importObject生成WebAssembly.instantiate(以及.html.js个文件)/因此,大多数内部WebAssembly详细信息通常都是隐藏的(I记录下面的内容。)

此设计允许您调用任何JavaScript代码,而不仅仅是JavaScript API。因此,您可以从WebAssembly调用自己的JavaScript代码。工具链简单地使得更容易处理常见的Web API集合,有时以跨平台的方式,例如, SDL2可以播放音频,键盘,鼠标,操纵杆和图形。

内部详情

WebAssembly的JavaScript API允许您将an importObject传递给WebAssembly.Instantiate构造函数和WebAssembly.instantiate函数:

new Instance(moduleObject [, importObject])

Promise<{module:WebAssembly.Module, instance:WebAssembly.Instance}>
    instantiate(BufferSource bytes [, importObject])

WebAssembly binary format包含import section,您(通过LLVM等编译器)声明它将使用的导入。通过WebAssembly的importObjectcall操作码,可以在call_indirectcan be invoked函数中查找每个导入的字段。

因此,您可以调用任意JavaScript,而JavaScript又可以调用您想要的任何Web API。将来,WebAssembly可以gain capabilities which allow the embedder expose APIs directly,在嵌入它的浏览器中可以包括DOM,画布,事件等。