gpt4 book ai didi

webassembly - Wasm 访问 DOM

转载 作者:行者123 更新时间:2023-12-03 22:29:39 26 4
gpt4 key购买 nike

有没有办法在没有 JavaScript 的情况下获得对 DOM 和/或 WebAPI(即全屏 API)的读/写访问权限?

我正在尝试用 C 构建一个基本应用程序(C 源代码实际上是从 GC 语言转换的结果)。我正在构建的应用程序将作为桌面应用程序运行(它还不打算在“真实”浏览器中运行),因此我可以在必要时调整环境(即布局引擎)。

最佳答案

这完全取决于编译器的能力。

目前无法直接访问 DOM 或任何其他浏览器 API。也无法将 JavaScript 引用存储在 Wasm 线性内存或 Wasm 表中。也不可能将 JavaScript 引用用作函数参数或返回值。它们只是不存在于 MVP 类型系统中。但是,有引用类型提案,它有朝一日可能成为 Wasm 运行时的一部分,但没有可用的官方发布日期。

那么,Wasm 到 Host Environment 的交互怎么做呢?好吧,事实证明,具有导入和导出功能的 Wasm 模块系统可用于创建仿真层。手动创建这一层很痛苦,因此编译器创建它是一项很好的任务。但是怎么做?

例如,我们想在当前浏览器窗口中设置文档标题。 Wasm 需要访问当前窗口实例,选择文档,并设置它的 title 属性。由于 Wasm 运行时无法访问引用,我们需要在 JS 端创建一个映射表和一些具有映射逻辑的 JS 函数,并将它们导入到 Wasm 模块中。

因此,我们创建了一个名为 getWindow 的函数。此函数获取全局窗口引用,将其放入映射表并返回表中的索引。该索引将作为 Wasm 端的 I32 访问。这个函数被导入到 Wasm 模块中。

现在,我们创建一个名为 getDocumentFromWindow 的函数。此函数获取映射表的索引,并返回另一个索引。该实现从映射表中查找窗口引用并解析其文档属性,并将此文档放入映射表并将该索引返回给 Wasm。这个函数也被导入到 Wasm 模块中。

在 Wasm 方面,我们现在可以通过导入的函数间接操作 Wasm 主机引用。我们的映射表通过整数索引模拟 JS 引用。这是 Wasm Reference Type 提案可能附带的较慢版本。

所以这整个映射逻辑可以由编译器创建。一旦引用类型可用,就可以更改编译器并使用新的类型系统来获得更高效的代码。

如果您想看到这样的编译器在运行,请查看 https://github.com/mirkosertic/Bytecoder .它可以将 JVM 字节码编译为 JavaScript 和 WebAssembly,并为 DOM 和 Browser API 两种方式的交互提供透明的方式。可以从 Wasm 调用 DOM,也可以从 DOM 调用 Wasm,例如实现 click-listeners 和其他很酷的东西,比如与 vue.js 等高级框架的交互。

免责声明:我是 Bytecoder 的发明者,但所描述的逻辑可以适用于任何其他编译器。

关于webassembly - Wasm 访问 DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42628328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com