2016-12-01 139 views

回答

15

是的,这是可能的。

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

工具链如Emscripten自动生成importObjectWebAssembly.instantiate(与沿和.js文件)/大多数内部WebAssembly细节因此通常隐藏(我在下面记录它们)。

本设计允许您调用任何JavaScript代码,而不仅仅是JavaScript API。因此,您可以从WebAssembly调用您自己的JavaScript代码。工具链简化了处理常用Web API集的过程,有时也是以跨平台的方式处理的。 SDL2可以处理音频,键盘,鼠标,操纵杆和图形。

内部细节

WebAssembly的​​允许您通过an importObjectWebAssembly.Instantiate构造和WebAssembly.instantiate功能:

new Instance(moduleObject [, importObject]) 

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

的WebAssembly binary format包含import section,你(通过编译器如LLVM)申报它将使用的进口。在importObject以及通过WebAssembly的callcall_indirect操作码的函数can be invoked中查找每个导入的字段。

因此,您可以调用任意JavaScript,然后调用任何您想要的Web API。未来,WebAssembly可能会在gain capabilities which allow the embedder expose APIs directly的嵌入式浏览器中包含DOM,canvas,events等。