【发布时间】:2017-04-15 16:51:18
【问题描述】:
是否可以将Web APIs 与 WebAssembly 一起使用?如果是这样,怎么做?我对Navigator interface更感兴趣。
【问题讨论】:
标签: webassembly
是否可以将Web APIs 与 WebAssembly 一起使用?如果是这样,怎么做?我对Navigator interface更感兴趣。
【问题讨论】:
标签: webassembly
是的,有可能。
如何在使用 WebAssembly 工具链时调用 JavaScript API 取决于特定的工具链。它实际上是 FFI 的一种形式:从 C++ 代码看来,您正在调用一个外部函数,但工具链桥接至嵌入器(此处为浏览器的 JavaScript)。几个例子:
诸如 Emscripten 之类的工具链会自动为 WebAssembly.instantiate(以及 .html 和 .js 文件)生成一个 importObject/因此大多数内部 WebAssembly 细节通常是隐藏的(我在下面记录它们)。
这种设计允许您调用任何 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 的 call 和 call_indirect 操作码在 importObject 和函数 can be invoked 中查找每个导入的字段。
因此,您可以调用任意 JavaScript,而后者又可以调用您想要的任何 Web API。将来,WebAssembly 可能会gain capabilities which allow the embedder expose APIs directly,在浏览器中嵌入这可能包括 DOM、画布、事件等。
【讨论】: