使用 Assemblyscript 将类从 WebAssembly 导出到 JavaScript?

Posted

技术标签:

【中文标题】使用 Assemblyscript 将类从 WebAssembly 导出到 JavaScript?【英文标题】:Exporting classes from WebAssembly to JavaScript with Assemblyscript? 【发布时间】:2019-10-25 20:38:41 【问题描述】:

我正在尝试使用 Assemblyscript 将 TypeScript 编译为 WebAssembly,并且我正在尝试从 WebAssembly 导出一个类,以便它可以在 javascript 中使用。澄清一下,我希望能够在 .js 文件中构造该类的新实例,即使该类是在 .wasm 中定义的。

我已经做了一些研究和实验,似乎 Assemblyscript 会将类方法导出为函数,而不是作为一个整体导出类。

这就是我希望它在 WebAssembly 方面的外观:

export class Point 
  public x: i32;
  public y: i32;

  constructor(x: i32, y: i32) 
    this.x = x; 
    this.y = y;
  

这就是我想在 JavaScript 端完成的事情:

// Omitted code for instatiating the Wasm Module

var exports = object.instance.exports; // The exports of the Wasm instance
var Point = exports.Point; // The Point class

let point = new Point(0, 0) // Construct a new Point

所以我想知道是否有人知道实现此(或至少类似)功能的方法?

【问题讨论】:

【参考方案1】:

我设法找到了解决方案,并认为我应该将其发布在这里。 AssemblyScript 的主要作者(至少我是这么认为的)编写了一个加载器,它是我一开始没有找到的项目的一部分。

可以在这里找到: https://github.com/AssemblyScript/assemblyscript/tree/master/lib/loader

这里有一个关于如何使用它来将类从 Wasm 导出到 JavaScript 的简短指南: https://github.com/AssemblyScript/docs/blob/master/basics/loader.md

【讨论】:

【参考方案2】:

WebAssembly 有一个非常基本的类型系统,它只有四种数字类型。为了将最基本的类型(如字符串)编译为 WebAssembly,需要创建相当多的“胶水代码”(在字符串的情况下,数据是通过线性内存交换的)。

实现您所描述的目标是可能的,但需要创建 AssemblyScript 目前能够生成的更多“胶水代码”。

【讨论】:

谢谢,我想我需要为此手动生成一些胶水代码。我已经使用 Rust 导出了这样的类,并尝试查看 Rust 的 wasm-pack 生成的胶水代码。我感到很迷茫,所以我希望有人能指出我正确的方向。

以上是关于使用 Assemblyscript 将类从 WebAssembly 导出到 JavaScript?的主要内容,如果未能解决你的问题,请参考以下文章

将类从 navbar-light 更改为 navbar-dark 隐藏导航栏

将类从asType转换为类 :无法施放

无法将类从一个模块导入到另一个模块 - Scala

如何将类从父组件应用到 Vue.js 功能组件?

将类从 MFC 移植到 C++ 控制台应用程序。使用 /MD[d](CRT dll 版本)构建 MFC 应用程序需要

assemblyScript