是否可以将Web API与 WebAssembly 一起使用?如果是这样,怎么做?我对Navigator 界面更感兴趣。
1 回答
是的,有可能。
使用 WebAssembly 工具链时如何调用 JavaScript API 取决于特定的工具链。它实际上是 FFI 的一种形式:从 C++ 代码看来,您正在调用一个外部函数,但工具链桥接至嵌入器(此处为浏览器的 JavaScript)。几个例子:
诸如 Emscripten 之类的工具链会自动生成一个importObject
for 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
,并且可以通过 WebAssemblycall
和call_indirect
操作码调用这些函数。
因此,您可以调用任意 JavaScript,而后者又可以调用您想要的任何 Web API。将来,WebAssembly 可能会获得允许嵌入器直接公开 API 的功能,在嵌入的浏览器中,这可能包括 DOM、画布、事件等。