22

是否可以将Web API与 WebAssembly 一起使用?如果是这样,怎么做?我对Navigator 界面更感兴趣。

4

1 回答 1

25

是的,有可能。

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

诸如 Emscripten 之类的工具链会自动生成一个importObjectfor WebAssembly.instantiate(以及.html文件.js)/因此大多数内部 WebAssembly 细节通常是隐藏的(我在下面记录它们)。

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

内部细节

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

new Instance(moduleObject [, importObject])

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

WebAssembly二进制格式包含一个导入部分,您可以在其中(通过 LLVM 等编译器)声明它将使用的导入。这些导入的字段中的每一个都在 中查找importObject,并且可以通过 WebAssemblycallcall_indirect操作码调用这些函数。

因此,您可以调用任意 JavaScript,而后者又可以调用您想要的任何 Web API。将来,WebAssembly 可能会获得允许嵌入器直接公开 API 的功能,在嵌入的浏览器中,这可能包括 DOM、画布、事件等。

于 2016-12-01T06:51:30.173 回答