是否可以将Web API与WebAssembly一起使用?如果是这样,怎么样?我对导航器接口更感兴趣。
是的,这是可能的。
使用WebAssembly工具链时,如何调用JavaScript API,取决于该特定工具链。这实际上是FFI的一种形式:从C 代码中,看起来您正在调用外部功能,但是工具链桥接到嵌入式器(这里是浏览器的JavaScript)。一些例子:
- c with emscripten
- sdl2
- html5.h
- OpenGl/webgl/OpenGL ES/OpenGL ES 2.0
- Unity脚本
emscripten之类的工具链会自动为WebAssembly.instantiate
生成importObject
(以及.html
和.js
文件)/大多数内部WebAssembly详细信息通常被隐藏(我在下面记录下来)。
此设计使您可以调用任何JavaScript代码,而不仅仅是JavaScript API。因此,您可以从WebAssembly调用自己的JavaScript代码。工具链简单地使处理通用的Web API集变得更容易,有时以跨平台的方式,例如SDL2执行音频,键盘,鼠标,操纵杆和图形。
内部详细信息
WebAssembly的JavaScript API允许您将importObject
传递给WebAssembly.Instantiate
构造函数和WebAssembly.instantiate
函数:
new Instance(moduleObject [, importObject])
Promise<{module:WebAssembly.Module, instance:WebAssembly.Instance}>
instantiate(BufferSource bytes [, importObject])
WebAssembly二进制格式包含一个导入部分,您(通过LLVM等编译器)声明将使用的导入。这些导入的字段中的每一个都在importObject
中查找,并且可以通过WebAssembly的call
和call_indirect
OPCODE调用功能。
您可以调用任意JavaScript,又可以调用所需的任何Web API。将来,WebAssembly可能会获得允许嵌入器直接暴露API的功能,在浏览器嵌入中,可能包括DOM,Canvas,Events等。