4

我正在尝试使用 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

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

4

2 回答 2

2

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

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

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

于 2019-06-17T13:31:46.083 回答
0

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

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

于 2019-06-11T12:37:39.453 回答