是否可以将Web APIs与WebAssembly一起使用?如果是这样,怎么样?我对Navigator interface感兴趣。
答案 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的importObject
和call
操作码,可以在call_indirect
和can be invoked函数中查找每个导入的字段。
因此,您可以调用任意JavaScript,而JavaScript又可以调用您想要的任何Web API。将来,WebAssembly可以gain capabilities which allow the embedder expose APIs directly,在嵌入它的浏览器中可以包括DOM,画布,事件等。